diff options
| author | Masami Hiramatsu <mhiramat@redhat.com> | 2010-01-05 17:46:48 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2010-01-13 04:09:12 -0500 |
| commit | 14640106f243a3b29944d7198569090fa6546f2d (patch) | |
| tree | e5843aab34a60713f473a0e6bde6495827b9f031 | |
| parent | ec3a9039601af210fca4650d229621fe5a21df0b (diff) | |
tracing/kprobe: Drop function argument access syntax
Drop function argument access syntax, because the function
arguments depend on not only architecture but also
compile-options and function API. And now, we have perf-probe
for finding register/memory assigned to each argument.
Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: systemtap <systemtap@sources.redhat.com>
Cc: DLE <dle-develop@lists.sourceforge.net>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Roland McGrath <roland@redhat.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Michael Neuling <mikey@neuling.org>
Cc: linuxppc-dev@ozlabs.org
LKML-Reference: <20100105224648.19431.52309.stgit@dhcp-100-2-132.bos.redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | Documentation/trace/kprobetrace.txt | 21 | ||||
| -rw-r--r-- | kernel/trace/trace_kprobe.c | 18 |
2 files changed, 11 insertions, 28 deletions
diff --git a/Documentation/trace/kprobetrace.txt b/Documentation/trace/kprobetrace.txt index c3eff6ff945f..f30978e001f8 100644 --- a/Documentation/trace/kprobetrace.txt +++ b/Documentation/trace/kprobetrace.txt | |||
| @@ -37,15 +37,12 @@ Synopsis of kprobe_events | |||
| 37 | @SYM[+|-offs] : Fetch memory at SYM +|- offs (SYM should be a data symbol) | 37 | @SYM[+|-offs] : Fetch memory at SYM +|- offs (SYM should be a data symbol) |
| 38 | $stackN : Fetch Nth entry of stack (N >= 0) | 38 | $stackN : Fetch Nth entry of stack (N >= 0) |
| 39 | $stack : Fetch stack address. | 39 | $stack : Fetch stack address. |
| 40 | $argN : Fetch function argument. (N >= 0)(*) | 40 | $retval : Fetch return value.(*) |
| 41 | $retval : Fetch return value.(**) | 41 | +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**) |
| 42 | +|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(***) | ||
| 43 | NAME=FETCHARG: Set NAME as the argument name of FETCHARG. | 42 | NAME=FETCHARG: Set NAME as the argument name of FETCHARG. |
| 44 | 43 | ||
| 45 | (*) aN may not correct on asmlinkaged functions and at the middle of | 44 | (*) only for return probe. |
| 46 | function body. | 45 | (**) this is useful for fetching a field of data structures. |
| 47 | (**) only for return probe. | ||
| 48 | (***) this is useful for fetching a field of data structures. | ||
| 49 | 46 | ||
| 50 | 47 | ||
| 51 | Per-Probe Event Filtering | 48 | Per-Probe Event Filtering |
| @@ -82,11 +79,14 @@ Usage examples | |||
| 82 | To add a probe as a new event, write a new definition to kprobe_events | 79 | To add a probe as a new event, write a new definition to kprobe_events |
| 83 | as below. | 80 | as below. |
| 84 | 81 | ||
| 85 | echo p:myprobe do_sys_open dfd=$arg0 filename=$arg1 flags=$arg2 mode=$arg3 > /sys/kernel/debug/tracing/kprobe_events | 82 | echo p:myprobe do_sys_open dfd=%ax filename=%dx flags=%cx mode=+4($stack) > /sys/kernel/debug/tracing/kprobe_events |
| 86 | 83 | ||
| 87 | This sets a kprobe on the top of do_sys_open() function with recording | 84 | This sets a kprobe on the top of do_sys_open() function with recording |
| 88 | 1st to 4th arguments as "myprobe" event. As this example shows, users can | 85 | 1st to 4th arguments as "myprobe" event. Note, which register/stack entry is |
| 89 | choose more familiar names for each arguments. | 86 | assigned to each function argument depends on arch-specific ABI. If you unsure |
| 87 | the ABI, please try to use probe subcommand of perf-tools (you can find it | ||
| 88 | under tools/perf/). | ||
| 89 | As this example shows, users can choose more familiar names for each arguments. | ||
| 90 | 90 | ||
| 91 | echo r:myretprobe do_sys_open $retval >> /sys/kernel/debug/tracing/kprobe_events | 91 | echo r:myretprobe do_sys_open $retval >> /sys/kernel/debug/tracing/kprobe_events |
| 92 | 92 | ||
| @@ -147,4 +147,3 @@ events, you need to enable it. | |||
| 147 | returns from SYMBOL(e.g. "sys_open+0x1b/0x1d <- do_sys_open" means kernel | 147 | returns from SYMBOL(e.g. "sys_open+0x1b/0x1d <- do_sys_open" means kernel |
| 148 | returns from do_sys_open to sys_open+0x1b). | 148 | returns from do_sys_open to sys_open+0x1b). |
| 149 | 149 | ||
| 150 | |||
diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index 47f54ab57b68..7ac728ded964 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c | |||
| @@ -91,11 +91,6 @@ static __kprobes unsigned long fetch_memory(struct pt_regs *regs, void *addr) | |||
| 91 | return retval; | 91 | return retval; |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | static __kprobes unsigned long fetch_argument(struct pt_regs *regs, void *num) | ||
| 95 | { | ||
| 96 | return regs_get_argument_nth(regs, (unsigned int)((unsigned long)num)); | ||
| 97 | } | ||
| 98 | |||
| 99 | static __kprobes unsigned long fetch_retvalue(struct pt_regs *regs, | 94 | static __kprobes unsigned long fetch_retvalue(struct pt_regs *regs, |
| 100 | void *dummy) | 95 | void *dummy) |
| 101 | { | 96 | { |
| @@ -231,9 +226,7 @@ static int probe_arg_string(char *buf, size_t n, struct fetch_func *ff) | |||
| 231 | { | 226 | { |
| 232 | int ret = -EINVAL; | 227 | int ret = -EINVAL; |
| 233 | 228 | ||
| 234 | if (ff->func == fetch_argument) | 229 | if (ff->func == fetch_register) { |
| 235 | ret = snprintf(buf, n, "$arg%lu", (unsigned long)ff->data); | ||
| 236 | else if (ff->func == fetch_register) { | ||
| 237 | const char *name; | 230 | const char *name; |
| 238 | name = regs_query_register_name((unsigned int)((long)ff->data)); | 231 | name = regs_query_register_name((unsigned int)((long)ff->data)); |
| 239 | ret = snprintf(buf, n, "%%%s", name); | 232 | ret = snprintf(buf, n, "%%%s", name); |
| @@ -489,14 +482,6 @@ static int parse_probe_vars(char *arg, struct fetch_func *ff, int is_return) | |||
| 489 | } | 482 | } |
| 490 | } else | 483 | } else |
| 491 | ret = -EINVAL; | 484 | ret = -EINVAL; |
| 492 | } else if (strncmp(arg, "arg", 3) == 0 && isdigit(arg[3])) { | ||
| 493 | ret = strict_strtoul(arg + 3, 10, ¶m); | ||
| 494 | if (ret || param > PARAM_MAX_ARGS) | ||
| 495 | ret = -EINVAL; | ||
| 496 | else { | ||
| 497 | ff->func = fetch_argument; | ||
| 498 | ff->data = (void *)param; | ||
| 499 | } | ||
| 500 | } else | 485 | } else |
| 501 | ret = -EINVAL; | 486 | ret = -EINVAL; |
| 502 | return ret; | 487 | return ret; |
| @@ -611,7 +596,6 @@ static int create_trace_probe(int argc, char **argv) | |||
| 611 | * - Add kprobe: p[:[GRP/]EVENT] KSYM[+OFFS]|KADDR [FETCHARGS] | 596 | * - Add kprobe: p[:[GRP/]EVENT] KSYM[+OFFS]|KADDR [FETCHARGS] |
| 612 | * - Add kretprobe: r[:[GRP/]EVENT] KSYM[+0] [FETCHARGS] | 597 | * - Add kretprobe: r[:[GRP/]EVENT] KSYM[+0] [FETCHARGS] |
| 613 | * Fetch args: | 598 | * Fetch args: |
| 614 | * $argN : fetch Nth of function argument. (N:0-) | ||
| 615 | * $retval : fetch return value | 599 | * $retval : fetch return value |
| 616 | * $stack : fetch stack address | 600 | * $stack : fetch stack address |
| 617 | * $stackN : fetch Nth of stack (N:0-) | 601 | * $stackN : fetch Nth of stack (N:0-) |
