diff options
Diffstat (limited to 'tools/perf/builtin-probe.c')
-rw-r--r-- | tools/perf/builtin-probe.c | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index ee5b42173ba3..f87996b0cb29 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c | |||
@@ -326,6 +326,11 @@ static int perf_add_probe_events(struct perf_probe_event *pevs, int npevs) | |||
326 | if (ret < 0) | 326 | if (ret < 0) |
327 | goto out_cleanup; | 327 | goto out_cleanup; |
328 | 328 | ||
329 | if (params.command == 'D') { /* it shows definition */ | ||
330 | ret = show_probe_trace_events(pevs, npevs); | ||
331 | goto out_cleanup; | ||
332 | } | ||
333 | |||
329 | ret = apply_perf_probe_events(pevs, npevs); | 334 | ret = apply_perf_probe_events(pevs, npevs); |
330 | if (ret < 0) | 335 | if (ret < 0) |
331 | goto out_cleanup; | 336 | goto out_cleanup; |
@@ -454,6 +459,14 @@ out: | |||
454 | return ret; | 459 | return ret; |
455 | } | 460 | } |
456 | 461 | ||
462 | #ifdef HAVE_DWARF_SUPPORT | ||
463 | #define PROBEDEF_STR \ | ||
464 | "[EVENT=]FUNC[@SRC][+OFF|%return|:RL|;PT]|SRC:AL|SRC;PT [[NAME=]ARG ...]" | ||
465 | #else | ||
466 | #define PROBEDEF_STR "[EVENT=]FUNC[+OFF|%return] [[NAME=]ARG ...]" | ||
467 | #endif | ||
468 | |||
469 | |||
457 | static int | 470 | static int |
458 | __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) | 471 | __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) |
459 | { | 472 | { |
@@ -479,13 +492,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) | |||
479 | opt_set_filter_with_command, DEFAULT_LIST_FILTER), | 492 | opt_set_filter_with_command, DEFAULT_LIST_FILTER), |
480 | OPT_CALLBACK('d', "del", NULL, "[GROUP:]EVENT", "delete a probe event.", | 493 | OPT_CALLBACK('d', "del", NULL, "[GROUP:]EVENT", "delete a probe event.", |
481 | opt_set_filter_with_command), | 494 | opt_set_filter_with_command), |
482 | OPT_CALLBACK('a', "add", NULL, | 495 | OPT_CALLBACK('a', "add", NULL, PROBEDEF_STR, |
483 | #ifdef HAVE_DWARF_SUPPORT | ||
484 | "[EVENT=]FUNC[@SRC][+OFF|%return|:RL|;PT]|SRC:AL|SRC;PT" | ||
485 | " [[NAME=]ARG ...]", | ||
486 | #else | ||
487 | "[EVENT=]FUNC[+OFF|%return] [[NAME=]ARG ...]", | ||
488 | #endif | ||
489 | "probe point definition, where\n" | 496 | "probe point definition, where\n" |
490 | "\t\tGROUP:\tGroup name (optional)\n" | 497 | "\t\tGROUP:\tGroup name (optional)\n" |
491 | "\t\tEVENT:\tEvent name\n" | 498 | "\t\tEVENT:\tEvent name\n" |
@@ -503,6 +510,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) | |||
503 | "\t\tARG:\tProbe argument (kprobe-tracer argument format.)\n", | 510 | "\t\tARG:\tProbe argument (kprobe-tracer argument format.)\n", |
504 | #endif | 511 | #endif |
505 | opt_add_probe_event), | 512 | opt_add_probe_event), |
513 | OPT_CALLBACK('D', "definition", NULL, PROBEDEF_STR, | ||
514 | "Show trace event definition of given traceevent for k/uprobe_events.", | ||
515 | opt_add_probe_event), | ||
506 | OPT_BOOLEAN('f', "force", &probe_conf.force_add, "forcibly add events" | 516 | OPT_BOOLEAN('f', "force", &probe_conf.force_add, "forcibly add events" |
507 | " with existing name"), | 517 | " with existing name"), |
508 | OPT_CALLBACK('L', "line", NULL, | 518 | OPT_CALLBACK('L', "line", NULL, |
@@ -548,6 +558,7 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) | |||
548 | 558 | ||
549 | set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE); | 559 | set_option_flag(options, 'a', "add", PARSE_OPT_EXCLUSIVE); |
550 | set_option_flag(options, 'd', "del", PARSE_OPT_EXCLUSIVE); | 560 | set_option_flag(options, 'd', "del", PARSE_OPT_EXCLUSIVE); |
561 | set_option_flag(options, 'D', "definition", PARSE_OPT_EXCLUSIVE); | ||
551 | set_option_flag(options, 'l', "list", PARSE_OPT_EXCLUSIVE); | 562 | set_option_flag(options, 'l', "list", PARSE_OPT_EXCLUSIVE); |
552 | #ifdef HAVE_DWARF_SUPPORT | 563 | #ifdef HAVE_DWARF_SUPPORT |
553 | set_option_flag(options, 'L', "line", PARSE_OPT_EXCLUSIVE); | 564 | set_option_flag(options, 'L', "line", PARSE_OPT_EXCLUSIVE); |
@@ -600,6 +611,14 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) | |||
600 | */ | 611 | */ |
601 | symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL); | 612 | symbol_conf.try_vmlinux_path = (symbol_conf.vmlinux_name == NULL); |
602 | 613 | ||
614 | /* | ||
615 | * Except for --list, --del and --add, other command doesn't depend | ||
616 | * nor change running kernel. So if user gives offline vmlinux, | ||
617 | * ignore its buildid. | ||
618 | */ | ||
619 | if (!strchr("lda", params.command) && symbol_conf.vmlinux_name) | ||
620 | symbol_conf.ignore_vmlinux_buildid = true; | ||
621 | |||
603 | switch (params.command) { | 622 | switch (params.command) { |
604 | case 'l': | 623 | case 'l': |
605 | if (params.uprobes) { | 624 | if (params.uprobes) { |
@@ -643,7 +662,9 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) | |||
643 | return ret; | 662 | return ret; |
644 | } | 663 | } |
645 | break; | 664 | break; |
665 | case 'D': | ||
646 | case 'a': | 666 | case 'a': |
667 | |||
647 | /* Ensure the last given target is used */ | 668 | /* Ensure the last given target is used */ |
648 | if (params.target && !params.target_used) { | 669 | if (params.target && !params.target_used) { |
649 | pr_err(" Error: -x/-m must follow the probe definitions.\n"); | 670 | pr_err(" Error: -x/-m must follow the probe definitions.\n"); |