From f224b49dcd9afdff4cc97bbb6d88dec3b4dfc433 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Tue, 23 Mar 2010 21:46:33 +0000 Subject: [PATCH] -trace-start/-trace-end/-trace-status. * mi/mi-cmds.c (mi_cmds): Register -trace-start, -trace-status and -trace-stop. * mi/mi-cmds.h (mi_cmd_trace_start, mi_cmd_trace_status) (mi_cmd_trace_stop): Declare. * mi/mi-main.c (mi_cmd_trace_start, mi_cmd_trace_status) (mi_cmd_trace_stop): New. * tracepoint.c (start_tracing): New, extracted from... (trace_start_command): ...this. (trace_status_mi): New. * tracepoint.h (struct trace_status): Document stopping_tracepoint. (start_tracing, stop_tracing, trace_status_mi): Declare. --- gdb/ChangeLog | 17 +++++++ gdb/mi/mi-cmds.c | 3 ++ gdb/mi/mi-cmds.h | 3 ++ gdb/mi/mi-main.c | 20 ++++++++ gdb/tracepoint.c | 118 ++++++++++++++++++++++++++++++++++++++++++----- gdb/tracepoint.h | 7 +++ 6 files changed, 156 insertions(+), 12 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dbab38897c..ebd9041023 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2010-03-24 Vladimir Prus + + -trace-start/-trace-end/-trace-status. + + * mi/mi-cmds.c (mi_cmds): Register -trace-start, -trace-status + and -trace-stop. + * mi/mi-cmds.h (mi_cmd_trace_start, mi_cmd_trace_status) + (mi_cmd_trace_stop): Declare. + * mi/mi-main.c (mi_cmd_trace_start, mi_cmd_trace_status) + (mi_cmd_trace_stop): New. + * tracepoint.c (start_tracing): New, extracted from... + (trace_start_command): ...this. + (trace_status_mi): New. + * tracepoint.h (struct trace_status): Document + stopping_tracepoint. + (start_tracing, stop_tracing, trace_status_mi): Declare. + 2010-03-24 Vladimir Prus Implement creating tracepoints with -break-insert. diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index 7f18d94293..c2183fbe3e 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -105,6 +105,9 @@ struct mi_cmd mi_cmds[] = { "thread-info", { NULL, 0 }, mi_cmd_thread_info }, { "thread-list-ids", { NULL, 0 }, mi_cmd_thread_list_ids}, { "thread-select", { NULL, 0 }, mi_cmd_thread_select}, + { "trace-start", { NULL, 0 }, mi_cmd_trace_start }, + { "trace-status", { NULL, 0 }, mi_cmd_trace_status }, + { "trace-stop", { NULL, 0 }, mi_cmd_trace_stop }, { "var-assign", { NULL, 0 }, mi_cmd_var_assign}, { "var-create", { NULL, 0 }, mi_cmd_var_create}, { "var-delete", { NULL, 0 }, mi_cmd_var_delete}, diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index 20bdbfdc4b..702dd9e61e 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -88,6 +88,9 @@ extern mi_cmd_argv_ftype mi_cmd_target_file_delete; extern mi_cmd_argv_ftype mi_cmd_thread_info; extern mi_cmd_argv_ftype mi_cmd_thread_list_ids; extern mi_cmd_argv_ftype mi_cmd_thread_select; +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; extern mi_cmd_argv_ftype mi_cmd_var_assign; extern mi_cmd_argv_ftype mi_cmd_var_create; extern mi_cmd_argv_ftype mi_cmd_var_delete; diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 4e31c72472..c30e0e5349 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -51,6 +51,7 @@ #include "inferior.h" #include "osdata.h" #include "splay-tree.h" +#include "tracepoint.h" #include #include @@ -2077,3 +2078,22 @@ print_diff (struct mi_timestamp *start, struct mi_timestamp *end) timeval_diff (start->utime, end->utime) / 1000000.0, timeval_diff (start->stime, end->stime) / 1000000.0); } + +void +mi_cmd_trace_start (char *command, char **argv, int argc) +{ + start_tracing (); +} + +void +mi_cmd_trace_status (char *command, char **argv, int argc) +{ + trace_status_mi (0); +} + +void +mi_cmd_trace_stop (char *command, char **argv, int argc) +{ + stop_tracing (); + trace_status_mi (1); +} diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index dc52ead4eb..5fe456d959 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -1408,15 +1408,9 @@ add_aexpr (struct collection_list *collect, struct agent_expr *aexpr) collect->next_aexpr_elt++; } -/* tstart command: - - Tell target to clear any previous trace experiment. - Walk the list of tracepoints, and send them (and their actions) - to the target. If no errors, - Tell target to start a new trace experiment. */ -static void -trace_start_command (char *args, int from_tty) +void +start_tracing (void) { char buf[2048]; VEC(breakpoint_p) *tp_vec = NULL; @@ -1425,8 +1419,6 @@ trace_start_command (char *args, int from_tty) struct trace_state_variable *tsv; int any_downloaded = 0; - dont_repeat (); /* Like "run", dangerous to repeat accidentally. */ - target_trace_init (); tp_vec = all_tracepoints (); @@ -1465,6 +1457,21 @@ trace_start_command (char *args, int from_tty) current_trace_status()->running = 1; } +/* tstart command: + + Tell target to clear any previous trace experiment. + Walk the list of tracepoints, and send them (and their actions) + to the target. If no errors, + Tell target to start a new trace experiment. */ + +static void +trace_start_command (char *args, int from_tty) +{ + dont_repeat (); /* Like "run", dangerous to repeat accidentally. */ + + start_tracing (); +} + /* tstop command */ static void trace_stop_command (char *args, int from_tty) @@ -1473,7 +1480,7 @@ trace_stop_command (char *args, int from_tty) } void -stop_tracing () +stop_tracing (void) { target_trace_stop (); /* should change in response to reply? */ @@ -1529,7 +1536,6 @@ trace_status_command (char *args, int from_tty) printf_filtered (_("Trace stopped because of disconnection.\n")); break; case tracepoint_passcount: - /* FIXME account for number on target */ printf_filtered (_("Trace stopped by tracepoint %d.\n"), ts->stopping_tracepoint); break; @@ -1581,6 +1587,94 @@ trace_status_command (char *args, int from_tty) printf_filtered (_("Not looking at any trace frame.\n")); } +/* Report the trace status to uiout, in a way suitable for MI, and not + suitable for CLI. If ON_STOP is true, suppress a few fields that + are not meaningful in the -trace-stop response. + + The implementation is essentially parallel to trace_status_command, but + merging them will result in unreadable code. */ +void +trace_status_mi (int on_stop) +{ + struct trace_status *ts = current_trace_status (); + int status; + char *string_status; + + status = target_get_trace_status (ts); + + if (status == -1 && !ts->from_file) + { + ui_out_field_string (uiout, "supported", "0"); + return; + } + + if (ts->from_file) + ui_out_field_string (uiout, "supported", "file"); + else if (!on_stop) + ui_out_field_string (uiout, "supported", "1"); + + gdb_assert (ts->running_known); + + if (ts->running) + { + ui_out_field_string (uiout, "running", "1"); + + /* Unlike CLI, do not show the state of 'disconnected-tracing' variable. + Given that the frontend gets the status either on -trace-stop, or from + -trace-status after re-connection, it does not seem like this + information is necessary for anything. It is not necessary for either + figuring the vital state of the target nor for navigation of trace + frames. If the frontend wants to show the current state is some + configure dialog, it can request the value when such dialog is + invoked by the user. */ + } + else + { + char *stop_reason = NULL; + int stopping_tracepoint = -1; + + if (!on_stop) + ui_out_field_string (uiout, "running", "0"); + + if (ts->stop_reason != trace_stop_reason_unknown) + { + switch (ts->stop_reason) + { + case tstop_command: + stop_reason = "request"; + break; + case trace_buffer_full: + stop_reason = "overflow"; + break; + case trace_disconnected: + stop_reason = "disconnection"; + break; + case tracepoint_passcount: + stop_reason = "passcount"; + stopping_tracepoint = ts->stopping_tracepoint; + break; + } + + if (stop_reason) + { + ui_out_field_string (uiout, "stop-reason", stop_reason); + if (stopping_tracepoint != -1) + ui_out_field_int (uiout, "stopping-tracepoint", + stopping_tracepoint); + } + } + } + + + if ((int) ts->traceframe_count != -1) + ui_out_field_int (uiout, "frames", ts->traceframe_count); + if ((int) ts->buffer_size != -1) + ui_out_field_int (uiout, "buffer-size", (int) ts->buffer_size); + if ((int) ts->buffer_free != -1) + ui_out_field_int (uiout, "buffer-free", (int) ts->buffer_free); +} + + void disconnect_or_stop_tracing (int from_tty) { diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h index 9d0d78e20b..2c41cfd72f 100644 --- a/gdb/tracepoint.h +++ b/gdb/tracepoint.h @@ -86,6 +86,8 @@ struct trace_status enum trace_stop_reason stop_reason; + /* If stop_reason == tracepoint_passcount, the on-target number + of the tracepoint which caused the stop. */ int stopping_tracepoint; /* Number of traceframes currently in the buffer. */ @@ -167,4 +169,9 @@ extern void merge_uploaded_trace_state_variables (struct uploaded_tsv **utsvp); extern void disconnect_or_stop_tracing (int from_tty); +extern void start_tracing (void); +extern void stop_tracing (void); + +extern void trace_status_mi (int on_stop); + #endif /* TRACEPOINT_H */ -- 2.34.1