From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6384 invoked by alias); 5 Aug 2009 08:37:36 -0000 Received: (qmail 6371 invoked by uid 22791); 5 Aug 2009 08:37:35 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL,BAYES_00,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 05 Aug 2009 08:37:29 +0000 Received: (qmail 17371 invoked from network); 5 Aug 2009 08:37:27 -0000 Received: from unknown (HELO wind.localnet) (vladimir@127.0.0.2) by mail.codesourcery.com with ESMTPA; 5 Aug 2009 08:37:27 -0000 Subject: [RFA 10/10] Implement -trace-save. To: gdb-patches@sources.redhat.com From: Vladimir Prus Date: Wed, 05 Aug 2009 08:37:00 -0000 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <200908051237.26738.vladimir@codesourcery.com> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-08/txt/msg00068.txt.bz2 - Volodya * 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/mi/mi-cmds.c | 2 +- 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 | 70 +++++++++++++++++++++++++++++++++-------------------- gdb/tracepoint.h | 2 + 8 files changed, 76 insertions(+), 31 deletions(-) diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index b68cdca..096ffb3 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -144,7 +144,7 @@ struct mi_cmd mi_cmds[] = { "trace-find", { NULL, 0 }, mi_cmd_trace_find }, { "trace-frame-number", { NULL, 0 }, NULL }, { "trace-list-variables", { NULL, 0 }, mi_cmd_trace_list_variables }, - { "trace-save", { NULL, 0 }, NULL }, + { "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 75d0bb3..a77a3df 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -88,6 +88,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 52edb80..bc58112 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -1705,6 +1705,32 @@ mi_cmd_trace_list_variables (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) { start_tracing (); diff --git a/gdb/remote.c b/gdb/remote.c index 26f2ca4..c12c9d3 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -9271,7 +9271,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 4d2dedb..0f49d45 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -694,7 +694,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 0ad0493..583b1fa 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -552,7 +552,7 @@ struct target_ops int (*to_trace_find) (enum trace_find_type type, int num, ULONGEST addr1, ULONGEST addr2, int *tpp); 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); int (*to_upload_trace_state_variables) (struct uploaded_tsv **utsvp); LONGEST (*to_get_raw_trace_data) (gdb_byte *buf, diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 8224e7c..592ee7d 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -2323,13 +2323,16 @@ 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; @@ -2340,25 +2343,6 @@ trace_save_command (char *args, int from_tty) #define MAX_TRACE_UPLOAD 2000 gdb_byte buf[MAX_TRACE_UPLOAD]; - 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) @@ -2374,13 +2358,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 @@ -2449,8 +2433,41 @@ trace_save_command (char *args, int from_tty) fwrite (&gotten, 4, 1, fp); 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 @@ -2950,7 +2967,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 18a5da5..3ec02ee 100644 --- a/gdb/tracepoint.h +++ b/gdb/tracepoint.h @@ -167,4 +167,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 */ -- 1.6.3.2