From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5089 invoked by alias); 14 Mar 2010 09:01:32 -0000 Received: (qmail 4465 invoked by uid 22791); 14 Mar 2010 09:01:31 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 14 Mar 2010 09:01:26 +0000 Received: (qmail 24319 invoked from network); 14 Mar 2010 09:01:24 -0000 Received: from unknown (HELO wind.localnet) (vladimir@127.0.0.2) by mail.codesourcery.com with ESMTPA; 14 Mar 2010 09:01:24 -0000 From: Vladimir Prus To: gdb-patches@sourceware.org Subject: [MI tracepoints 8/9] -trace-save Date: Sun, 14 Mar 2010 09:01:00 -0000 User-Agent: KMail/1.12.2 (Linux/2.6.31-20-generic-pae; KDE/4.3.2; i686; ; ) MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_iXKnLtb9fVjGmr0" Message-Id: <201003141201.22827.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: 2010-03/txt/msg00494.txt.bz2 --Boundary-00=_iXKnLtb9fVjGmr0 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-length: 117 And yet another command. OK? Thanks, -- Vladimir Prus CodeSourcery vladimir@codesourcery.com (650) 331-3385 x722 --Boundary-00=_iXKnLtb9fVjGmr0 Content-Type: text/x-patch; charset="UTF-8"; name="8-trace-save.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="8-trace-save.diff" Content-length: 7541 commit 044e9d10bb900cd70281e674ac5e434ed438cdad Author: Vladimir Prus Date: Sat Mar 13 16:02:11 2010 +0300 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. diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index f430698..92311e8 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 32e0ec4..5954aef 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 8847ca3..be4450f 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -2218,6 +2218,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) { start_tracing (); diff --git a/gdb/remote.c b/gdb/remote.c index cc1c3d1..e70c600 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 f253ee0..11164e6 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -835,7 +835,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 4da6aee..e1bfc8a 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 5ce8167..22b994b 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -2359,13 +2359,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; @@ -2378,25 +2381,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) @@ -2412,13 +2396,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 @@ -2522,8 +2506,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 @@ -3350,7 +3367,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 40dc4e9..28997a3 100644 --- a/gdb/tracepoint.h +++ b/gdb/tracepoint.h @@ -172,4 +172,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 */ --Boundary-00=_iXKnLtb9fVjGmr0--