This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[MI tracepoints 4/9] -trace-start/end/status
- From: Vladimir Prus <vladimir at codesourcery dot com>
- To: gdb-patches at sourceware dot org
- Date: Sun, 14 Mar 2010 11:54:07 +0300
- Subject: [MI tracepoints 4/9] -trace-start/end/status
This patch implement a few of tracing commands. The changes
in non-MI codepaths are nothing more than "extract function"
refactoring.
Thanks,
--
Vladimir Prus
CodeSourcery
vladimir@codesourcery.com
(650) 331-3385 x722
commit 8c35f248ff803a25555554c01efdedb459434477
Author: vladimir <vladimir@e7755896-6108-0410-9592-8049d3e74e28>
Date: Thu Aug 6 07:03:19 2009 +0000
-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_traceing, trace_status_mi): Declare.
diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c
index 7f18d94..c2183fb 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 20bdbfd..702dd9e 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 f0b2f32..a422ae3 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 <ctype.h>
#include <sys/time.h>
@@ -2079,3 +2080,23 @@ 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 38f41b7..1c17f03 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -1386,15 +1386,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;
@@ -1403,8 +1397,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 ();
@@ -1440,6 +1432,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)
@@ -1448,7 +1455,7 @@ trace_stop_command (char *args, int from_tty)
}
void
-stop_tracing ()
+stop_tracing (void)
{
target_trace_stop ();
/* should change in response to reply? */
@@ -1504,7 +1511,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;
@@ -1538,6 +1544,91 @@ 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 -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 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");
+
+ gdb_assert (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);
+ }
+ }
+
+ ui_out_field_int (uiout, "frames", ts->traceframe_count);
+
+ ui_out_field_int (uiout, "buffer-size", (int) ts->buffer_size);
+ 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 446b292..2e9193c 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;
int traceframe_count;
@@ -155,4 +157,9 @@ extern struct breakpoint *create_tracepoint_from_upload (struct uploaded_tp *utp
extern void merge_uploaded_tracepoints (struct uploaded_tp **utpp);
extern void merge_uploaded_trace_state_variables (struct uploaded_tsv **utsvp);
+extern void start_tracing (void);
+extern void stop_tracing (void);
+
+extern void trace_status_mi (int on_stop);
+
#endif /* TRACEPOINT_H */