-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.
This commit is contained in:
Vladimir Prus 2010-03-23 21:46:33 +00:00
parent 6534d786b1
commit f224b49dcd
6 changed files with 156 additions and 12 deletions

View File

@ -1,3 +1,20 @@
2010-03-24 Vladimir Prus <vladimir@codesourcery.com>
-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 <vladimir@codesourcery.com>
Implement creating tracepoints with -break-insert.

View File

@ -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},

View File

@ -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;

View File

@ -51,6 +51,7 @@
#include "inferior.h"
#include "osdata.h"
#include "splay-tree.h"
#include "tracepoint.h"
#include <ctype.h>
#include <sys/time.h>
@ -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);
}

View File

@ -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)
{

View File

@ -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 */