diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index 6b0e4cf322d..520b064b46d 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c @@ -265,8 +265,11 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used) ret = find_probepoint(fd, pp); if (ret > 0) continue; - if (ret == 0) /* No error but failed to find probe point. */ - die("No probe point found."); + if (ret == 0) { /* No error but failed to find probe point. */ + synthesize_perf_probe_point(pp); + die("Probe point '%s' not found. - probe not added.", + pp->probes[0]); + } /* Error path */ if (session.need_dwarf) { if (ret == -ENOENT) diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index b05d532a4e4..2ca62154f79 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c @@ -249,11 +249,12 @@ void parse_trace_kprobe_event(const char *str, struct probe_point *pp) argv_free(argv); } -int synthesize_perf_probe_event(struct probe_point *pp) +/* Synthesize only probe point (not argument) */ +int synthesize_perf_probe_point(struct probe_point *pp) { char *buf; char offs[64] = "", line[64] = ""; - int i, len, ret; + int ret; pp->probes[0] = buf = zalloc(MAX_CMDLEN); if (!buf) @@ -274,10 +275,24 @@ int synthesize_perf_probe_event(struct probe_point *pp) offs, pp->retprobe ? "%return" : "", line); else ret = e_snprintf(buf, MAX_CMDLEN, "%s%s", pp->file, line); - if (ret <= 0) - goto error; - len = ret; + if (ret <= 0) { +error: + free(pp->probes[0]); + pp->probes[0] = NULL; + } + return ret; +} +int synthesize_perf_probe_event(struct probe_point *pp) +{ + char *buf; + int i, len, ret; + + len = synthesize_perf_probe_point(pp); + if (len < 0) + return 0; + + buf = pp->probes[0]; for (i = 0; i < pp->nr_args; i++) { ret = e_snprintf(&buf[len], MAX_CMDLEN - len, " %s", pp->args[i]); @@ -290,6 +305,7 @@ int synthesize_perf_probe_event(struct probe_point *pp) return pp->found; error: free(pp->probes[0]); + pp->probes[0] = NULL; return ret; } @@ -319,6 +335,7 @@ int synthesize_trace_kprobe_event(struct probe_point *pp) return pp->found; error: free(pp->probes[0]); + pp->probes[0] = NULL; return ret; } @@ -418,7 +435,7 @@ static void show_perf_probe_event(const char *event, const char *place, /* List up current perf-probe events */ void show_perf_probe_events(void) { - int fd, nr; + int fd; struct probe_point pp; struct strlist *rawlist; struct str_node *ent; @@ -430,10 +447,7 @@ void show_perf_probe_events(void) strlist__for_each(ent, rawlist) { parse_trace_kprobe_event(ent->s, &pp); /* Synthesize only event probe point */ - nr = pp.nr_args; - pp.nr_args = 0; - synthesize_perf_probe_event(&pp); - pp.nr_args = nr; + synthesize_perf_probe_point(&pp); /* Show an event */ show_perf_probe_event(pp.event, pp.probes[0], &pp); clear_probe_point(&pp); diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h index 8fd30525100..7f1d499118c 100644 --- a/tools/perf/util/probe-event.h +++ b/tools/perf/util/probe-event.h @@ -7,6 +7,7 @@ extern void parse_perf_probe_event(const char *str, struct probe_point *pp, bool *need_dwarf); +extern int synthesize_perf_probe_point(struct probe_point *pp); extern int synthesize_perf_probe_event(struct probe_point *pp); extern void parse_trace_kprobe_event(const char *str, struct probe_point *pp); extern int synthesize_trace_kprobe_event(struct probe_point *pp);