aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorWang Nan <wangnan0@huawei.com>2015-08-26 06:57:43 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2015-08-26 09:39:20 -0400
commitbe07afe92a09638db9159d2c0794487d66a437a2 (patch)
tree3c8318782b4cb90ae0629e39f050d2c430540f61 /tools
parent614e2fdbd79b47ddf63a1ccd3f2343e98c3077fb (diff)
perf probe: Fix list result when address is zero
When manually added uprobe point with zero address, 'perf probe -l' reports error. For example: # echo p:probe_libc/abs_0 /path/to/lib.bin:0x0 arg1=%ax > \ /sys/kernel/debug/tracing/uprobe_events # perf probe -l Error: Failed to show event list. Probing at 0x0 is possible and useful when lib.bin is not a normal shared object but is manually mapped. However, in this case kernel report: # cat /sys/kernel/debug/tracing/uprobe_events p:probe_libc/abs_0 /path/to/lib.bin:0x (null) arg1=%ax This patch supports the above kernel output. Signed-off-by: Wang Nan <wangnan0@huawei.com> Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Zefan Li <lizefan@huawei.com> Cc: pi3orama@163.com Link: http://lkml.kernel.org/r/1440586666-235233-5-git-send-email-wangnan0@huawei.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/util/probe-event.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index f7bacbb98865..926bcecc4a44 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1519,9 +1519,31 @@ int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev)
1519 } else 1519 } else
1520 p = argv[1]; 1520 p = argv[1];
1521 fmt1_str = strtok_r(p, "+", &fmt); 1521 fmt1_str = strtok_r(p, "+", &fmt);
1522 if (fmt1_str[0] == '0') /* only the address started with 0x */ 1522 /* only the address started with 0x */
1523 tp->address = strtoul(fmt1_str, NULL, 0); 1523 if (fmt1_str[0] == '0') {
1524 else { 1524 /*
1525 * Fix a special case:
1526 * if address == 0, kernel reports something like:
1527 * p:probe_libc/abs_0 /lib/libc-2.18.so:0x (null) arg1=%ax
1528 * Newer kernel may fix that, but we want to
1529 * support old kernel also.
1530 */
1531 if (strcmp(fmt1_str, "0x") == 0) {
1532 if (!argv[2] || strcmp(argv[2], "(null)")) {
1533 ret = -EINVAL;
1534 goto out;
1535 }
1536 tp->address = 0;
1537
1538 free(argv[2]);
1539 for (i = 2; argv[i + 1] != NULL; i++)
1540 argv[i] = argv[i + 1];
1541
1542 argv[i] = NULL;
1543 argc -= 1;
1544 } else
1545 tp->address = strtoul(fmt1_str, NULL, 0);
1546 } else {
1525 /* Only the symbol-based probe has offset */ 1547 /* Only the symbol-based probe has offset */
1526 tp->symbol = strdup(fmt1_str); 1548 tp->symbol = strdup(fmt1_str);
1527 if (tp->symbol == NULL) { 1549 if (tp->symbol == NULL) {