Commit 7ef17aaf authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Ingo Molnar

perf probe: Fix to show which probe point is not found

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: default avatarMasami 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: default avatarIngo Molnar <mingo@elte.hu>
parent 62bdc1b3
...@@ -265,8 +265,11 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used) ...@@ -265,8 +265,11 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
ret = find_probepoint(fd, pp); ret = find_probepoint(fd, pp);
if (ret > 0) if (ret > 0)
continue; continue;
if (ret == 0) /* No error but failed to find probe point. */ if (ret == 0) { /* No error but failed to find probe point. */
die("No probe point found."); synthesize_perf_probe_point(pp);
die("Probe point '%s' not found. - probe not added.",
pp->probes[0]);
}
/* Error path */ /* Error path */
if (session.need_dwarf) { if (session.need_dwarf) {
if (ret == -ENOENT) if (ret == -ENOENT)
......
...@@ -249,11 +249,12 @@ void parse_trace_kprobe_event(const char *str, struct probe_point *pp) ...@@ -249,11 +249,12 @@ void parse_trace_kprobe_event(const char *str, struct probe_point *pp)
argv_free(argv); 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 *buf;
char offs[64] = "", line[64] = ""; char offs[64] = "", line[64] = "";
int i, len, ret; int ret;
pp->probes[0] = buf = zalloc(MAX_CMDLEN); pp->probes[0] = buf = zalloc(MAX_CMDLEN);
if (!buf) if (!buf)
...@@ -274,10 +275,24 @@ int synthesize_perf_probe_event(struct probe_point *pp) ...@@ -274,10 +275,24 @@ int synthesize_perf_probe_event(struct probe_point *pp)
offs, pp->retprobe ? "%return" : "", line); offs, pp->retprobe ? "%return" : "", line);
else else
ret = e_snprintf(buf, MAX_CMDLEN, "%s%s", pp->file, line); ret = e_snprintf(buf, MAX_CMDLEN, "%s%s", pp->file, line);
if (ret <= 0) if (ret <= 0) {
goto error; error:
len = ret; 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++) { for (i = 0; i < pp->nr_args; i++) {
ret = e_snprintf(&buf[len], MAX_CMDLEN - len, " %s", ret = e_snprintf(&buf[len], MAX_CMDLEN - len, " %s",
pp->args[i]); pp->args[i]);
...@@ -290,6 +305,7 @@ int synthesize_perf_probe_event(struct probe_point *pp) ...@@ -290,6 +305,7 @@ int synthesize_perf_probe_event(struct probe_point *pp)
return pp->found; return pp->found;
error: error:
free(pp->probes[0]); free(pp->probes[0]);
pp->probes[0] = NULL;
return ret; return ret;
} }
...@@ -319,6 +335,7 @@ int synthesize_trace_kprobe_event(struct probe_point *pp) ...@@ -319,6 +335,7 @@ int synthesize_trace_kprobe_event(struct probe_point *pp)
return pp->found; return pp->found;
error: error:
free(pp->probes[0]); free(pp->probes[0]);
pp->probes[0] = NULL;
return ret; return ret;
} }
...@@ -418,7 +435,7 @@ static void show_perf_probe_event(const char *event, const char *place, ...@@ -418,7 +435,7 @@ static void show_perf_probe_event(const char *event, const char *place,
/* List up current perf-probe events */ /* List up current perf-probe events */
void show_perf_probe_events(void) void show_perf_probe_events(void)
{ {
int fd, nr; int fd;
struct probe_point pp; struct probe_point pp;
struct strlist *rawlist; struct strlist *rawlist;
struct str_node *ent; struct str_node *ent;
...@@ -430,10 +447,7 @@ void show_perf_probe_events(void) ...@@ -430,10 +447,7 @@ void show_perf_probe_events(void)
strlist__for_each(ent, rawlist) { strlist__for_each(ent, rawlist) {
parse_trace_kprobe_event(ent->s, &pp); parse_trace_kprobe_event(ent->s, &pp);
/* Synthesize only event probe point */ /* Synthesize only event probe point */
nr = pp.nr_args; synthesize_perf_probe_point(&pp);
pp.nr_args = 0;
synthesize_perf_probe_event(&pp);
pp.nr_args = nr;
/* Show an event */ /* Show an event */
show_perf_probe_event(pp.event, pp.probes[0], &pp); show_perf_probe_event(pp.event, pp.probes[0], &pp);
clear_probe_point(&pp); clear_probe_point(&pp);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
extern void parse_perf_probe_event(const char *str, struct probe_point *pp, extern void parse_perf_probe_event(const char *str, struct probe_point *pp,
bool *need_dwarf); bool *need_dwarf);
extern int synthesize_perf_probe_point(struct probe_point *pp);
extern int synthesize_perf_probe_event(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 void parse_trace_kprobe_event(const char *str, struct probe_point *pp);
extern int synthesize_trace_kprobe_event(struct probe_point *pp); extern int synthesize_trace_kprobe_event(struct probe_point *pp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment