2010-04-08 Stan Shebs <stan@codesourcery.com>

Pedro Alves  <pedro@codesourcery.com>

	* tracepoint.h (struct trace_status): New fields disconnected_tracing
	and circular_buffer.
	(disconnect_tracing): Rename from disconnect_or_stop_tracing.
	* tracepoint.c (trace_status_command): Display target's status for
	disconnected tracing and circular buffer.
	(disconnect_tracing): Rename from disconnect_or_stop_tracing, add
	query for non-disconnected-tracing case, remove the stop_tracing
	call.
	(tfile_open): Clear disconnected and circular buffer status.
	(trace_save): Save disconnected and circular buffer status.
	(parse_trace_status): Parse disconnected and circular buffer status,
	also recognize disconnected as a stop reason.
	* remote.c (remote_set_disconnected_tracing): Only set
	QTDisconnected if the remote end supports disconnected tracing.
	Warn otherwise, if trying to enable disconnected tracing.
	* infcmd.c (detach_command): Update disconnect_tracing call.
	* cli/cli-cmds.c (quit_command): Ditto.

	* gdb.texinfo (Tracepoint Packets): Describe disconn and circular
	trace status fields.
This commit is contained in:
Stan Shebs 2010-04-09 03:00:58 +00:00
parent 64e173680a
commit 33da3f1cb5
8 changed files with 116 additions and 29 deletions

View File

@ -1,3 +1,24 @@
2010-04-08 Stan Shebs <stan@codesourcery.com>
Pedro Alves <pedro@codesourcery.com>
* tracepoint.h (struct trace_status): New fields disconnected_tracing
and circular_buffer.
(disconnect_tracing): Rename from disconnect_or_stop_tracing.
* tracepoint.c (trace_status_command): Display target's status for
disconnected tracing and circular buffer.
(disconnect_tracing): Rename from disconnect_or_stop_tracing, add
query for non-disconnected-tracing case, remove the stop_tracing
call.
(tfile_open): Clear disconnected and circular buffer status.
(trace_save): Save disconnected and circular buffer status.
(parse_trace_status): Parse disconnected and circular buffer status,
also recognize disconnected as a stop reason.
* remote.c (remote_set_disconnected_tracing): Only set
QTDisconnected if the remote end supports disconnected tracing.
Warn otherwise, if trying to enable disconnected tracing.
* infcmd.c (detach_command): Update disconnect_tracing call.
* cli/cli-cmds.c (quit_command): Ditto.
2010-04-08 H.J. Lu <hongjiu.lu@intel.com>
* i387-tdep.c (i387_collect_xsave): Replace abort with

View File

@ -38,7 +38,7 @@
#include "objfiles.h"
#include "source.h"
#include "disasm.h"
extern void disconnect_or_stop_tracing (int from_tty);
#include "tracepoint.h"
#include "ui-out.h"
@ -337,7 +337,7 @@ quit_command (char *args, int from_tty)
if (!quit_confirm ())
error (_("Not confirmed."));
disconnect_or_stop_tracing (from_tty);
disconnect_tracing (from_tty);
quit_force (args, from_tty);
}

View File

@ -1,3 +1,8 @@
2010-04-08 Stan Shebs <stan@codesourcery.com>
* gdb.texinfo (Tracepoint Packets): Describe disconn and circular
trace status fields.
2010-04-08 H.J. Lu <hongjiu.lu@intel.com>
* gdb.texinfo (i386 Features): Make org.gnu.gdb.i386.avx

View File

@ -31508,10 +31508,11 @@ The trace stopped for some other reason.
@end table
Additional optional fields supply statistical information. Although
not required, they are extremely useful for users monitoring the
progress of a trace run. If a trace has stopped, and these numbers
are reported, they must reflect the state of the just-stopped trace.
Additional optional fields supply statistical and other information.
Although not required, they are extremely useful for users monitoring
the progress of a trace run. If a trace has stopped, and these
numbers are reported, they must reflect the state of the just-stopped
trace.
@table @samp
@ -31528,6 +31529,17 @@ The total size of the trace buffer, in bytes.
@item tfree:@var{n}
The number of bytes still unused in the buffer.
@item circular:@var{n}
The value of the circular trace buffer flag. @code{1} means that the
trace buffer is circular and old trace frames will be discarded if
necessary to make room, @code{0} means that the trace buffer is linear
and may fill up.
@item disconn:@var{n}
The value of the disconnected tracing flag. @code{1} means that
tracing will continue after @value{GDBN} disconnects, @code{0} means
that the trace run will stop.
@end table
@item qTV:@var{var}

View File

@ -2547,7 +2547,7 @@ detach_command (char *args, int from_tty)
if (ptid_equal (inferior_ptid, null_ptid))
error (_("The program is not being run."));
disconnect_or_stop_tracing (from_tty);
disconnect_tracing (from_tty);
target_detach (args, from_tty);

View File

@ -9776,11 +9776,16 @@ remote_set_disconnected_tracing (int val)
{
struct remote_state *rs = get_remote_state ();
sprintf (rs->buf, "QTDisconnected:%x", val);
putpkt (rs->buf);
remote_get_noisy_reply (&target_buf, &target_buf_size);
if (strcmp (target_buf, "OK"))
error (_("Target does not support this command."));
if (rs->disconnected_tracing)
{
sprintf (rs->buf, "QTDisconnected:%x", val);
putpkt (rs->buf);
remote_get_noisy_reply (&target_buf, &target_buf_size);
if (strcmp (target_buf, "OK"))
error (_("Target does not support this command."));
}
else if (val)
warning (_("Target does not support disconnected tracing."));
}
static int

