diff options
author | Stan Shebs <shebs@codesourcery.com> | 2009-12-31 17:47:43 +0000 |
---|---|---|
committer | Stan Shebs <shebs@codesourcery.com> | 2009-12-31 17:47:43 +0000 |
commit | 6da95a677b977e132bc936a73b2bb92844b14f32 (patch) | |
tree | 85f0857e05cc28c9838bda2cf7129bccfb465657 /gdb/tracepoint.c | |
parent | 383e5f855398acb5ff53f32cde88bdfa675d7931 (diff) | |
download | gdb-6da95a677b977e132bc936a73b2bb92844b14f32.zip gdb-6da95a677b977e132bc936a73b2bb92844b14f32.tar.gz gdb-6da95a677b977e132bc936a73b2bb92844b14f32.tar.bz2 |
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.
Diffstat (limited to 'gdb/tracepoint.c')
-rw-r--r-- | gdb/tracepoint.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 26a836d..fd7c161 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -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\ |