mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-30 12:44:10 +08:00
-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>
|
||||
|
||||
Implement creating tracepoints with -break-insert.
|
||||
|
@ -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},
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
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++;
|
||||
}
|
||||
|
||||
/* 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)
|
||||
{
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user