From 011aacb08ecf70c5d4ad1d6976c32a734846ef79 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Tue, 23 Mar 2010 22:05:46 +0000 Subject: [PATCH] Implement -trace-save. * mi-cmds.h (mi_cmds_trace_save): Declare. * mi-cmds.c (mi_cmds): Register -trace-save. * mi/mi-main.c (mi_cmd_trace_save): New. * remote.c (remote_save_trace_data): Take const parameter. * target.h (struct target_ops::to_save_trace_data): Take const parameter. * target.c (update_current_target): Adjust to the above. * tracepoint.c (trave_save): New, extracted from (trace_save_command): ...this. (tfile_trace_find): Remove message that is unnecessary now that 'tfind' reports found frame. * tracepoint.h (trace_save): Declare. --- gdb/ChangeLog | 17 ++++++++++++ gdb/mi/mi-cmds.c | 1 + gdb/mi/mi-cmds.h | 1 + gdb/mi/mi-main.c | 26 ++++++++++++++++++ gdb/remote.c | 2 +- gdb/target.c | 2 +- gdb/target.h | 2 +- gdb/tracepoint.c | 69 +++++++++++++++++++++++++++++------------------- gdb/tracepoint.h | 2 ++ 9 files changed, 92 insertions(+), 30 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a50604d0fc1..21a1c382042 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2010-03-24 Vladimir Prus + + Implement -trace-save. + + * mi-cmds.h (mi_cmds_trace_save): Declare. + * mi-cmds.c (mi_cmds): Register -trace-save. + * mi/mi-main.c (mi_cmd_trace_save): New. + * remote.c (remote_save_trace_data): Take const parameter. + * target.h (struct target_ops::to_save_trace_data): Take + const parameter. + * target.c (update_current_target): Adjust to the above. + * tracepoint.c (trave_save): New, extracted from + (trace_save_command): ...this. + (tfile_trace_find): Remove message that is unnecessary now + that 'tfind' reports found frame. + * tracepoint.h (trace_save): Declare. + 2010-03-24 Vladimir Prus Implement -trace-find. diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index f43069808c9..92311e8b470 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -109,6 +109,7 @@ struct mi_cmd mi_cmds[] = { "trace-define-variable", { NULL, 0 }, mi_cmd_trace_define_variable }, { "trace-find", { NULL, 0 }, mi_cmd_trace_find }, { "trace-list-variables", { NULL, 0 }, mi_cmd_trace_list_variables }, + { "trace-save", { NULL, 0 }, mi_cmd_trace_save }, { "trace-start", { NULL, 0 }, mi_cmd_trace_start }, { "trace-status", { NULL, 0 }, mi_cmd_trace_status }, { "trace-stop", { NULL, 0 }, mi_cmd_trace_stop }, diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index 32e0ec44d48..5954aef1824 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -92,6 +92,7 @@ extern mi_cmd_argv_ftype mi_cmd_thread_select; extern mi_cmd_argv_ftype mi_cmd_trace_define_variable; extern mi_cmd_argv_ftype mi_cmd_trace_find; extern mi_cmd_argv_ftype mi_cmd_trace_list_variables; +extern mi_cmd_argv_ftype mi_cmd_trace_save; extern mi_cmd_argv_ftype mi_cmd_trace_start; extern mi_cmd_argv_ftype mi_cmd_trace_status; extern mi_cmd_argv_ftype mi_cmd_trace_stop; diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index b016436f6f5..340ac68ef6c 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -2210,6 +2210,32 @@ mi_cmd_trace_find (char *command, char **argv, int argc) } } +void +mi_cmd_trace_save (char *command, char **argv, int argc) +{ + int target_saves = 0; + char *filename; + + if (argc != 1 && argc != 2) + error (_("Usage: -trace-save [-r] filename")); + + if (argc == 2) + { + filename = argv[1]; + if (strcmp (argv[0], "-r") == 0) + target_saves = 1; + else + error (_("Invalid option: %s"), argv[0]); + } + else + { + filename = argv[0]; + } + + trace_save (filename, target_saves); +} + + void mi_cmd_trace_start (char *command, char **argv, int argc) { diff --git a/gdb/remote.c b/gdb/remote.c index d041288d107..bb19b723c61 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -9583,7 +9583,7 @@ remote_get_trace_state_variable_value (int tsvnum, LONGEST *val) } static int -remote_save_trace_data (char *filename) +remote_save_trace_data (const char *filename) { struct remote_state *rs = get_remote_state (); char *p, *reply; diff --git a/gdb/target.c b/gdb/target.c index bd5711f19a1..24d29850348 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -836,7 +836,7 @@ update_current_target (void) (int (*) (int, LONGEST *)) return_zero); de_fault (to_save_trace_data, - (int (*) (char *)) + (int (*) (const char *)) tcomplain); de_fault (to_upload_tracepoints, (int (*) (struct uploaded_tp **)) diff --git a/gdb/target.h b/gdb/target.h index 46f5e7ed3de..9e87440ae3e 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -653,7 +653,7 @@ struct target_ops location pointed to by VAL, else returning 0. */ int (*to_get_trace_state_variable_value) (int tsv, LONGEST *val); - int (*to_save_trace_data) (char *filename); + int (*to_save_trace_data) (const char *filename); int (*to_upload_tracepoints) (struct uploaded_tp **utpp); diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 02992604195..aab57d7c383 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -2405,13 +2405,15 @@ trace_dump_command (char *args, int from_tty) extern int trace_regblock_size; -static void -trace_save_command (char *args, int from_tty) +/* Save tracepoint data to file named FILENAME. If TARGET_DOES_SAVE is + non-zero, the save is performed on the target, otherwise GDB obtains all + trace data and saves it locally. */ + +void +trace_save (const char *filename, int target_does_save) { - char **argv; - char *filename = NULL, *pathname; - int target_does_save = 0; struct cleanup *cleanup; + char *pathname; struct trace_status *ts = current_trace_status (); int err, status; FILE *fp; @@ -2424,25 +2426,6 @@ trace_save_command (char *args, int from_tty) gdb_byte buf[MAX_TRACE_UPLOAD]; int written; - if (args == NULL) - error_no_arg (_("file in which to save trace data")); - - argv = gdb_buildargv (args); - make_cleanup_freeargv (argv); - - for (; *argv; ++argv) - { - if (strcmp (*argv, "-r") == 0) - target_does_save = 1; - else if (**argv == '-') - error (_("unknown option `%s'"), *argv); - else - filename = *argv; - } - - if (!filename) - error_no_arg (_("file in which to save trace data")); - /* If the target is to save the data to a file on its own, then just send the command and be done with it. */ if (target_does_save) @@ -2458,13 +2441,13 @@ trace_save_command (char *args, int from_tty) target is losing, we can get out without touching files. */ status = target_get_trace_status (ts); - pathname = tilde_expand (args); + pathname = tilde_expand (filename); cleanup = make_cleanup (xfree, pathname); fp = fopen (pathname, "w"); if (!fp) error (_("Unable to open file '%s' for saving trace data (%s)"), - args, safe_strerror (errno)); + filename, safe_strerror (errno)); make_cleanup_fclose (fp); /* Write a file header, with a high-bit-set char to indicate a @@ -2576,8 +2559,41 @@ trace_save_command (char *args, int from_tty) perror_with_name (pathname); do_cleanups (cleanup); +} + +static void +trace_save_command (char *args, int from_tty) +{ + int target_does_save = 0; + char **argv; + char *filename = NULL; + struct cleanup *back_to; + + if (args == NULL) + error_no_arg (_("file in which to save trace data")); + + argv = gdb_buildargv (args); + back_to = make_cleanup_freeargv (argv); + + for (; *argv; ++argv) + { + if (strcmp (*argv, "-r") == 0) + target_does_save = 1; + else if (**argv == '-') + error (_("unknown option `%s'"), *argv); + else + filename = *argv; + } + + if (!filename) + error_no_arg (_("file in which to save trace data")); + + trace_save (filename, target_does_save); + if (from_tty) printf_filtered (_("Trace data saved to file '%s'.\n"), args); + + do_cleanups (back_to); } /* Tell the target what to do with an ongoing tracing run if GDB @@ -3426,7 +3442,6 @@ tfile_trace_find (enum trace_find_type type, int num, } if (found) { - printf_filtered ("Found traceframe %d.\n", tfnum); if (tpp) *tpp = tpnum; cur_offset = offset; diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h index b9555b78485..723baa2401a 100644 --- a/gdb/tracepoint.h +++ b/gdb/tracepoint.h @@ -184,4 +184,6 @@ extern void tfind_1 (enum trace_find_type type, int num, ULONGEST addr1, ULONGEST addr2, int from_tty); +extern void trace_save (const char *filename, int target_does_save); + #endif /* TRACEPOINT_H */ -- 2.30.2