Add default-collect variable.
authorStan Shebs <shebs@codesourcery.com>
Wed, 30 Dec 2009 16:11:08 +0000 (16:11 +0000)
committerStan Shebs <shebs@codesourcery.com>
Wed, 30 Dec 2009 16:11:08 +0000 (16:11 +0000)
* tracepoint.c (default_collect): New global.
(encode_actions): Use it.
(download_tracepoint): Test it, for otherwise
action-less tracepoints.
(_initialize_tracepoint): Add set/show.
* NEWS: Mention default-collect.

* gdb.texinfo (Tracepoint Actions): Describe default-collect.

* gdb.trace/actions.exp: Test default-collect.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.trace/actions.exp
gdb/tracepoint.c

index 64b9e17dc82913de20e99b3c6ad6c4076b2eebbf..5c9586be6998312f96d2400d3634a21e3fa277ec 100644 (file)
@@ -1,3 +1,13 @@
+2009-12-30  Stan Shebs  <stan@codesourcery.com>
+
+       Add default-collect variable.
+       * tracepoint.c (default_collect): New global.
+       (encode_actions): Use it.
+       (download_tracepoint): Test it, for otherwise
+       action-less tracepoints.
+       (_initialize_tracepoint): Add set/show.
+       * NEWS: Mention default-collect.
+
 2009-12-29  Stan Shebs  <stan@codesourcery.com>
 
        * language.c (pointer_type): Un-comment out.
index b680d9be6b73c02fd09981a355f0a55592ee40cc..eb84ee7e9e79baf754506c4960dedbdd45bd6809 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -105,6 +105,12 @@ show follow-exec-mode
   creates a new one.  This is useful to be able to restart the old
   executable after the inferior having done an exec call.
 
+set default-collect EXPR, ...
+show default-collect
+   Define a list of expressions to be collected at each tracepoint.
+   This is a useful way to ensure essential items are not overlooked,
+   such as registers or a critical global variable.
+
 * New remote packets
 
 QTDV
index d02f7ec4f2e3733eade25d3fb485cd9bb86240e0..7171423258bde01d6b7d92775f5c59df24c9bc00 100644 (file)
@@ -1,3 +1,7 @@
+2009-12-29  Stan Shebs  <stan@codesourcery.com>
+
+       * gdb.texinfo (Tracepoint Actions): Describe default-collect.
+       
 2009-12-28  Stan Shebs  <stan@codesourcery.com>
 
        * gdb.texinfo (Trace State Variables): New section.
index 7d3a35cb15fde73e643f9d59fd43925139684a17..39f0d6792405ae3c3d47c98c263b61357ca49668 100644 (file)
@@ -9643,6 +9643,22 @@ its own @code{end} command):
 @noindent
 You may abbreviate @code{while-stepping} as @code{ws} or
 @code{stepping}.
+
+@item set default-collect @var{expr1}, @var{expr2}, @dots{}
+@kindex set default-collect
+@cindex default collection action
+This variable is a list of expressions to collect at each tracepoint
+hit.  It is effectively an additional @code{collect} action prepended
+to every tracepoint action list.  The expressions are parsed
+individually for each tracepoint, so for instance a variable named
+@code{xyz} may be interpreted as a global for one tracepoint, and a
+local for another, as appropriate to the tracepoint's location.
+
+@item show default-collect
+@kindex show default-collect
+Show the list of expressions that are collected by default at each
+tracepoint hit.
+
 @end table
 
 @node Listing Tracepoints
index a170dcf475aba847144c4561106ade19fe5605e5..13da3d3136a6d86a3304c579f887286cee987332 100644 (file)
@@ -1,3 +1,7 @@
+2009-12-29  Stan Shebs  <stan@codesourcery.com>
+
+       * gdb.trace/actions.exp: Test default-collect.
+       
 2009-12-28  Stan Shebs  <stan@codesourcery.com>
 
        * gdb.trace/tsv.exp: New file.
index b22b210ee43ea14c756c2703bce527d0db2e452c..bb7277f9935e1d6b6ce69b065070391bb741a126 100644 (file)
@@ -203,3 +203,12 @@ gdb_test "help while-stepping" \
 gdb_test "help end" "Ends a list of commands or actions.*" \
                        "5.8d: help end"
 
