Add new tracepoint action teval.

* tracepoint.c (teval_pseudocommand): New function.
	(validate_actionline): Add teval action case.
	(encode_actions): Ditto.
	(_initialize_tracepoint): Define teval pseudocommand.
	* NEWS: Mention teval.

	* gdb.texinfo (Tracepoint Actions): Describe teval.

	* gdb.trace/actions.exp: Test teval action.
This commit is contained in:
Stan Shebs 2009-12-31 17:47:43 +00:00
parent 383e5f8553
commit 6da95a677b
7 changed files with 136 additions and 0 deletions

View File

@ -1,5 +1,12 @@
2009-12-31 Stan Shebs <stan@codesourcery.com>
Add new tracepoint action teval.
* tracepoint.c (teval_pseudocommand): New function.
(validate_actionline): Add teval action case.
(encode_actions): Ditto.
(_initialize_tracepoint): Define teval pseudocommand.
* NEWS: Mention teval.
* tracepoint.c (trace_find_command): Error out if trace running.
(trace_find_pc_command): Ditto.
(trace_find_tracepoint_command): Ditto.

View File

@ -97,6 +97,10 @@ info tvariables
delete tvariable $NAME ...
Delete one or more trace state variables.
teval EXPR, ...
Evaluate the given expressions without collecting anything into the
trace buffer. (Valid in tracepoint actions only.)
* New options
set follow-exec-mode new|same

View File

@ -1,3 +1,7 @@
2009-12-31 Stan Shebs <stan@codesourcery.com>
* gdb.texinfo (Tracepoint Actions): Describe teval.
2009-12-29 Stan Shebs <stan@codesourcery.com>
* gdb.texinfo (Tracepoint Actions): Describe default-collect.

View File

@ -9626,6 +9626,15 @@ arguments separated by commas: the effect is the same.
The command @code{info scope} (@pxref{Symbols, info scope}) is
particularly useful for figuring out what data to collect.
@kindex teval @r{(tracepoints)}
@item teval @var{expr1}, @var{expr2}, @dots{}
Evaluate the given expressions when the tracepoint is hit. This
command accepts a comma-separated list of expressions. The results
are discarded, so this is mainly useful for assigning values to trace
state variables (@pxref{Trace State Variables}) without adding those
values to the trace buffer, as would be the case if the @code{collect}
action were used.
@kindex while-stepping @r{(tracepoints)}
@item while-stepping @var{n}
Perform @var{n} single-step traces after the tracepoint, collecting

View File

@ -1,3 +1,7 @@
2009-12-31 Stan Shebs <stan@codesourcery.com>
* gdb.trace/actions.exp: Test teval action.
2009-12-30 Thiago Jung Bauermann <bauerman@br.ibm.com>
* gdb.base/watchpoint.exp (test_watchpoint_in_big_blob): New function.

View File

@ -212,3 +212,31 @@ gdb_test "set default-collect gdb_char_test, gdb_long_test - 100" \
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"
# 5.10 teval
gdb_test "tvariable \$tsv" \
"Trace state variable \\\$tsv created, with initial value 0." \
"Create a trace state variable"
gdb_trace_setactions "5.10a: set teval action for first tracepoint" \
"$trcpt1" \
"teval gdb_char_test" "^$"
gdb_trace_setactions "5.10a: set teval action for second tracepoint" \
"$trcpt2" \
"teval \$tsv += 1" "^$"
gdb_test "info tracepoints" \
"Num Type\[ \]+Disp Enb Address\[ \]+What.*
\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+teval gdb_char_test.
\[\t \]+A\[\t \]+end.
\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+teval \\\$tsv \\\+= 1.
\[\t \]+A\[\t \]+end.
\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+.
\[\t \]+A\[\t \]+collect gdb_long_test.
\[\t \]+A\[\t \]+end." \
"5.10a: verify teval actions set for two tracepoints"

View File

@ -525,6 +525,12 @@ collect_pseudocommand (char *args, int from_tty)
error (_("This command can only be used in a tracepoint actions list."));
}
static void
teval_pseudocommand (char *args, int from_tty)
{
error (_("This command can only be used in a tracepoint actions list."));
}
/* Enter a list of actions for a tracepoint. */
static void
trace_actions_command (char *args, int from_tty)
@ -761,6 +767,34 @@ validate_actionline (char **line, struct breakpoint *t)
while (p && *p++ == ',');
return GENERIC;
}
else if (cmd_cfunc_eq (c, teval_pseudocommand))
{
struct agent_expr *aexpr;
do
{ /* repeat over a comma-separated list */
QUIT; /* allow user to bail out with ^C */
while (isspace ((int) *p))
p++;
/* Only expressions are allowed for this action. */
exp = parse_exp_1 (&p, block_for_pc (t->loc->address), 1);
old_chain = make_cleanup (free_current_contents, &exp);
/* We have something to evaluate, make sure that the expr to
bytecode translator can handle it and that it's not too
long. */
aexpr = gen_eval_for_expr (t->loc->address, exp);
make_cleanup_free_agent_expr (aexpr);
if (aexpr->len > MAX_AGENT_EXPR_LEN)
error (_("expression too complicated, try simplifying"));
do_cleanups (old_chain);
}
while (p && *p++ == ',');
return GENERIC;
}
else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
{
char *steparg; /* in case warning is necessary */
@ -1464,6 +1498,46 @@ encode_actions (struct breakpoint *t, char ***tdp_actions,
}
while (action_exp && *action_exp++ == ',');
} /* if */
else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
{
do
{ /* repeat over a comma-separated list */
QUIT; /* allow user to bail out with ^C */
while (isspace ((int) *action_exp))
action_exp++;
{
unsigned long addr, len;
struct cleanup *old_chain = NULL;
struct cleanup *old_chain1 = NULL;
struct agent_reqs areqs;
exp = parse_exp_1 (&action_exp,
block_for_pc (t->loc->address), 1);
old_chain = make_cleanup (free_current_contents, &exp);
aexpr = gen_eval_for_expr (t->loc->address, exp);
old_chain1 = make_cleanup_free_agent_expr (aexpr);
ax_reqs (aexpr, &areqs);
if (areqs.flaw != agent_flaw_none)
error (_("malformed expression"));
if (areqs.min_height < 0)
error (_("gdb: Internal error: expression has min height < 0"));
if (areqs.max_height > 20)
error (_("expression too complicated, try simplifying"));
discard_cleanups (old_chain1);
/* Even though we're not officially collecting, add
to the collect list anyway. */
add_aexpr (collect, aexpr);
do_cleanups (old_chain);
} /* do */
}
while (action_exp && *action_exp++ == ',');
} /* if */
else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
{
collect = &stepping_list;
@ -2624,6 +2698,12 @@ Also accepts the following special arguments:\n\
$locals -- all variables local to the block/function scope.\n\
Note: this command can only be used in a tracepoint \"actions\" list."));
add_com ("teval", class_trace, teval_pseudocommand, _("\
Specify one or more expressions to be evaluated at a tracepoint.\n\
Accepts a comma-separated list of (one or more) expressions.\n\
The result of each evaluation will be discarded.\n\
Note: this command can only be used in a tracepoint \"actions\" list."));
add_com ("actions", class_trace, trace_actions_command, _("\
Specify the actions to be taken at a tracepoint.\n\
Tracepoint actions may include collecting of specified data, \n\