From: Stan Shebs Date: Wed, 30 Dec 2009 16:11:08 +0000 (+0000) Subject: Add default-collect variable. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=236f1d4defb2070d3e43ce406604da7659860b38;p=binutils-gdb.git 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. * gdb.texinfo (Tracepoint Actions): Describe default-collect. * gdb.trace/actions.exp: Test default-collect. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 64b9e17dc82..5c9586be699 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2009-12-30 Stan Shebs + + 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 * language.c (pointer_type): Un-comment out. diff --git a/gdb/NEWS b/gdb/NEWS index b680d9be6b7..eb84ee7e9e7 100644 --- 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 diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index d02f7ec4f2e..7171423258b 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,7 @@ +2009-12-29 Stan Shebs + + * gdb.texinfo (Tracepoint Actions): Describe default-collect. + 2009-12-28 Stan Shebs * gdb.texinfo (Trace State Variables): New section. diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 7d3a35cb15f..39f0d679240 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -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 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index a170dcf475a..13da3d3136a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-12-29 Stan Shebs + + * gdb.trace/actions.exp: Test default-collect. + 2009-12-28 Stan Shebs * gdb.trace/tsv.exp: New file. diff --git a/gdb/testsuite/gdb.trace/actions.exp b/gdb/testsuite/gdb.trace/actions.exp index b22b210ee43..bb7277f9935 100644 --- a/gdb/testsuite/gdb.trace/actions.exp +++ b/gdb/testsuite/gdb.trace/actions.exp @@ -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" diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 702d348badf..2e3e2e84f5c 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -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); }