Skip to content

Commit

Permalink
perf probe: Fix to show which probe point is not found
Browse files Browse the repository at this point in the history
Fix perf probe to show which probe point is not found.
With out this patch, it shows just "No probe point found."
This doesn't help users if they specify several probes.
e.g.

 # perf probe -f --add schedule --add test
  Fatal: No probe point found.

This patch makes error message more helpful as below.

 # perf probe --add schedule --add test
  Fatal: Probe point 'test' not found. - probe not added.

Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Jim Keniston <jkenisto@us.ibm.com>
Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Frank Ch. Eigler <fche@redhat.com>
Cc: Jason Baron <jbaron@redhat.com>
Cc: K.Prasad <prasad@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Cc: systemtap <systemtap@sources.redhat.com>
Cc: DLE <dle-develop@lists.sourceforge.net>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <20091215153247.17436.49068.stgit@dhcp-100-2-132.bos.redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Masami Hiramatsu authored and Ingo Molnar committed Dec 15, 2009
1 parent 62bdc1b commit 7ef17aa
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 12 deletions.
7 changes: 5 additions & 2 deletions tools/perf/builtin-probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
34 changes: 24 additions & 10 deletions tools/perf/util/probe-event.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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]);
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
Expand All @@ -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);
Expand Down
1 change: 1 addition & 0 deletions tools/perf/util/probe-event.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 7ef17aa

Please sign in to comment.