-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:
parent
6534d786b1
commit
f224b49dcd
|
@ -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>
|
2010-03-24 Vladimir Prus <vladimir@codesourcery.com>
|
||||||
|
|
||||||
Implement creating tracepoints with -break-insert.
|
Implement creating tracepoints with -break-insert.
|
||||||
|
|
|
@ -105,6 +105,9 @@ struct mi_cmd mi_cmds[] =
|
||||||
{ "thread-info", { NULL, 0 }, mi_cmd_thread_info },
|
{ "thread-info", { NULL, 0 }, mi_cmd_thread_info },
|
||||||
{ "thread-list-ids", { NULL, 0 }, mi_cmd_thread_list_ids},
|
{ "thread-list-ids", { NULL, 0 }, mi_cmd_thread_list_ids},
|
||||||
{ "thread-select", { NULL, 0 }, mi_cmd_thread_select},
|
{ "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-assign", { NULL, 0 }, mi_cmd_var_assign},
|
||||||
{ "var-create", { NULL, 0 }, mi_cmd_var_create},
|
{ "var-create", { NULL, 0 }, mi_cmd_var_create},
|
||||||
{ "var-delete", { NULL, 0 }, mi_cmd_var_delete},
|
{ "var-delete", { NULL, 0 }, mi_cmd_var_delete},
|
||||||
|
|
|
@ -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_info;
|
||||||
extern mi_cmd_argv_ftype mi_cmd_thread_list_ids;
|
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_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_assign;
|
||||||
extern mi_cmd_argv_ftype mi_cmd_var_create;
|
extern mi_cmd_argv_ftype mi_cmd_var_create;
|
||||||
extern mi_cmd_argv_ftype mi_cmd_var_delete;
|
extern mi_cmd_argv_ftype mi_cmd_var_delete;
|
||||||
|
|
|
@ -51,6 +51,7 @@
|
||||||
#include "inferior.h"
|
#include "inferior.h"
|
||||||
#include "osdata.h"
|
#include "osdata.h"
|
||||||
#include "splay-tree.h"
|
#include "splay-tree.h"
|
||||||
|
#include "tracepoint.h"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <sys/time.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->utime, end->utime) / 1000000.0,
|
||||||
timeval_diff (start->stime, end->stime) / 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);
|
||||||
|
}
|
||||||
|
|
118
gdb/tracepoint.c
118
gdb/tracepoint.c
|
@ -1408,15 +1408,9 @@ add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
|
||||||
collect->next_aexpr_elt++;
|
collect->next_aexpr_elt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* tstart command:
|
|
||||||
|
|
||||||
Tell target to clear any previous trace experiment.
|
void
|
||||||
Walk the list of tracepoints, and send them (and their actions)
|
start_tracing (void)
|
||||||
to the target. If no errors,
|
|
||||||
Tell target to start a new trace experiment. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
trace_start_command (char *args, int from_tty)
|
|
||||||
{
|
{
|
||||||
char buf[2048];
|
char buf[2048];
|
||||||
VEC(breakpoint_p) *tp_vec = NULL;
|
VEC(breakpoint_p) *tp_vec = NULL;
|
||||||
|
@ -1425,8 +1419,6 @@ trace_start_command (char *args, int from_tty)
|
||||||
struct trace_state_variable *tsv;
|
struct trace_state_variable *tsv;
|
||||||
int any_downloaded = 0;
|
int any_downloaded = 0;
|
||||||
|
|
||||||
dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
|
|
||||||
|
|
||||||
target_trace_init ();
|
target_trace_init ();
|
||||||
|
|
||||||
tp_vec = all_tracepoints ();
|
tp_vec = all_tracepoints ();
|
||||||
|
@ -1465,6 +1457,21 @@ trace_start_command (char *args, int from_tty)
|
||||||
current_trace_status()->running = 1;
|
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 */
|
/* tstop command */
|
||||||
static void
|
static void
|
||||||
trace_stop_command (char *args, int from_tty)
|
trace_stop_command (char *args, int from_tty)
|
||||||
|
@ -1473,7 +1480,7 @@ trace_stop_command (char *args, int from_tty)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
stop_tracing ()
|
stop_tracing (void)
|
||||||
{
|
{
|
||||||
target_trace_stop ();
|
target_trace_stop ();
|
||||||
/* should change in response to reply? */
|
/* 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"));
|
printf_filtered (_("Trace stopped because of disconnection.\n"));
|
||||||
break;
|
break;
|
||||||
case tracepoint_passcount:
|
case tracepoint_passcount:
|
||||||
/* FIXME account for number on target */
|
|
||||||
printf_filtered (_("Trace stopped by tracepoint %d.\n"),
|
printf_filtered (_("Trace stopped by tracepoint %d.\n"),
|
||||||
ts->stopping_tracepoint);
|
ts->stopping_tracepoint);
|
||||||
break;
|
break;
|
||||||
|
@ -1581,6 +1587,94 @@ trace_status_command (char *args, int from_tty)
|
||||||
printf_filtered (_("Not looking at any trace frame.\n"));
|
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
|
void
|
||||||
disconnect_or_stop_tracing (int from_tty)
|
disconnect_or_stop_tracing (int from_tty)
|
||||||
{
|
{
|
||||||
|
|
|
@ -86,6 +86,8 @@ struct trace_status
|
||||||
|
|
||||||
enum trace_stop_reason stop_reason;
|
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 stopping_tracepoint;
|
||||||
|
|
||||||
/* Number of traceframes currently in the buffer. */
|
/* 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 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 */
|
#endif /* TRACEPOINT_H */
|
||||||
|
|
Loading…
Reference in New Issue