diff options
| -rw-r--r-- | tools/perf/util/probe-event.c | 28 |
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) { |
