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>
This commit is contained in:
parent
614e2fdbd7
commit
be07afe92a
1 changed files with 25 additions and 3 deletions
|
@ -1519,9 +1519,31 @@ int parse_probe_trace_command(const char *cmd, struct probe_trace_event *tev)
|
|||
} else
|
||||
p = argv[1];
|
||||
fmt1_str = strtok_r(p, "+", &fmt);
|
||||
if (fmt1_str[0] == '0') /* only the address started with 0x */
|
||||
tp->address = strtoul(fmt1_str, NULL, 0);
|
||||
else {
|
||||
/* only the address started with 0x */
|
||||
if (fmt1_str[0] == '0') {
|
||||
/*
|
||||
* Fix a special case:
|
||||
* if address == 0, kernel reports something like:
|
||||
* p:probe_libc/abs_0 /lib/libc-2.18.so:0x (null) arg1=%ax
|
||||
* Newer kernel may fix that, but we want to
|
||||
* support old kernel also.
|
||||
*/
|
||||
if (strcmp(fmt1_str, "0x") == 0) {
|
||||
if (!argv[2] || strcmp(argv[2], "(null)")) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
tp->address = 0;
|
||||
|
||||
free(argv[2]);
|
||||
for (i = 2; argv[i + 1] != NULL; i++)
|
||||
argv[i] = argv[i + 1];
|
||||
|
||||
argv[i] = NULL;
|
||||
argc -= 1;
|
||||
} else
|
||||
tp->address = strtoul(fmt1_str, NULL, 0);
|
||||
} else {
|
||||
/* Only the symbol-based probe has offset */
|
||||
tp->symbol = strdup(fmt1_str);
|
||||
if (tp->symbol == NULL) {
|
||||
|
|
Loading…
Reference in a new issue