+# 5.9 default-collect
+
+gdb_test "set default-collect gdb_char_test, gdb_long_test - 100" \
+    "" \
+    "5.9a: set default-collect"
+
+gdb_test "show default-collect" \
+    "The list of expressions to collect by default is \"gdb_char_test, gdb_long_test - 100\"..*" \
+    "5.9b: show default-collect"
index 702d348badf34661c736d66cd5867c3f61fcef07..2e3e2e84f5c11266055ffe0611671a1703184267 100644 (file)
@@ -140,9 +140,12 @@ static struct symtab_and_line traceframe_sal;
 /* Tracing command lists */
 static struct cmd_list_element *tfindlist;
 
+/* List of expressions to collect by default at each tracepoint hit.  */
+static char *default_collect = "";
+
 static char *target_buf;
 static long target_buf_size;
-
+  
 /* ======= Important command functions: ======= */
 static void trace_actions_command (char *, int);
 static void trace_start_command (char *, int);
@@ -1285,7 +1288,8 @@ encode_actions (struct breakpoint *t, char ***tdp_actions,
   struct agent_expr *aexpr;
   int frame_reg;
   LONGEST frame_offset;
-
+  char *default_collect_line = NULL;
+  struct action_line *default_collect_action = NULL;
 
   clear_collection_list (&tracepoint_list);
   clear_collection_list (&stepping_list);
@@ -1297,7 +1301,32 @@ encode_actions (struct breakpoint *t, char ***tdp_actions,
   gdbarch_virtual_frame_pointer (t->gdbarch,
                                 t->loc->address, &frame_reg, &frame_offset);
 
-  for (action = t->actions; action; action = action->next)
+  action = t->actions;
+
+  /* If there are default expressions to collect, make up a collect
+     action and prepend to the action list to encode.  Note that since
+     validation is per-tracepoint (local var "xyz" might be valid for
+     one tracepoint and not another, etc), we make up the action on
+     the fly, and don't cache it.  */
+  if (*default_collect)
+    {
+      char *line;
+      enum actionline_type linetype;
+
+      default_collect_line = xmalloc (12 + strlen (default_collect));
+      sprintf (default_collect_line, "collect %s", default_collect);
+      line = default_collect_line;
+      linetype = validate_actionline (&line, t);
+      if (linetype != BADLINE)
+       {
+         default_collect_action = xmalloc (sizeof (struct action_line));
+         default_collect_action->next = t->actions;
+         default_collect_action->action = line;
+         action = default_collect_action;
+       }
+    }
+
+  for (; action; action = action->next)
     {
       QUIT;                    /* allow user to bail out with ^C */
       action_exp = action->action;
@@ -1454,6 +1483,9 @@ encode_actions (struct breakpoint *t, char ***tdp_actions,
                                            tdp_buff);
   *stepping_actions = stringify_collection_list (&stepping_list, 
                                                 step_buff);
+
+  xfree (default_collect_line);
+  xfree (default_collect_action);
 }
 
 static void
@@ -1616,14 +1648,14 @@ download_tracepoint (struct breakpoint *t)
        warning (_("Target does not support conditional tracepoints, ignoring tp %d cond"), t->number);
     }
 
-  if (t->actions)
+  if (t->actions || *default_collect)
     strcat (buf, "-");
   putpkt (buf);
   remote_get_noisy_reply (&target_buf, &target_buf_size);
   if (strcmp (target_buf, "OK"))
     error (_("Target does not support tracepoints."));
 
-  if (!t->actions)
+  if (!t->actions && !*default_collect)
     return;
 
   encode_actions (t, &tdp_actions, &stepping_actions);
@@ -2568,6 +2600,14 @@ Tracepoint actions may include collecting of specified data, \n\
 single-stepping, or enabling/disabling other tracepoints, \n\
 depending on target's capabilities."));
 
+  default_collect = xstrdup ("");
+  add_setshow_string_cmd ("default-collect", class_trace,
+                         &default_collect, _("\
+Set the list of expressions to collect by default"), _("\
+Show the list of expressions to collect by default"), NULL,
+                         NULL, NULL,
+                         &setlist, &showlist);
+
   target_buf_size = 2048;
   target_buf = xmalloc (target_buf_size);
 }