-trace-start/-trace-end/-trace-status.
authorVladimir Prus <vladimir@codesourcery.com>
Tue, 23 Mar 2010 21:46:33 +0000 (21:46 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Tue, 23 Mar 2010 21:46:33 +0000 (21:46 +0000)
* 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.

gdb/ChangeLog
gdb/mi/mi-cmds.c
gdb/mi/mi-cmds.h
gdb/mi/mi-main.c
gdb/tracepoint.c
gdb/tracepoint.h

index dbab388..ebd9041 100644 (file)
@@ -1,5 +1,22 @@
 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.
 
        * mi/mi-cmd-break.c (mi_cmd_break_insert): Handle -a
index 7f18d94..c2183fb 100644 (file)
@@ -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},
index 20bdbfd..702dd9e 100644 (file)
@@ -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;
index 4e31c72..c30e0e5 100644 (file)
@@ -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);
+}
index dc52ead..5fe456d 100644 (file)
@@ -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)
 {
index 9d0d78e..2c41cfd 100644 (file)
@@ -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 */