View File

@ -1626,10 +1626,6 @@ trace_status_command (char *args, int from_tty)
else if (ts->running)
{
printf_filtered (_("Trace is running on the target.\n"));
if (disconnected_tracing)
printf_filtered (_("Trace will continue if GDB disconnects.\n"));
else
printf_filtered (_("Trace will stop if GDB disconnects.\n"));
}
else
{
@ -1699,6 +1695,14 @@ trace_status_command (char *args, int from_tty)
ts->buffer_free);
}
if (ts->disconnected_tracing)
printf_filtered (_("Trace will continue if GDB disconnects.\n"));
else
printf_filtered (_("Trace will stop if GDB disconnects.\n"));
if (ts->circular_buffer)
printf_filtered (_("Trace buffer is circular.\n"));
/* Now report on what we're doing with tfind. */
if (traceframe_number >= 0)
printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
@ -1801,9 +1805,11 @@ trace_status_mi (int on_stop)
ui_out_field_int (uiout, "buffer-free", (int) ts->buffer_free);
}
/* This function handles the details of what to do about an ongoing
tracing run if the user has asked to detach or otherwise disconnect
from the target. */
void
disconnect_or_stop_tracing (int from_tty)
disconnect_tracing (int from_tty)
{
/* It can happen that the target that was tracing went away on its
own, and we didn't notice. Get a status update, and if the
@ -1812,18 +1818,23 @@ disconnect_or_stop_tracing (int from_tty)
if (target_get_trace_status (current_trace_status ()) < 0)
current_trace_status ()->running = 0;
/* If running interactively, give the user the option to cancel and
then decide what to do differently with the run. Scripts are
just going to disconnect and let the target deal with it,
according to how it's been instructed previously via
disconnected-tracing. */
if (current_trace_status ()->running && from_tty)
{
int cont = query (_("Trace is running. Continue tracing after detach? "));
/* Note that we send the query result without affecting the
user's setting of disconnected_tracing, so that the answer is
a one-time-only. */
send_disconnected_tracing_value (cont);
/* Also ensure that we do the equivalent of a tstop command if
tracing is not to continue after the detach. */
if (!cont)
stop_tracing ();
if (current_trace_status ()->disconnected_tracing)
{
if (!query (_("Trace is running and will continue after detach; detach anyway? ")))
error (_("Not confirmed."));
}
else
{
if (!query (_("Trace is running but will stop on detach; detach anyway? ")))
error (_("Not confirmed."));
}
}
/* Also we want to be out of tfind mode, otherwise things can get
@ -2599,6 +2610,10 @@ trace_save (const char *filename, int target_does_save)
fprintf (fp, ";tfree:%x", ts->buffer_free);
if (ts->buffer_size >= 0)
fprintf (fp, ";tsize:%x", ts->buffer_size);
if (ts->disconnected_tracing)
fprintf (fp, ";disconn:%x", ts->disconnected_tracing);
if (ts->circular_buffer)
fprintf (fp, ";circular:%x", ts->circular_buffer);
fprintf (fp, "\n");
/* Note that we want to upload tracepoints and save those, rather
@ -3167,6 +3182,8 @@ tfile_open (char *filename, int from_tty)
ts->stop_reason = trace_stop_reason_unknown;
ts->traceframe_count = -1;
ts->buffer_free = 0;
ts->disconnected_tracing = 0;
ts->circular_buffer = 0;
/* Read through a section of newline-terminated lines that
define things like tracepoints. */
@ -3282,6 +3299,8 @@ parse_trace_status (char *line, struct trace_status *ts)
ts->traceframes_created = -1;
ts->buffer_free = -1;
ts->buffer_size = -1;
ts->disconnected_tracing = 0;
ts->circular_buffer = 0;
while (*p++)
{
@ -3310,6 +3329,11 @@ Status line: '%s'\n"), p, line);
p = unpack_varlen_hex (++p1, &val);
ts->stop_reason = tstop_command;
}
else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
{
p = unpack_varlen_hex (++p1, &val);
ts->stop_reason = trace_disconnected;
}
else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
{
p2 = strchr (++p1, ':');
@ -3348,6 +3372,16 @@ Status line: '%s'\n"), p, line);
p = unpack_varlen_hex (++p1, &val);
ts->buffer_size = val;
}
else if (strncmp (p, "disconn", p1 - p) == 0)
{
p = unpack_varlen_hex (++p1, &val);
ts->disconnected_tracing = val;
}
else if (strncmp (p, "circular", p1 - p) == 0)
{
p = unpack_varlen_hex (++p1, &val);
ts->circular_buffer = val;
}
else
{
/* Silently skip unknown optional info. */

View File

@ -106,6 +106,16 @@ struct trace_status
/* Unused bytes left in the target's trace buffer. */
int buffer_free;
/* 1 if the target will continue tracing after disconnection, else
0. If the target does not report a value, assume 0. */
int disconnected_tracing;
/* 1 if the target is using a circular trace buffer, else 0. If the
target does not report a value, assume 0. */
int circular_buffer;
};
struct trace_status *current_trace_status (void);
@ -189,7 +199,7 @@ 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 disconnect_or_stop_tracing (int from_tty);
extern void disconnect_tracing (int from_tty);
extern void start_tracing (void);
extern void stop_tracing (void);