2010-04-08 Stan Shebs <stan@codesourcery.com>
authorStan Shebs <shebs@codesourcery.com>
Fri, 9 Apr 2010 03:00:58 +0000 (03:00 +0000)
committerStan Shebs <shebs@codesourcery.com>
Fri, 9 Apr 2010 03:00:58 +0000 (03:00 +0000)
    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.

gdb/ChangeLog
gdb/cli/cli-cmds.c
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/infcmd.c
gdb/remote.c
gdb/tracepoint.c
gdb/tracepoint.h

index 217295e38bb0aff94100e531d69ad276a3f877bf..123d345fd020d118603bc32ad9e9bf572c982753 100644 (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
index ae0be7a2993579958a5f724559b5b50e74376257..aaf0586d188571897699794307ebfcb4ce7fdd63 100644 (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);
 }
index e3ca994d7c1497b7ba92a1356f1de8a08f0ebcac..9b98dc08bd5be99f4f6e4c481cbcf5e760eebc88 100644 (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
index 01ede9875e1f68b3ff333eb20bd4924f6441ae5b..bd2b441299e0a43127da4b6ce72532be2d2a289b 100644 (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}
index a803bcbbb4570721d3049e6de3278ba5bff4b61b..16d32a661b0ea1b096e240866978e8e04e948a7a 100644 (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);
 
index 685be7a4fbf72db25e704395d2341a131fea207e..08092606a41b9854aec749c52f5ab19620204a67 100644 (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
index c25be707259c8334fa53b144d1519dcebad337ed..41fcc97bf65095e1e54c200d59d653dddd572210 100644 (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.  */
index 13e956fdb5fb175a9efa766ebfa9feec680dec19..98d56bafe7cc749396fb0c890aec6aca5c071630 100644 (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);