Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 177458
b: refs/heads/master
c: 7ef17aa
h: refs/heads/master
v: v3
  • Loading branch information
Masami Hiramatsu authored and Ingo Molnar committed Dec 15, 2009
1 parent dcf7212 commit c91f399
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 62bdc1b38e2abf3f500229c3bf4c82d33575d1ae
refs/heads/master: 7ef17aafc98406d01ebbf7fe98ef1332b70d20bb
7 changes: 5 additions & 2 deletions trunk/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 trunk/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 trunk/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 c91f399

Please sign in to comment.