From: Stan Shebs <stan@codesourcery.com>
To: Pedro Alves <pedro@codesourcery.com>
Cc: Stan Shebs <stan@codesourcery.com>, gdb-patches@sourceware.org
Subject: Re: tracing broken if target doesn't do disconnected tracing
Date: Wed, 07 Apr 2010 01:34:00 -0000 [thread overview]
Message-ID: <4BBBE114.3030305@codesourcery.com> (raw)
In-Reply-To: <201004051204.25151.pedro@codesourcery.com>
[-- Attachment #1: Type: text/plain, Size: 2248 bytes --]
Pedro Alves wrote:
> On Monday 05 April 2010 02:07:56, Stan Shebs wrote:
>
>> I'm thinking that this is in some ways like the circular trace buffer
>> flag, and could be reasonably made accessible via the trace_status
>> structure. Unless you're just dying to do this yourself :-) , I'll take
>> care of the two together.
>>
>
> Please, be my guest. :-)
>
Here's my suggested changes, and of course it implies some target-side
changes as well. Turns out that I generated some confusion for myself
by auto-generating tstop commands, which I realized when I was unable to
write a code comment that justified it. :-)
So the new behavior is that GDB always simply drops the connection. If
the target can do disconnected tracing, it just keeps going. If it
can't, or the query answer instructs it to not keep tracing, it stops,
and records the stop reason as "tdisconnection"; you'll then see that
when you reconnect to the target and do a tstatus. Since tstatus
reports the target's state consistently now, you'll also see that in a
trace file. Ditto for circularity of trace buffer.
If this behavior seems reasonable, I'll add appropriate bits to the
manual and repost/commit.
As for multi-process, I can see reasons to make these kinds of flags
either per-process or global to the target, so didn't try to guess at
the final decision here. :-)
2010-04-06 Stan Shebs <stan@codesourcery.com>
Pedro Alves <pedro@codesourcery.com>
* tracepoint.h (struct trace_status): New fields disconnected_tracing
and circular_buffer.
* tracepoint.c (trace_status_command): Display target's status for
disconnected tracing and circular buffer.
(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.
[-- Attachment #2: disconn-patch-1 --]
[-- Type: text/plain, Size: 7482 bytes --]
Index: remote.c
===================================================================
RCS file: /cvs/src/src/gdb/remote.c,v
retrieving revision 1.399
diff -p -r1.399 remote.c
*** remote.c 2 Apr 2010 01:18:34 -0000 1.399
--- remote.c 7 Apr 2010 01:16:33 -0000
*************** remote_set_disconnected_tracing (int val
*** 9776,9786 ****
{
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."));
}
static int
--- 9776,9791 ----
{
struct remote_state *rs = get_remote_state ();
! 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
Index: tracepoint.c
===================================================================
RCS file: /cvs/src/src/gdb/tracepoint.c,v
retrieving revision 1.173
diff -p -r1.173 tracepoint.c
*** tracepoint.c 6 Apr 2010 17:47:40 -0000 1.173
--- tracepoint.c 7 Apr 2010 01:16:33 -0000
*************** trace_status_command (char *args, int fr
*** 1626,1635 ****
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
{
--- 1626,1631 ----
*************** trace_status_command (char *args, int fr
*** 1699,1704 ****
--- 1695,1708 ----
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"),
*************** trace_status_mi (int on_stop)
*** 1801,1806 ****
--- 1805,1813 ----
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_or_stop_tracing (int from_tty
*** 1812,1829 ****
if (target_get_trace_status (current_trace_status ()) < 0)
current_trace_status ()->running = 0;
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 ();
}
/* Also we want to be out of tfind mode, otherwise things can get
--- 1819,1844 ----
if (target_get_trace_status (current_trace_status ()) < 0)
current_trace_status ()->running = 0;
+ /* If running interactively, offer the user options for what to do
+ 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)
{
! if (current_trace_status ()->disconnected_tracing)
! {
! 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);
! }
! 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
*************** trace_save (const char *filename, int ta
*** 2599,2604 ****
--- 2614,2623 ----
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
*************** tfile_open (char *filename, int from_tty
*** 3167,3172 ****
--- 3186,3193 ----
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. */
*************** parse_trace_status (char *line, struct t
*** 3282,3287 ****
--- 3303,3310 ----
ts->traceframes_created = -1;
ts->buffer_free = -1;
ts->buffer_size = -1;
+ ts->disconnected_tracing = 0;
+ ts->circular_buffer = 0;
while (*p++)
{
*************** Status line: '%s'\n"), p, line);
*** 3310,3315 ****
--- 3333,3343 ----
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, ':');
*************** Status line: '%s'\n"), p, line);
*** 3348,3353 ****
--- 3376,3391 ----
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. */
Index: tracepoint.h
===================================================================
RCS file: /cvs/src/src/gdb/tracepoint.h,v
retrieving revision 1.34
diff -p -r1.34 tracepoint.h
*** tracepoint.h 6 Apr 2010 17:47:40 -0000 1.34
--- tracepoint.h 7 Apr 2010 01:16:33 -0000
*************** struct trace_status
*** 106,111 ****
--- 106,121 ----
/* 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);
next prev parent reply other threads:[~2010-04-07 1:34 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-04-05 0:01 Pedro Alves
2010-04-05 1:08 ` Stan Shebs
2010-04-05 11:04 ` Pedro Alves
2010-04-07 1:34 ` Stan Shebs [this message]
2010-04-07 11:40 ` Pedro Alves
2010-04-07 13:33 ` Stan Shebs
2010-04-07 13:47 ` Pedro Alves
2010-04-07 14:07 ` Pedro Alves
2010-04-07 20:21 ` Stan Shebs
2010-04-07 22:06 ` Pedro Alves
2010-04-07 13:35 ` Pedro Alves
2010-04-07 22:04 ` Stan Shebs
2010-04-08 17:25 ` Pedro Alves
2010-04-08 18:19 ` Stan Shebs
2010-04-08 18:32 ` Pedro Alves
2010-04-08 19:10 ` Stan Shebs
2010-04-09 3:10 ` Stan Shebs
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4BBBE114.3030305@codesourcery.com \
--to=stan@codesourcery.com \
--cc=gdb-patches@sourceware.org \
--cc=pedro@codesourcery.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox