Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1213737 > unrolled thread
| Started by | Wang Nan <wangnan0@huawei.com> |
|---|---|
| First post | 2015-08-26 13:00 +0200 |
| Last post | 2015-08-26 13:10 +0200 |
| Articles | 17 — 4 participants |
Back to article view | Back to linux.kernel
[PATCH v3 0/6] perf probe, tracing/uprobes: Support probing at absolute address Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:00 +0200
[PATCH v3 6/6] tracing/uprobes: Do not print '0x (null)' when offset is 0 Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:00 +0200
[tip:perf/core] tracing/uprobes: Do not print '0x (null)' when offset is 0 tip-bot for Wang Nan <tipbot@zytor.com> - 2015-08-28 08:50 +0200
[PATCH v3 2/6] perf probe: Fix list result when symbol can't be found Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:00 +0200
RE: [PATCH v3 2/6] perf probe: Fix list result when symbol can't be found 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> - 2015-08-26 14:30 +0200
[tip:perf/core] perf probe: Fix list result when symbol can' t be found tip-bot for Wang Nan <tipbot@zytor.com> - 2015-08-28 08:50 +0200
[PATCH v3 5/6] perf probe: Support probing at absolute address Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:00 +0200
RE: [PATCH v3 5/6] perf probe: Support probing at absolute address 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> - 2015-08-26 14:20 +0200
[tip:perf/core] perf probe: Support probing at absolute address tip-bot for Wang Nan <tipbot@zytor.com> - 2015-08-28 08:50 +0200
[PATCH v3 4/6] perf probe: Fix error reported when offset without function Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:00 +0200
RE: [PATCH v3 4/6] perf probe: Fix error reported when offset without function 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> - 2015-08-26 14:30 +0200
[tip:perf/core] perf probe: Fix error reported when offset without function tip-bot for Wang Nan <tipbot@zytor.com> - 2015-08-28 08:50 +0200
[PATCH v3 3/6] perf probe: Fix list result when address is zero Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:10 +0200
RE: [PATCH v3 3/6] perf probe: Fix list result when address is zero 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> - 2015-08-26 14:20 +0200
[tip:perf/core] perf probe: Fix list result when address is zero tip-bot for Wang Nan <tipbot@zytor.com> - 2015-08-28 08:50 +0200
Re: [PATCH v3 2/6] perf probe: Fix list result when neither dwarf nor map can't find symbol "Wangnan (F)" <wangnan0@huawei.com> - 2015-08-26 13:10 +0200
[PATCH v3 2/6] perf probe: Fix list result when neither dwarf nor map can't find symbol Wang Nan <wangnan0@huawei.com> - 2015-08-26 13:10 +0200
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-08-26 13:00 +0200 |
| Subject | [PATCH v3 0/6] perf probe, tracing/uprobes: Support probing at absolute address |
| Message-ID | <q1GAW-3v0-5@gated-at.bofh.it> |
The goal of these 4 patches is to allow perf probing at absolute address
for uprobes and kprobes. During the development several small problem in
'perf probe -l' is found and fixed.
Patch v2 can be found from [1].
Following Masami's suggestion, v3 splits bugfixs into their own
patches instead of merging with feature.
In this series, patch 1/6 to 4/6 are small bugfix. Patch 5/6 is the main
patch which support the new syntax. Patch 6/6 is a kernel side small bugfix.
Patch 1/6 and 6/6 have already been acked by Masami Hiramatsu.
[1] http://lkml.kernel.org/r/1440574825-221187-1-git-send-email-wangnan0@huawei.com
Wang Nan (6):
perf probe: Prevent segfault when reading probe point with absolute
address
perf probe: Fix list result when symbol can't be found
perf probe: Fix list result when address is zero
perf probe: Fix error reported when offset without function
perf probe: Support probing at absolute address
tracing/uprobes: Do not print '0x (null)' when offset is 0
kernel/trace/trace_uprobe.c | 17 +++-
tools/perf/util/probe-event.c | 210 +++++++++++++++++++++++++++++++++++++----
tools/perf/util/probe-event.h | 4 +
tools/perf/util/probe-finder.c | 21 +----
4 files changed, 216 insertions(+), 36 deletions(-)
--
1.8.3.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-08-26 13:00 +0200 |
| Subject | [PATCH v3 6/6] tracing/uprobes: Do not print '0x (null)' when offset is 0 |
| Message-ID | <q1GAW-3v0-11@gated-at.bofh.it> |
| In reply to | #1213737 |
When manually added uprobe point with zero address, 'uprobe_events' output
'(null)' instead of 0x00000000:
# echo p:probe_libc/abs_0 /path/to/lib.bin:0x0 arg1=%ax > \
/sys/kernel/debug/tracing/uprobe_events
# cat /sys/kernel/debug/tracing/uprobe_events
p:probe_libc/abs_0 /path/to/lib.bin:0x (null) arg1=%ax
This patch fixes this behavior:
# cat /sys/kernel/debug/tracing/uprobe_events
p:probe_libc/abs_0 /path/to/lib.bin:0x0000000000000000
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
kernel/trace/trace_uprobe.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c
index f97479f..d2f6d0b 100644
--- a/kernel/trace/trace_uprobe.c
+++ b/kernel/trace/trace_uprobe.c
@@ -601,7 +601,22 @@ static int probes_seq_show(struct seq_file *m, void *v)
seq_printf(m, "%c:%s/%s", c, tu->tp.call.class->system,
trace_event_name(&tu->tp.call));
- seq_printf(m, " %s:0x%p", tu->filename, (void *)tu->offset);
+ seq_printf(m, " %s:", tu->filename);
+
+ /* Don't print "0x (null)" when offset is 0 */
+ if (tu->offset) {
+ seq_printf(m, "0x%p", (void *)tu->offset);
+ } else {
+ switch (sizeof(void *)) {
+ case 4:
+ seq_printf(m, "0x00000000");
+ break;
+ case 8:
+ default:
+ seq_printf(m, "0x0000000000000000");
+ break;
+ }
+ }
for (i = 0; i < tu->tp.nr_args; i++)
seq_printf(m, " %s=%s", tu->tp.args[i].name, tu->tp.args[i].comm);
--
1.8.3.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Wang Nan <tipbot@zytor.com> |
|---|---|
| Date | 2015-08-28 08:50 +0200 |
| Subject | [tip:perf/core] tracing/uprobes: Do not print '0x (null)' when offset is 0 |
| Message-ID | <q2lE7-3R6-29@gated-at.bofh.it> |
| In reply to | #1213738 |
Commit-ID: a2fb3382edbea83c6f2bf6ac15e3673b2e254aad
Gitweb: http://git.kernel.org/tip/a2fb3382edbea83c6f2bf6ac15e3673b2e254aad
Author: Wang Nan <wangnan0@huawei.com>
AuthorDate: Wed, 26 Aug 2015 10:57:46 +0000
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 26 Aug 2015 10:43:01 -0300
tracing/uprobes: Do not print '0x (null)' when offset is 0
When manually added uprobe point with zero address, 'uprobe_events'
output '(null)' instead of 0x00000000:
# echo p:probe_libc/abs_0 /path/to/lib.bin:0x0 arg1=%ax > \
/sys/kernel/debug/tracing/uprobe_events
# cat /sys/kernel/debug/tracing/uprobe_events
p:probe_libc/abs_0 /path/to/lib.bin:0x (null) arg1=%ax
This patch fixes this behavior:
# cat /sys/kernel/debug/tracing/uprobe_events
p:probe_libc/abs_0 /path/to/lib.bin:0x0000000000000000
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-8-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
kernel/trace/trace_uprobe.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c
index f97479f..d2f6d0b 100644
--- a/kernel/trace/trace_uprobe.c
+++ b/kernel/trace/trace_uprobe.c
@@ -601,7 +601,22 @@ static int probes_seq_show(struct seq_file *m, void *v)
seq_printf(m, "%c:%s/%s", c, tu->tp.call.class->system,
trace_event_name(&tu->tp.call));
- seq_printf(m, " %s:0x%p", tu->filename, (void *)tu->offset);
+ seq_printf(m, " %s:", tu->filename);
+
+ /* Don't print "0x (null)" when offset is 0 */
+ if (tu->offset) {
+ seq_printf(m, "0x%p", (void *)tu->offset);
+ } else {
+ switch (sizeof(void *)) {
+ case 4:
+ seq_printf(m, "0x00000000");
+ break;
+ case 8:
+ default:
+ seq_printf(m, "0x0000000000000000");
+ break;
+ }
+ }
for (i = 0; i < tu->tp.nr_args; i++)
seq_printf(m, " %s=%s", tu->tp.args[i].name, tu->tp.args[i].comm);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-08-26 13:00 +0200 |
| Subject | [PATCH v3 2/6] perf probe: Fix list result when symbol can't be found |
| Message-ID | <q1GAW-3v0-9@gated-at.bofh.it> |
| In reply to | #1213737 |
'perf probe -l' reports error if it is unable find symbol through
address. Here is an example.
# echo 'p:probe_libc/abs_5 /lib64/libc.so.6:0x5' >
/sys/kernel/debug/tracing/uprobe_events
# cat /sys/kernel/debug/tracing/uprobe_events
p:probe_libc/abs_5 /lib64/libc.so.6:0x0000000000000005
# perf probe -l
Error: Failed to show event list
Also, this situation triggers a logical inconsistency in
convert_to_perf_probe_point() that, it returns ENOMEM but actually
it never try strdup().
This patch removes !tp->module && !is_kprobe condition, so it
always uses address to build function name if symbol not found.
Test result:
# perf probe -l
probe_libc:abs_5 (on 0x5 in /lib64/libc.so.6)
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
tools/perf/util/probe-event.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 6c7e538..f7bacbb 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1866,7 +1866,7 @@ static int convert_to_perf_probe_point(struct probe_trace_point *tp,
if (tp->symbol) {
pp->function = strdup(tp->symbol);
pp->offset = tp->offset;
- } else if (!tp->module && !is_kprobe) {
+ } else {
ret = e_snprintf(buf, 128, "0x%" PRIx64, (u64)tp->address);
if (ret < 0)
return ret;
--
1.8.3.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-08-26 14:30 +0200 |
| Subject | RE: [PATCH v3 2/6] perf probe: Fix list result when symbol can't be found |
| Message-ID | <q1I02-5Dg-13@gated-at.bofh.it> |
| In reply to | #1213739 |
PiBGcm9tOiBXYW5nIE5hbiBbbWFpbHRvOndhbmduYW4wQGh1YXdlaS5jb21dDQo+IA0KPiAncGVy ZiBwcm9iZSAtbCcgcmVwb3J0cyBlcnJvciBpZiBpdCBpcyB1bmFibGUgZmluZCBzeW1ib2wgdGhy b3VnaA0KPiBhZGRyZXNzLiBIZXJlIGlzIGFuIGV4YW1wbGUuDQo+IA0KPiAgIyBlY2hvICdwOnBy b2JlX2xpYmMvYWJzXzUgL2xpYjY0L2xpYmMuc28uNjoweDUnID4NCj4gICAgICAgICAgIC9zeXMv a2VybmVsL2RlYnVnL3RyYWNpbmcvdXByb2JlX2V2ZW50cw0KPiAgIyBjYXQgL3N5cy9rZXJuZWwv ZGVidWcvdHJhY2luZy91cHJvYmVfZXZlbnRzDQo+ICAgcDpwcm9iZV9saWJjL2Fic181IC9saWI2 NC9saWJjLnNvLjY6MHgwMDAwMDAwMDAwMDAwMDA1DQo+ICAjIHBlcmYgcHJvYmUgLWwNCj4gICAg RXJyb3I6IEZhaWxlZCB0byBzaG93IGV2ZW50IGxpc3QNCj4gDQo+IEFsc28sIHRoaXMgc2l0dWF0 aW9uIHRyaWdnZXJzIGEgbG9naWNhbCBpbmNvbnNpc3RlbmN5IGluDQo+IGNvbnZlcnRfdG9fcGVy Zl9wcm9iZV9wb2ludCgpIHRoYXQsIGl0IHJldHVybnMgRU5PTUVNIGJ1dCBhY3R1YWxseQ0KPiBp dCBuZXZlciB0cnkgc3RyZHVwKCkuDQo+IA0KPiBUaGlzIHBhdGNoIHJlbW92ZXMgIXRwLT5tb2R1 bGUgJiYgIWlzX2twcm9iZSBjb25kaXRpb24sIHNvIGl0DQo+IGFsd2F5cyB1c2VzIGFkZHJlc3Mg dG8gYnVpbGQgZnVuY3Rpb24gbmFtZSBpZiBzeW1ib2wgbm90IGZvdW5kLg0KPiANCj4gVGVzdCBy ZXN1bHQ6DQo+IA0KPiAgIyBwZXJmIHByb2JlIC1sDQo+ICAgIHByb2JlX2xpYmM6YWJzXzUgICAg IChvbiAweDUgaW4gL2xpYjY0L2xpYmMuc28uNikNCj4gDQoNCkxvb2tzIGdvb2QhDQoNCkFja2Vk LWJ5OiBNYXNhbWkgSGlyYW1hdHN1IDxtYXNhbWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29tPg0K DQpUaGFuayB5b3UhDQoNCj4gU2lnbmVkLW9mZi1ieTogV2FuZyBOYW4gPHdhbmduYW4wQGh1YXdl aS5jb20+DQo+IENjOiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAa2VybmVsLm9yZz4N Cj4gQ2M6IEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPg0KPiBDYzogTWFzYW1pIEhpcmFt YXRzdSA8bWFzYW1pLmhpcmFtYXRzdS5wdEBoaXRhY2hpLmNvbT4NCj4gQ2M6IE5hbWh5dW5nIEtp bSA8bmFtaHl1bmdAa2VybmVsLm9yZz4NCj4gQ2M6IFN0ZXZlbiBSb3N0ZWR0IDxyb3N0ZWR0QGdv b2RtaXMub3JnPg0KPiAtLS0NCj4gIHRvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jIHwgMiAr LQ0KPiAgMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCspLCAxIGRlbGV0aW9uKC0pDQo+IA0K PiBkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMgYi90b29scy9wZXJm L3V0aWwvcHJvYmUtZXZlbnQuYw0KPiBpbmRleCA2YzdlNTM4Li5mN2JhY2JiIDEwMDY0NA0KPiAt LS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYw0KPiArKysgYi90b29scy9wZXJmL3V0 aWwvcHJvYmUtZXZlbnQuYw0KPiBAQCAtMTg2Niw3ICsxODY2LDcgQEAgc3RhdGljIGludCBjb252 ZXJ0X3RvX3BlcmZfcHJvYmVfcG9pbnQoc3RydWN0IHByb2JlX3RyYWNlX3BvaW50ICp0cCwNCj4g IAlpZiAodHAtPnN5bWJvbCkgew0KPiAgCQlwcC0+ZnVuY3Rpb24gPSBzdHJkdXAodHAtPnN5bWJv bCk7DQo+ICAJCXBwLT5vZmZzZXQgPSB0cC0+b2Zmc2V0Ow0KPiAtCX0gZWxzZSBpZiAoIXRwLT5t b2R1bGUgJiYgIWlzX2twcm9iZSkgew0KPiArCX0gZWxzZSB7DQo+ICAJCXJldCA9IGVfc25wcmlu dGYoYnVmLCAxMjgsICIweCUiIFBSSXg2NCwgKHU2NCl0cC0+YWRkcmVzcyk7DQo+ICAJCWlmIChy ZXQgPCAwKQ0KPiAgCQkJcmV0dXJuIHJldDsNCj4gLS0NCj4gMS44LjMuNA0KDQo= -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Wang Nan <tipbot@zytor.com> |
|---|---|
| Date | 2015-08-28 08:50 +0200 |
| Subject | [tip:perf/core] perf probe: Fix list result when symbol can' t be found |
| Message-ID | <q2lE6-3R6-17@gated-at.bofh.it> |
| In reply to | #1213739 |
Commit-ID: 614e2fdbd79b47ddf63a1ccd3f2343e98c3077fb
Gitweb: http://git.kernel.org/tip/614e2fdbd79b47ddf63a1ccd3f2343e98c3077fb
Author: Wang Nan <wangnan0@huawei.com>
AuthorDate: Wed, 26 Aug 2015 10:57:42 +0000
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 26 Aug 2015 10:36:04 -0300
perf probe: Fix list result when symbol can't be found
'perf probe -l' reports error if it is unable find symbol through
address. Here is an example.
# echo 'p:probe_libc/abs_5 /lib64/libc.so.6:0x5' >
/sys/kernel/debug/tracing/uprobe_events
# cat /sys/kernel/debug/tracing/uprobe_events
p:probe_libc/abs_5 /lib64/libc.so.6:0x0000000000000005
# perf probe -l
Error: Failed to show event list
Also, this situation triggers a logical inconsistency in
convert_to_perf_probe_point() that, it returns ENOMEM but actually it
never try strdup().
This patch removes !tp->module && !is_kprobe condition, so it always
uses address to build function name if symbol not found.
Test result:
# perf probe -l
probe_libc:abs_5 (on 0x5 in /lib64/libc.so.6)
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-4-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/probe-event.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 6c7e538..f7bacbb 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1866,7 +1866,7 @@ static int convert_to_perf_probe_point(struct probe_trace_point *tp,
if (tp->symbol) {
pp->function = strdup(tp->symbol);
pp->offset = tp->offset;
- } else if (!tp->module && !is_kprobe) {
+ } else {
ret = e_snprintf(buf, 128, "0x%" PRIx64, (u64)tp->address);
if (ret < 0)
return ret;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-08-26 13:00 +0200 |
| Subject | [PATCH v3 5/6] perf probe: Support probing at absolute address |
| Message-ID | <q1GAW-3v0-17@gated-at.bofh.it> |
| In reply to | #1213737 |
It should be useful to allow 'perf probe' probe at absolute offset of
a target. For example, when (u)probing at a instruction of a shared
object in a embedded system where debuginfo is not avaliable but we
know the offset of that instruction by manually digging.
This patch enables following perf probe command syntax:
# perf probe 0xffffffff811e6615
And
# perf probe /lib/x86_64-linux-gnu/libc-2.19.so 0xeb860
In the above example, we don't need a anchor symbol, so it is possible
to compute absolute addresses using other methods and then use
'perf probe' to create the probing points.
v1 -> v2:
Drop the leading '+' in cmdline;
Allow uprobing at offset 0x0;
Improve 'perf probe -l' result when uprobe at area without debuginfo.
v2 -> v3:
Split bugfix to a separated patch.
Test result:
# perf probe 0xffffffff8119d175 %ax
# perf probe sys_write %ax
# perf probe /lib64/libc-2.18.so 0x0 %ax
# perf probe /lib64/libc-2.18.so 0x5 %ax
# perf probe /lib64/libc-2.18.so 0xd8e40 %ax
# perf probe /lib64/libc-2.18.so __write %ax
# perf probe /lib64/libc-2.18.so 0xd8e49 %ax
# cat /sys/kernel/debug/tracing/uprobe_events
p:probe_libc/abs_0 /lib64/libc-2.18.so:0x (null) arg1=%ax
p:probe_libc/abs_5 /lib64/libc-2.18.so:0x0000000000000005 arg1=%ax
p:probe_libc/abs_d8e40 /lib64/libc-2.18.so:0x00000000000d8e40 arg1=%ax
p:probe_libc/__write /lib64/libc-2.18.so:0x00000000000d8e40 arg1=%ax
p:probe_libc/abs_d8e49 /lib64/libc-2.18.so:0x00000000000d8e49 arg1=%ax
# cat /sys/kernel/debug/tracing/kprobe_events
p:probe/abs_ffffffff8119d175 0xffffffff8119d175 arg1=%ax
p:probe/sys_write _text+1692016 arg1=%ax
# perf probe -l
Failed to find debug information for address 5
probe:abs_ffffffff8119d175 (on sys_write+5 with arg1)
probe:sys_write (on sys_write with arg1)
probe_libc:__write (on @unix/syscall-template.S:81 in /lib64/libc-2.18.so with arg1)
probe_libc:abs_0 (on 0x0 in /lib64/libc-2.18.so with arg1)
probe_libc:abs_5 (on 0x5 in /lib64/libc-2.18.so with arg1)
probe_libc:abs_d8e40 (on @unix/syscall-template.S:81 in /lib64/libc-2.18.so with arg1)
probe_libc:abs_d8e49 (on __GI___libc_write+9 in /lib64/libc-2.18.so with arg1)
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
tools/perf/util/probe-event.c | 162 +++++++++++++++++++++++++++++++++++++++--
tools/perf/util/probe-event.h | 4 +
tools/perf/util/probe-finder.c | 21 +-----
3 files changed, 163 insertions(+), 24 deletions(-)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index eaacb58..eb5f18b 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1204,9 +1204,27 @@ static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev)
if (file_spec)
pp->file = tmp;
- else
+ else {
pp->function = tmp;
+ /*
+ * Keep pp->function even if this is absolute address,
+ * so it can mark whether abs_address is valid.
+ * Which make 'perf probe lib.bin 0x0' possible.
+ *
+ * Note that checking length of tmp is not needed
+ * because when we access tmp[1] we know tmp[0] is '0',
+ * so tmp[1] should always valid (but could be '\0').
+ */
+ if (tmp && !strncmp(tmp, "0x", 2)) {
+ pp->abs_address = strtoul(pp->function, &tmp, 0);
+ if (*tmp != '\0') {
+ semantic_error("Invalid absolute address.\n");
+ return -EINVAL;
+ }
+ }
+ }
+
/* Parse other options */
while (ptr) {
arg = ptr;
@@ -1804,14 +1822,29 @@ char *synthesize_probe_trace_command(struct probe_trace_event *tev)
if (len <= 0)
goto error;
- /* Uprobes must have tp->address and tp->module */
- if (tev->uprobes && (!tp->address || !tp->module))
+ /* Uprobes must have tp->module */
+ if (tev->uprobes && !tp->module)
goto error;
+ /*
+ * If tp->address == 0, then this point must be a
+ * absolute address uprobe.
+ * try_to_find_absolute_address() should have made
+ * tp->symbol to "0x0".
+ */
+ if (tev->uprobes && !tp->address) {
+ if (!tp->symbol || strcmp(tp->symbol, "0x0"))
+ goto error;
+ }
/* Use the tp->address for uprobes */
if (tev->uprobes)
ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s:0x%lx",
tp->module, tp->address);
+ else if (!strncmp(tp->symbol, "0x", 2))
+ /* Absolute address. See try_to_find_absolute_address() */
+ ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s0x%lx",
+ tp->module ?: "", tp->module ? ":" : "",
+ tp->address);
else
ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s%s+%lu",
tp->module ?: "", tp->module ? ":" : "",
@@ -1874,8 +1907,8 @@ out:
}
static int convert_to_perf_probe_point(struct probe_trace_point *tp,
- struct perf_probe_point *pp,
- bool is_kprobe)
+ struct perf_probe_point *pp,
+ bool is_kprobe)
{
char buf[128];
int ret;
@@ -2331,7 +2364,9 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev,
if (pev->event)
event = pev->event;
else
- if (pev->point.function && !strisglob(pev->point.function))
+ if (pev->point.function &&
+ (strncmp(pev->point.function, "0x", 2) != 0) &&
+ !strisglob(pev->point.function))
event = pev->point.function;
else
event = tev->point.realname;
@@ -2598,6 +2633,98 @@ err_out:
goto out;
}
+static int try_to_find_absolute_address(struct perf_probe_event *pev,
+ struct probe_trace_event **tevs)
+{
+ struct perf_probe_point *pp = &pev->point;
+ struct probe_trace_event *tev;
+ struct probe_trace_point *tp;
+ int i, err;
+
+ if (!(pev->point.function && !strncmp(pev->point.function, "0x", 2)))
+ return -EINVAL;
+ if (perf_probe_event_need_dwarf(pev))
+ return -EINVAL;
+
+ /*
+ * This is 'perf probe /lib/libc.so 0xabcd'. Try to probe at
+ * absolute address.
+ *
+ * Only one tev can be generated by this.
+ */
+ *tevs = zalloc(sizeof(*tev));
+ if (!*tevs)
+ return -ENOMEM;
+
+ tev = *tevs;
+ tp = &tev->point;
+
+ /*
+ * Don't use tp->offset, use address directly, because
+ * in synthesize_probe_trace_command() address cannot be
+ * zero.
+ */
+ tp->address = pev->point.abs_address;
+ tp->retprobe = pp->retprobe;
+ tev->uprobes = pev->uprobes;
+
+ err = -ENOMEM;
+ /*
+ * Give it a '0x' leading symbol name.
+ * In __add_probe_trace_events, a NULL symbol is interpreted as
+ * invalud.
+ */
+ if (asprintf(&tp->symbol, "0x%lx", tp->address) < 0)
+ goto errout;
+
+ /* For kprobe, check range */
+ if ((!tev->uprobes) &&
+ (kprobe_warn_out_range(tev->point.symbol,
+ tev->point.address))) {
+ err = -EACCES;
+ goto errout;
+ }
+
+ if (asprintf(&tp->realname, "abs_%lx", tp->address) < 0)
+ goto errout;
+
+ if (pev->target) {
+ tp->module = strdup(pev->target);
+ if (!tp->module)
+ goto errout;
+ }
+
+ if (tev->group) {
+ tev->group = strdup(pev->group);
+ if (!tev->group)
+ goto errout;
+ }
+
+ if (pev->event) {
+ tev->event = strdup(pev->event);
+ if (!tev->event)
+ goto errout;
+ }
+
+ tev->nargs = pev->nargs;
+ tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs);
+ if (!tev->args) {
+ err = -ENOMEM;
+ goto errout;
+ }
+ for (i = 0; i < tev->nargs; i++)
+ copy_to_probe_trace_arg(&tev->args[i], &pev->args[i]);
+
+ return 1;
+
+errout:
+ if (*tevs) {
+ clear_probe_trace_events(*tevs, 1);
+ *tevs = NULL;
+ }
+ return err;
+}
+
bool __weak arch__prefers_symtab(void) { return false; }
static int convert_to_probe_trace_events(struct perf_probe_event *pev,
@@ -2614,6 +2741,10 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
}
}
+ ret = try_to_find_absolute_address(pev, tevs);
+ if (ret > 0)
+ return ret;
+
if (arch__prefers_symtab() && !perf_probe_event_need_dwarf(pev)) {
ret = find_probe_trace_events_from_map(pev, tevs);
if (ret > 0)
@@ -2784,3 +2915,22 @@ end:
return ret;
}
+int copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
+ struct perf_probe_arg *pvar)
+{
+ tvar->value = strdup(pvar->var);
+ if (tvar->value == NULL)
+ return -ENOMEM;
+ if (pvar->type) {
+ tvar->type = strdup(pvar->type);
+ if (tvar->type == NULL)
+ return -ENOMEM;
+ }
+ if (pvar->name) {
+ tvar->name = strdup(pvar->name);
+ if (tvar->name == NULL)
+ return -ENOMEM;
+ } else
+ tvar->name = NULL;
+ return 0;
+}
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 83ee95e..6e7ec68 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -59,6 +59,7 @@ struct perf_probe_point {
bool retprobe; /* Return probe flag */
char *lazy_line; /* Lazy matching pattern */
unsigned long offset; /* Offset from function entry */
+ unsigned long abs_address; /* Absolute address of the point */
};
/* Perf probe probing argument field chain */
@@ -156,4 +157,7 @@ int e_snprintf(char *str, size_t size, const char *format, ...)
/* Maximum index number of event-name postfix */
#define MAX_EVENT_INDEX 1024
+int copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
+ struct perf_probe_arg *pvar);
+
#endif /*_PROBE_EVENT_H */
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 7b80f8c..29c43c068 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -553,24 +553,9 @@ static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf)
char buf[32], *ptr;
int ret = 0;
- if (!is_c_varname(pf->pvar->var)) {
- /* Copy raw parameters */
- pf->tvar->value = strdup(pf->pvar->var);
- if (pf->tvar->value == NULL)
- return -ENOMEM;
- if (pf->pvar->type) {
- pf->tvar->type = strdup(pf->pvar->type);
- if (pf->tvar->type == NULL)
- return -ENOMEM;
- }
- if (pf->pvar->name) {
- pf->tvar->name = strdup(pf->pvar->name);
- if (pf->tvar->name == NULL)
- return -ENOMEM;
- } else
- pf->tvar->name = NULL;
- return 0;
- }
+ /* Copy raw parameters */
+ if (!is_c_varname(pf->pvar->var))
+ return copy_to_probe_trace_arg(pf->tvar, pf->pvar);
if (pf->pvar->name)
pf->tvar->name = strdup(pf->pvar->name);
--
1.8.3.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-08-26 14:20 +0200 |
| Subject | RE: [PATCH v3 5/6] perf probe: Support probing at absolute address |
| Message-ID | <q1HQm-5s4-19@gated-at.bofh.it> |
| In reply to | #1213740 |
PiBGcm9tOiBXYW5nIE5hbiBbbWFpbHRvOndhbmduYW4wQGh1YXdlaS5jb21dDQo+IA0KPiBJdCBz aG91bGQgYmUgdXNlZnVsIHRvIGFsbG93ICdwZXJmIHByb2JlJyBwcm9iZSBhdCBhYnNvbHV0ZSBv ZmZzZXQgb2YNCj4gYSB0YXJnZXQuIEZvciBleGFtcGxlLCB3aGVuICh1KXByb2JpbmcgYXQgYSBp bnN0cnVjdGlvbiBvZiBhIHNoYXJlZA0KPiBvYmplY3QgaW4gYSBlbWJlZGRlZCBzeXN0ZW0gd2hl cmUgZGVidWdpbmZvIGlzIG5vdCBhdmFsaWFibGUgYnV0IHdlDQo+IGtub3cgdGhlIG9mZnNldCBv ZiB0aGF0IGluc3RydWN0aW9uIGJ5IG1hbnVhbGx5IGRpZ2dpbmcuDQo+IA0KPiBUaGlzIHBhdGNo IGVuYWJsZXMgZm9sbG93aW5nIHBlcmYgcHJvYmUgY29tbWFuZCBzeW50YXg6DQo+IA0KPiAgIyBw ZXJmIHByb2JlIDB4ZmZmZmZmZmY4MTFlNjYxNQ0KPiANCj4gQW5kDQo+IA0KPiAgIyBwZXJmIHBy b2JlIC9saWIveDg2XzY0LWxpbnV4LWdudS9saWJjLTIuMTkuc28gMHhlYjg2MA0KPiANCj4gSW4g dGhlIGFib3ZlIGV4YW1wbGUsIHdlIGRvbid0IG5lZWQgYSBhbmNob3Igc3ltYm9sLCBzbyBpdCBp cyBwb3NzaWJsZQ0KPiB0byBjb21wdXRlIGFic29sdXRlIGFkZHJlc3NlcyB1c2luZyBvdGhlciBt ZXRob2RzIGFuZCB0aGVuIHVzZQ0KPiAncGVyZiBwcm9iZScgdG8gY3JlYXRlIHRoZSBwcm9iaW5n IHBvaW50cy4NCg0KT0ssIG5vdyBsb29rcyBnb29kIHRvIG1lIDpEDQoNCkFja2VkLWJ5OiBNYXNh bWkgSGlyYW1hdHN1IDxtYXNhbWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29tPg0KDQpUaGFuayB5 b3UsDQoNCj4gDQo+IHYxIC0+IHYyOg0KPiAgIERyb3AgdGhlIGxlYWRpbmcgJysnIGluIGNtZGxp bmU7DQo+ICAgQWxsb3cgdXByb2JpbmcgYXQgb2Zmc2V0IDB4MDsNCj4gICBJbXByb3ZlICdwZXJm IHByb2JlIC1sJyByZXN1bHQgd2hlbiB1cHJvYmUgYXQgYXJlYSB3aXRob3V0IGRlYnVnaW5mby4N Cj4gDQo+IHYyIC0+IHYzOg0KPiAgIFNwbGl0IGJ1Z2ZpeCB0byBhIHNlcGFyYXRlZCBwYXRjaC4N Cj4gDQo+IFRlc3QgcmVzdWx0Og0KPiANCj4gICMgcGVyZiBwcm9iZSAweGZmZmZmZmZmODExOWQx NzUgJWF4DQo+ICAjIHBlcmYgcHJvYmUgc3lzX3dyaXRlICVheA0KPiAgIyBwZXJmIHByb2JlIC9s aWI2NC9saWJjLTIuMTguc28gMHgwICVheA0KPiAgIyBwZXJmIHByb2JlIC9saWI2NC9saWJjLTIu MTguc28gMHg1ICVheA0KPiAgIyBwZXJmIHByb2JlIC9saWI2NC9saWJjLTIuMTguc28gMHhkOGU0 MCAlYXgNCj4gICMgcGVyZiBwcm9iZSAvbGliNjQvbGliYy0yLjE4LnNvIF9fd3JpdGUgJWF4DQo+ ICAjIHBlcmYgcHJvYmUgL2xpYjY0L2xpYmMtMi4xOC5zbyAweGQ4ZTQ5ICVheA0KPiAgIyBjYXQg L3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy91cHJvYmVfZXZlbnRzDQo+IA0KPiAgcDpwcm9iZV9s aWJjL2Fic18wIC9saWI2NC9saWJjLTIuMTguc286MHggICAgICAgICAgKG51bGwpIGFyZzE9JWF4 DQo+ICBwOnByb2JlX2xpYmMvYWJzXzUgL2xpYjY0L2xpYmMtMi4xOC5zbzoweDAwMDAwMDAwMDAw MDAwMDUgYXJnMT0lYXgNCj4gIHA6cHJvYmVfbGliYy9hYnNfZDhlNDAgL2xpYjY0L2xpYmMtMi4x OC5zbzoweDAwMDAwMDAwMDAwZDhlNDAgYXJnMT0lYXgNCj4gIHA6cHJvYmVfbGliYy9fX3dyaXRl IC9saWI2NC9saWJjLTIuMTguc286MHgwMDAwMDAwMDAwMGQ4ZTQwIGFyZzE9JWF4DQo+ICBwOnBy b2JlX2xpYmMvYWJzX2Q4ZTQ5IC9saWI2NC9saWJjLTIuMTguc286MHgwMDAwMDAwMDAwMGQ4ZTQ5 IGFyZzE9JWF4DQo+IA0KPiAgIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy9rcHJvYmVf ZXZlbnRzDQo+IA0KPiAgcDpwcm9iZS9hYnNfZmZmZmZmZmY4MTE5ZDE3NSAweGZmZmZmZmZmODEx OWQxNzUgYXJnMT0lYXgNCj4gIHA6cHJvYmUvc3lzX3dyaXRlIF90ZXh0KzE2OTIwMTYgYXJnMT0l YXgNCj4gDQo+ICAjIHBlcmYgcHJvYmUgLWwNCj4gDQo+ICBGYWlsZWQgdG8gZmluZCBkZWJ1ZyBp bmZvcm1hdGlvbiBmb3IgYWRkcmVzcyA1DQo+ICAgIHByb2JlOmFic19mZmZmZmZmZjgxMTlkMTc1 IChvbiBzeXNfd3JpdGUrNSB3aXRoIGFyZzEpDQo+ICAgIHByb2JlOnN5c193cml0ZSAgICAgIChv biBzeXNfd3JpdGUgd2l0aCBhcmcxKQ0KPiAgICBwcm9iZV9saWJjOl9fd3JpdGUgICAob24gQHVu aXgvc3lzY2FsbC10ZW1wbGF0ZS5TOjgxIGluIC9saWI2NC9saWJjLTIuMTguc28gd2l0aCBhcmcx KQ0KPiAgICBwcm9iZV9saWJjOmFic18wICAgICAob24gMHgwIGluIC9saWI2NC9saWJjLTIuMTgu c28gd2l0aCBhcmcxKQ0KPiAgICBwcm9iZV9saWJjOmFic181ICAgICAob24gMHg1IGluIC9saWI2 NC9saWJjLTIuMTguc28gd2l0aCBhcmcxKQ0KPiAgICBwcm9iZV9saWJjOmFic19kOGU0MCAob24g QHVuaXgvc3lzY2FsbC10ZW1wbGF0ZS5TOjgxIGluIC9saWI2NC9saWJjLTIuMTguc28gd2l0aCBh cmcxKQ0KPiAgICBwcm9iZV9saWJjOmFic19kOGU0OSAob24gX19HSV9fX2xpYmNfd3JpdGUrOSBp biAvbGliNjQvbGliYy0yLjE4LnNvIHdpdGggYXJnMSkNCj4gDQo+IFNpZ25lZC1vZmYtYnk6IFdh bmcgTmFuIDx3YW5nbmFuMEBodWF3ZWkuY29tPg0KPiBDYzogQXJuYWxkbyBDYXJ2YWxobyBkZSBN ZWxvIDxhY21lQGtlcm5lbC5vcmc+DQo+IENjOiBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNv bT4NCj4gQ2M6IE1hc2FtaSBIaXJhbWF0c3UgPG1hc2FtaS5oaXJhbWF0c3UucHRAaGl0YWNoaS5j b20+DQo+IENjOiBOYW1oeXVuZyBLaW0gPG5hbWh5dW5nQGtlcm5lbC5vcmc+DQo+IENjOiBTdGV2 ZW4gUm9zdGVkdCA8cm9zdGVkdEBnb29kbWlzLm9yZz4NCj4gLS0tDQo+ICB0b29scy9wZXJmL3V0 aWwvcHJvYmUtZXZlbnQuYyAgfCAxNjIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrLS0NCj4gIHRvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oICB8ICAgNCArDQo+ICB0 b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMgfCAgMjEgKy0tLS0tDQo+ICAzIGZpbGVzIGNo YW5nZWQsIDE2MyBpbnNlcnRpb25zKCspLCAyNCBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1n aXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9i ZS1ldmVudC5jDQo+IGluZGV4IGVhYWNiNTguLmViNWYxOGIgMTAwNjQ0DQo+IC0tLSBhL3Rvb2xz L3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jDQo+ICsrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1l dmVudC5jDQo+IEBAIC0xMjA0LDkgKzEyMDQsMjcgQEAgc3RhdGljIGludCBwYXJzZV9wZXJmX3By b2JlX3BvaW50KGNoYXIgKmFyZywgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldikNCj4gDQo+ ICAJaWYgKGZpbGVfc3BlYykNCj4gIAkJcHAtPmZpbGUgPSB0bXA7DQo+IC0JZWxzZQ0KPiArCWVs c2Ugew0KPiAgCQlwcC0+ZnVuY3Rpb24gPSB0bXA7DQo+IA0KPiArCQkvKg0KPiArCQkgKiBLZWVw IHBwLT5mdW5jdGlvbiBldmVuIGlmIHRoaXMgaXMgYWJzb2x1dGUgYWRkcmVzcywNCj4gKwkJICog c28gaXQgY2FuIG1hcmsgd2hldGhlciBhYnNfYWRkcmVzcyBpcyB2YWxpZC4NCj4gKwkJICogV2hp Y2ggbWFrZSAncGVyZiBwcm9iZSBsaWIuYmluIDB4MCcgcG9zc2libGUuDQo+ICsJCSAqDQo+ICsJ CSAqIE5vdGUgdGhhdCBjaGVja2luZyBsZW5ndGggb2YgdG1wIGlzIG5vdCBuZWVkZWQNCj4gKwkJ ICogYmVjYXVzZSB3aGVuIHdlIGFjY2VzcyB0bXBbMV0gd2Uga25vdyB0bXBbMF0gaXMgJzAnLA0K PiArCQkgKiBzbyB0bXBbMV0gc2hvdWxkIGFsd2F5cyB2YWxpZCAoYnV0IGNvdWxkIGJlICdcMCcp Lg0KPiArCQkgKi8NCj4gKwkJaWYgKHRtcCAmJiAhc3RybmNtcCh0bXAsICIweCIsIDIpKSB7DQo+ ICsJCQlwcC0+YWJzX2FkZHJlc3MgPSBzdHJ0b3VsKHBwLT5mdW5jdGlvbiwgJnRtcCwgMCk7DQo+ ICsJCQlpZiAoKnRtcCAhPSAnXDAnKSB7DQo+ICsJCQkJc2VtYW50aWNfZXJyb3IoIkludmFsaWQg YWJzb2x1dGUgYWRkcmVzcy5cbiIpOw0KPiArCQkJCXJldHVybiAtRUlOVkFMOw0KPiArCQkJfQ0K PiArCQl9DQo+ICsJfQ0KPiArDQo+ICAJLyogUGFyc2Ugb3RoZXIgb3B0aW9ucyAqLw0KPiAgCXdo aWxlIChwdHIpIHsNCj4gIAkJYXJnID0gcHRyOw0KPiBAQCAtMTgwNCwxNCArMTgyMiwyOSBAQCBj aGFyICpzeW50aGVzaXplX3Byb2JlX3RyYWNlX2NvbW1hbmQoc3RydWN0IHByb2JlX3RyYWNlX2V2 ZW50ICp0ZXYpDQo+ICAJaWYgKGxlbiA8PSAwKQ0KPiAgCQlnb3RvIGVycm9yOw0KPiANCj4gLQkv KiBVcHJvYmVzIG11c3QgaGF2ZSB0cC0+YWRkcmVzcyBhbmQgdHAtPm1vZHVsZSAqLw0KPiAtCWlm ICh0ZXYtPnVwcm9iZXMgJiYgKCF0cC0+YWRkcmVzcyB8fCAhdHAtPm1vZHVsZSkpDQo+ICsJLyog VXByb2JlcyBtdXN0IGhhdmUgdHAtPm1vZHVsZSAqLw0KPiArCWlmICh0ZXYtPnVwcm9iZXMgJiYg IXRwLT5tb2R1bGUpDQo+ICAJCWdvdG8gZXJyb3I7DQo+ICsJLyoNCj4gKwkgKiBJZiB0cC0+YWRk cmVzcyA9PSAwLCB0aGVuIHRoaXMgcG9pbnQgbXVzdCBiZSBhDQo+ICsJICogYWJzb2x1dGUgYWRk cmVzcyB1cHJvYmUuDQo+ICsJICogdHJ5X3RvX2ZpbmRfYWJzb2x1dGVfYWRkcmVzcygpIHNob3Vs ZCBoYXZlIG1hZGUNCj4gKwkgKiB0cC0+c3ltYm9sIHRvICIweDAiLg0KPiArCSAqLw0KPiArCWlm ICh0ZXYtPnVwcm9iZXMgJiYgIXRwLT5hZGRyZXNzKSB7DQo+ICsJCWlmICghdHAtPnN5bWJvbCB8 fCBzdHJjbXAodHAtPnN5bWJvbCwgIjB4MCIpKQ0KPiArCQkJZ290byBlcnJvcjsNCj4gKwl9DQo+ IA0KPiAgCS8qIFVzZSB0aGUgdHAtPmFkZHJlc3MgZm9yIHVwcm9iZXMgKi8NCj4gIAlpZiAodGV2 LT51cHJvYmVzKQ0KPiAgCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiArIGxlbiwgTUFYX0NNRExFTiAt IGxlbiwgIiVzOjB4JWx4IiwNCj4gIAkJCQkgdHAtPm1vZHVsZSwgdHAtPmFkZHJlc3MpOw0KPiAr CWVsc2UgaWYgKCFzdHJuY21wKHRwLT5zeW1ib2wsICIweCIsIDIpKQ0KPiArCQkvKiBBYnNvbHV0 ZSBhZGRyZXNzLiBTZWUgdHJ5X3RvX2ZpbmRfYWJzb2x1dGVfYWRkcmVzcygpICovDQo+ICsJCXJl dCA9IGVfc25wcmludGYoYnVmICsgbGVuLCBNQVhfQ01ETEVOIC0gbGVuLCAiJXMlczB4JWx4IiwN Cj4gKwkJCQkgdHAtPm1vZHVsZSA/OiAiIiwgdHAtPm1vZHVsZSA/ICI6IiA6ICIiLA0KPiArCQkJ CSB0cC0+YWRkcmVzcyk7DQo+ICAJZWxzZQ0KPiAgCQlyZXQgPSBlX3NucHJpbnRmKGJ1ZiArIGxl biwgTUFYX0NNRExFTiAtIGxlbiwgIiVzJXMlcyslbHUiLA0KPiAgCQkJCSB0cC0+bW9kdWxlID86 ICIiLCB0cC0+bW9kdWxlID8gIjoiIDogIiIsDQo+IEBAIC0xODc0LDggKzE5MDcsOCBAQCBvdXQ6 DQo+ICB9DQo+IA0KPiAgc3RhdGljIGludCBjb252ZXJ0X3RvX3BlcmZfcHJvYmVfcG9pbnQoc3Ry dWN0IHByb2JlX3RyYWNlX3BvaW50ICp0cCwNCj4gLQkJCQkJc3RydWN0IHBlcmZfcHJvYmVfcG9p bnQgKnBwLA0KPiAtCQkJCQlib29sIGlzX2twcm9iZSkNCj4gKwkJCQkgICAgICAgc3RydWN0IHBl cmZfcHJvYmVfcG9pbnQgKnBwLA0KPiArCQkJCSAgICAgICBib29sIGlzX2twcm9iZSkNCj4gIHsN Cj4gIAljaGFyIGJ1ZlsxMjhdOw0KPiAgCWludCByZXQ7DQo+IEBAIC0yMzMxLDcgKzIzNjQsOSBA QCBzdGF0aWMgaW50IHByb2JlX3RyYWNlX2V2ZW50X19zZXRfbmFtZShzdHJ1Y3QgcHJvYmVfdHJh Y2VfZXZlbnQgKnRldiwNCj4gIAlpZiAocGV2LT5ldmVudCkNCj4gIAkJZXZlbnQgPSBwZXYtPmV2 ZW50Ow0KPiAgCWVsc2UNCj4gLQkJaWYgKHBldi0+cG9pbnQuZnVuY3Rpb24gJiYgIXN0cmlzZ2xv YihwZXYtPnBvaW50LmZ1bmN0aW9uKSkNCj4gKwkJaWYgKHBldi0+cG9pbnQuZnVuY3Rpb24gJiYN Cj4gKwkJCShzdHJuY21wKHBldi0+cG9pbnQuZnVuY3Rpb24sICIweCIsIDIpICE9IDApICYmDQo+ ICsJCQkhc3RyaXNnbG9iKHBldi0+cG9pbnQuZnVuY3Rpb24pKQ0KPiAgCQkJZXZlbnQgPSBwZXYt PnBvaW50LmZ1bmN0aW9uOw0KPiAgCQllbHNlDQo+ICAJCQlldmVudCA9IHRldi0+cG9pbnQucmVh bG5hbWU7DQo+IEBAIC0yNTk4LDYgKzI2MzMsOTggQEAgZXJyX291dDoNCj4gIAlnb3RvIG91dDsN Cj4gIH0NCj4gDQo+ICtzdGF0aWMgaW50IHRyeV90b19maW5kX2Fic29sdXRlX2FkZHJlc3Moc3Ry dWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwNCj4gKwkJCQkJc3RydWN0IHByb2JlX3RyYWNlX2V2 ZW50ICoqdGV2cykNCj4gK3sNCj4gKwlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAgPSAmcGV2 LT5wb2ludDsNCj4gKwlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldjsNCj4gKwlzdHJ1Y3Qg cHJvYmVfdHJhY2VfcG9pbnQgKnRwOw0KPiArCWludCBpLCBlcnI7DQo+ICsNCj4gKwlpZiAoIShw ZXYtPnBvaW50LmZ1bmN0aW9uICYmICFzdHJuY21wKHBldi0+cG9pbnQuZnVuY3Rpb24sICIweCIs IDIpKSkNCj4gKwkJcmV0dXJuIC1FSU5WQUw7DQo+ICsJaWYgKHBlcmZfcHJvYmVfZXZlbnRfbmVl ZF9kd2FyZihwZXYpKQ0KPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gKw0KPiArCS8qDQo+ICsJICog VGhpcyBpcyAncGVyZiBwcm9iZSAvbGliL2xpYmMuc28gMHhhYmNkJy4gVHJ5IHRvIHByb2JlIGF0 DQo+ICsJICogYWJzb2x1dGUgYWRkcmVzcy4NCj4gKwkgKg0KPiArCSAqIE9ubHkgb25lIHRldiBj YW4gYmUgZ2VuZXJhdGVkIGJ5IHRoaXMuDQo+ICsJICovDQo+ICsJKnRldnMgPSB6YWxsb2Moc2l6 ZW9mKCp0ZXYpKTsNCj4gKwlpZiAoISp0ZXZzKQ0KPiArCQlyZXR1cm4gLUVOT01FTTsNCj4gKw0K PiArCXRldiA9ICp0ZXZzOw0KPiArCXRwID0gJnRldi0+cG9pbnQ7DQo+ICsNCj4gKwkvKg0KPiAr CSAqIERvbid0IHVzZSB0cC0+b2Zmc2V0LCB1c2UgYWRkcmVzcyBkaXJlY3RseSwgYmVjYXVzZQ0K PiArCSAqIGluIHN5bnRoZXNpemVfcHJvYmVfdHJhY2VfY29tbWFuZCgpIGFkZHJlc3MgY2Fubm90 IGJlDQo+ICsJICogemVyby4NCj4gKwkgKi8NCj4gKwl0cC0+YWRkcmVzcyA9IHBldi0+cG9pbnQu YWJzX2FkZHJlc3M7DQo+ICsJdHAtPnJldHByb2JlID0gcHAtPnJldHByb2JlOw0KPiArCXRldi0+ dXByb2JlcyA9IHBldi0+dXByb2JlczsNCj4gKw0KPiArCWVyciA9IC1FTk9NRU07DQo+ICsJLyoN Cj4gKwkgKiBHaXZlIGl0IGEgJzB4JyBsZWFkaW5nIHN5bWJvbCBuYW1lLg0KPiArCSAqIEluIF9f YWRkX3Byb2JlX3RyYWNlX2V2ZW50cywgYSBOVUxMIHN5bWJvbCBpcyBpbnRlcnByZXRlZCBhcw0K PiArCSAqIGludmFsdWQuDQo+ICsJICovDQo+ICsJaWYgKGFzcHJpbnRmKCZ0cC0+c3ltYm9sLCAi MHglbHgiLCB0cC0+YWRkcmVzcykgPCAwKQ0KPiArCQlnb3RvIGVycm91dDsNCj4gKw0KPiArCS8q IEZvciBrcHJvYmUsIGNoZWNrIHJhbmdlICovDQo+ICsJaWYgKCghdGV2LT51cHJvYmVzKSAmJg0K PiArCSAgICAoa3Byb2JlX3dhcm5fb3V0X3JhbmdlKHRldi0+cG9pbnQuc3ltYm9sLA0KPiArCQkJ CSAgIHRldi0+cG9pbnQuYWRkcmVzcykpKSB7DQo+ICsJCWVyciA9IC1FQUNDRVM7DQo+ICsJCWdv dG8gZXJyb3V0Ow0KPiArCX0NCj4gKw0KPiArCWlmIChhc3ByaW50ZigmdHAtPnJlYWxuYW1lLCAi YWJzXyVseCIsIHRwLT5hZGRyZXNzKSA8IDApDQo+ICsJCWdvdG8gZXJyb3V0Ow0KPiArDQo+ICsJ aWYgKHBldi0+dGFyZ2V0KSB7DQo+ICsJCXRwLT5tb2R1bGUgPSBzdHJkdXAocGV2LT50YXJnZXQp Ow0KPiArCQlpZiAoIXRwLT5tb2R1bGUpDQo+ICsJCQlnb3RvIGVycm91dDsNCj4gKwl9DQo+ICsN Cj4gKwlpZiAodGV2LT5ncm91cCkgew0KPiArCQl0ZXYtPmdyb3VwID0gc3RyZHVwKHBldi0+Z3Jv dXApOw0KPiArCQlpZiAoIXRldi0+Z3JvdXApDQo+ICsJCQlnb3RvIGVycm91dDsNCj4gKwl9DQo+ ICsNCj4gKwlpZiAocGV2LT5ldmVudCkgew0KPiArCQl0ZXYtPmV2ZW50ID0gc3RyZHVwKHBldi0+ ZXZlbnQpOw0KPiArCQlpZiAoIXRldi0+ZXZlbnQpDQo+ICsJCQlnb3RvIGVycm91dDsNCj4gKwl9 DQo+ICsNCj4gKwl0ZXYtPm5hcmdzID0gcGV2LT5uYXJnczsNCj4gKwl0ZXYtPmFyZ3MgPSB6YWxs b2Moc2l6ZW9mKHN0cnVjdCBwcm9iZV90cmFjZV9hcmcpICogdGV2LT5uYXJncyk7DQo+ICsJaWYg KCF0ZXYtPmFyZ3MpIHsNCj4gKwkJZXJyID0gLUVOT01FTTsNCj4gKwkJZ290byBlcnJvdXQ7DQo+ ICsJfQ0KPiArCWZvciAoaSA9IDA7IGkgPCB0ZXYtPm5hcmdzOyBpKyspDQo+ICsJCWNvcHlfdG9f cHJvYmVfdHJhY2VfYXJnKCZ0ZXYtPmFyZ3NbaV0sICZwZXYtPmFyZ3NbaV0pOw0KPiArDQo+ICsJ cmV0dXJuIDE7DQo+ICsNCj4gK2Vycm91dDoNCj4gKwlpZiAoKnRldnMpIHsNCj4gKwkJY2xlYXJf cHJvYmVfdHJhY2VfZXZlbnRzKCp0ZXZzLCAxKTsNCj4gKwkJKnRldnMgPSBOVUxMOw0KPiArCX0N Cj4gKwlyZXR1cm4gZXJyOw0KPiArfQ0KPiArDQo+ICBib29sIF9fd2VhayBhcmNoX19wcmVmZXJz X3N5bXRhYih2b2lkKSB7IHJldHVybiBmYWxzZTsgfQ0KPiANCj4gIHN0YXRpYyBpbnQgY29udmVy dF90b19wcm9iZV90cmFjZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwNCj4g QEAgLTI2MTQsNiArMjc0MSwxMCBAQCBzdGF0aWMgaW50IGNvbnZlcnRfdG9fcHJvYmVfdHJhY2Vf ZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsDQo+ICAJCX0NCj4gIAl9DQo+IA0K PiArCXJldCA9IHRyeV90b19maW5kX2Fic29sdXRlX2FkZHJlc3MocGV2LCB0ZXZzKTsNCj4gKwlp ZiAocmV0ID4gMCkNCj4gKwkJcmV0dXJuIHJldDsNCj4gKw0KPiAgCWlmIChhcmNoX19wcmVmZXJz X3N5bXRhYigpICYmICFwZXJmX3Byb2JlX2V2ZW50X25lZWRfZHdhcmYocGV2KSkgew0KPiAgCQly ZXQgPSBmaW5kX3Byb2JlX3RyYWNlX2V2ZW50c19mcm9tX21hcChwZXYsIHRldnMpOw0KPiAgCQlp ZiAocmV0ID4gMCkNCj4gQEAgLTI3ODQsMyArMjkxNSwyMiBAQCBlbmQ6DQo+ICAJcmV0dXJuIHJl dDsNCj4gIH0NCj4gDQo+ICtpbnQgY29weV90b19wcm9iZV90cmFjZV9hcmcoc3RydWN0IHByb2Jl X3RyYWNlX2FyZyAqdHZhciwNCj4gKwkJCSAgICBzdHJ1Y3QgcGVyZl9wcm9iZV9hcmcgKnB2YXIp DQo+ICt7DQo+ICsJdHZhci0+dmFsdWUgPSBzdHJkdXAocHZhci0+dmFyKTsNCj4gKwlpZiAodHZh ci0+dmFsdWUgPT0gTlVMTCkNCj4gKwkJcmV0dXJuIC1FTk9NRU07DQo+ICsJaWYgKHB2YXItPnR5 cGUpIHsNCj4gKwkJdHZhci0+dHlwZSA9IHN0cmR1cChwdmFyLT50eXBlKTsNCj4gKwkJaWYgKHR2 YXItPnR5cGUgPT0gTlVMTCkNCj4gKwkJCXJldHVybiAtRU5PTUVNOw0KPiArCX0NCj4gKwlpZiAo cHZhci0+bmFtZSkgew0KPiArCQl0dmFyLT5uYW1lID0gc3RyZHVwKHB2YXItPm5hbWUpOw0KPiAr CQlpZiAodHZhci0+bmFtZSA9PSBOVUxMKQ0KPiArCQkJcmV0dXJuIC1FTk9NRU07DQo+ICsJfSBl bHNlDQo+ICsJCXR2YXItPm5hbWUgPSBOVUxMOw0KPiArCXJldHVybiAwOw0KPiArfQ0KPiBkaWZm IC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmggYi90b29scy9wZXJmL3V0aWwv cHJvYmUtZXZlbnQuaA0KPiBpbmRleCA4M2VlOTVlLi42ZTdlYzY4IDEwMDY0NA0KPiAtLS0gYS90 b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaA0KPiArKysgYi90b29scy9wZXJmL3V0aWwvcHJv YmUtZXZlbnQuaA0KPiBAQCAtNTksNiArNTksNyBAQCBzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCB7 DQo+ICAJYm9vbAkJcmV0cHJvYmU7CS8qIFJldHVybiBwcm9iZSBmbGFnICovDQo+ICAJY2hhcgkJ KmxhenlfbGluZTsJLyogTGF6eSBtYXRjaGluZyBwYXR0ZXJuICovDQo+ICAJdW5zaWduZWQgbG9u ZwlvZmZzZXQ7CQkvKiBPZmZzZXQgZnJvbSBmdW5jdGlvbiBlbnRyeSAqLw0KPiArCXVuc2lnbmVk IGxvbmcJYWJzX2FkZHJlc3M7CS8qIEFic29sdXRlIGFkZHJlc3Mgb2YgdGhlIHBvaW50ICovDQo+ ICB9Ow0KPiANCj4gIC8qIFBlcmYgcHJvYmUgcHJvYmluZyBhcmd1bWVudCBmaWVsZCBjaGFpbiAq Lw0KPiBAQCAtMTU2LDQgKzE1Nyw3IEBAIGludCBlX3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90 IHNpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQ0KPiAgLyogTWF4aW11bSBpbmRleCBudW1i ZXIgb2YgZXZlbnQtbmFtZSBwb3N0Zml4ICovDQo+ICAjZGVmaW5lIE1BWF9FVkVOVF9JTkRFWAkx MDI0DQo+IA0KPiAraW50IGNvcHlfdG9fcHJvYmVfdHJhY2VfYXJnKHN0cnVjdCBwcm9iZV90cmFj ZV9hcmcgKnR2YXIsDQo+ICsJCQkgICAgc3RydWN0IHBlcmZfcHJvYmVfYXJnICpwdmFyKTsNCj4g Kw0KPiAgI2VuZGlmIC8qX1BST0JFX0VWRU5UX0ggKi8NCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL3Bl cmYvdXRpbC9wcm9iZS1maW5kZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYw0K PiBpbmRleCA3YjgwZjhjLi4yOWM0M2MwNjggMTAwNjQ0DQo+IC0tLSBhL3Rvb2xzL3BlcmYvdXRp bC9wcm9iZS1maW5kZXIuYw0KPiArKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMN Cj4gQEAgLTU1MywyNCArNTUzLDkgQEAgc3RhdGljIGludCBmaW5kX3ZhcmlhYmxlKER3YXJmX0Rp ZSAqc2NfZGllLCBzdHJ1Y3QgcHJvYmVfZmluZGVyICpwZikNCj4gIAljaGFyIGJ1ZlszMl0sICpw dHI7DQo+ICAJaW50IHJldCA9IDA7DQo+IA0KPiAtCWlmICghaXNfY192YXJuYW1lKHBmLT5wdmFy LT52YXIpKSB7DQo+IC0JCS8qIENvcHkgcmF3IHBhcmFtZXRlcnMgKi8NCj4gLQkJcGYtPnR2YXIt PnZhbHVlID0gc3RyZHVwKHBmLT5wdmFyLT52YXIpOw0KPiAtCQlpZiAocGYtPnR2YXItPnZhbHVl ID09IE5VTEwpDQo+IC0JCQlyZXR1cm4gLUVOT01FTTsNCj4gLQkJaWYgKHBmLT5wdmFyLT50eXBl KSB7DQo+IC0JCQlwZi0+dHZhci0+dHlwZSA9IHN0cmR1cChwZi0+cHZhci0+dHlwZSk7DQo+IC0J CQlpZiAocGYtPnR2YXItPnR5cGUgPT0gTlVMTCkNCj4gLQkJCQlyZXR1cm4gLUVOT01FTTsNCj4g LQkJfQ0KPiAtCQlpZiAocGYtPnB2YXItPm5hbWUpIHsNCj4gLQkJCXBmLT50dmFyLT5uYW1lID0g c3RyZHVwKHBmLT5wdmFyLT5uYW1lKTsNCj4gLQkJCWlmIChwZi0+dHZhci0+bmFtZSA9PSBOVUxM KQ0KPiAtCQkJCXJldHVybiAtRU5PTUVNOw0KPiAtCQl9IGVsc2UNCj4gLQkJCXBmLT50dmFyLT5u YW1lID0gTlVMTDsNCj4gLQkJcmV0dXJuIDA7DQo+IC0JfQ0KPiArCS8qIENvcHkgcmF3IHBhcmFt ZXRlcnMgKi8NCj4gKwlpZiAoIWlzX2NfdmFybmFtZShwZi0+cHZhci0+dmFyKSkNCj4gKwkJcmV0 dXJuIGNvcHlfdG9fcHJvYmVfdHJhY2VfYXJnKHBmLT50dmFyLCBwZi0+cHZhcik7DQo+IA0KPiAg CWlmIChwZi0+cHZhci0+bmFtZSkNCj4gIAkJcGYtPnR2YXItPm5hbWUgPSBzdHJkdXAocGYtPnB2 YXItPm5hbWUpOw0KPiAtLQ0KPiAxLjguMy40DQoNCg== -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Wang Nan <tipbot@zytor.com> |
|---|---|
| Date | 2015-08-28 08:50 +0200 |
| Subject | [tip:perf/core] perf probe: Support probing at absolute address |
| Message-ID | <q2lE7-3R6-31@gated-at.bofh.it> |
| In reply to | #1213740 |
Commit-ID: da15bd9df4afd2f9f78cf29f85f013e3a38402b5
Gitweb: http://git.kernel.org/tip/da15bd9df4afd2f9f78cf29f85f013e3a38402b5
Author: Wang Nan <wangnan0@huawei.com>
AuthorDate: Wed, 26 Aug 2015 10:57:45 +0000
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 26 Aug 2015 10:41:12 -0300
perf probe: Support probing at absolute address
It should be useful to allow 'perf probe' probe at absolute offset of a
target. For example, when (u)probing at a instruction of a shared object
in a embedded system where debuginfo is not avaliable but we know the
offset of that instruction by manually digging.
This patch enables following perf probe command syntax:
# perf probe 0xffffffff811e6615
And
# perf probe /lib/x86_64-linux-gnu/libc-2.19.so 0xeb860
In the above example, we don't need a anchor symbol, so it is possible
to compute absolute addresses using other methods and then use 'perf
probe' to create the probing points.
v1 -> v2:
Drop the leading '+' in cmdline;
Allow uprobing at offset 0x0;
Improve 'perf probe -l' result when uprobe at area without debuginfo.
v2 -> v3:
Split bugfix to a separated patch.
Test result:
# perf probe 0xffffffff8119d175 %ax
# perf probe sys_write %ax
# perf probe /lib64/libc-2.18.so 0x0 %ax
# perf probe /lib64/libc-2.18.so 0x5 %ax
# perf probe /lib64/libc-2.18.so 0xd8e40 %ax
# perf probe /lib64/libc-2.18.so __write %ax
# perf probe /lib64/libc-2.18.so 0xd8e49 %ax
# cat /sys/kernel/debug/tracing/uprobe_events
p:probe_libc/abs_0 /lib64/libc-2.18.so:0x (null) arg1=%ax
p:probe_libc/abs_5 /lib64/libc-2.18.so:0x0000000000000005 arg1=%ax
p:probe_libc/abs_d8e40 /lib64/libc-2.18.so:0x00000000000d8e40 arg1=%ax
p:probe_libc/__write /lib64/libc-2.18.so:0x00000000000d8e40 arg1=%ax
p:probe_libc/abs_d8e49 /lib64/libc-2.18.so:0x00000000000d8e49 arg1=%ax
# cat /sys/kernel/debug/tracing/kprobe_events
p:probe/abs_ffffffff8119d175 0xffffffff8119d175 arg1=%ax
p:probe/sys_write _text+1692016 arg1=%ax
# perf probe -l
Failed to find debug information for address 5
probe:abs_ffffffff8119d175 (on sys_write+5 with arg1)
probe:sys_write (on sys_write with arg1)
probe_libc:__write (on @unix/syscall-template.S:81 in /lib64/libc-2.18.so with arg1)
probe_libc:abs_0 (on 0x0 in /lib64/libc-2.18.so with arg1)
probe_libc:abs_5 (on 0x5 in /lib64/libc-2.18.so with arg1)
probe_libc:abs_d8e40 (on @unix/syscall-template.S:81 in /lib64/libc-2.18.so with arg1)
probe_libc:abs_d8e49 (on __GI___libc_write+9 in /lib64/libc-2.18.so with arg1)
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-7-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/probe-event.c | 162 +++++++++++++++++++++++++++++++++++++++--
tools/perf/util/probe-event.h | 4 +
tools/perf/util/probe-finder.c | 21 +-----
3 files changed, 163 insertions(+), 24 deletions(-)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index eaacb58..eb5f18b 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1204,9 +1204,27 @@ static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev)
if (file_spec)
pp->file = tmp;
- else
+ else {
pp->function = tmp;
+ /*
+ * Keep pp->function even if this is absolute address,
+ * so it can mark whether abs_address is valid.
+ * Which make 'perf probe lib.bin 0x0' possible.
+ *
+ * Note that checking length of tmp is not needed
+ * because when we access tmp[1] we know tmp[0] is '0',
+ * so tmp[1] should always valid (but could be '\0').
+ */
+ if (tmp && !strncmp(tmp, "0x", 2)) {
+ pp->abs_address = strtoul(pp->function, &tmp, 0);
+ if (*tmp != '\0') {
+ semantic_error("Invalid absolute address.\n");
+ return -EINVAL;
+ }
+ }
+ }
+
/* Parse other options */
while (ptr) {
arg = ptr;
@@ -1804,14 +1822,29 @@ char *synthesize_probe_trace_command(struct probe_trace_event *tev)
if (len <= 0)
goto error;
- /* Uprobes must have tp->address and tp->module */
- if (tev->uprobes && (!tp->address || !tp->module))
+ /* Uprobes must have tp->module */
+ if (tev->uprobes && !tp->module)
goto error;
+ /*
+ * If tp->address == 0, then this point must be a
+ * absolute address uprobe.
+ * try_to_find_absolute_address() should have made
+ * tp->symbol to "0x0".
+ */
+ if (tev->uprobes && !tp->address) {
+ if (!tp->symbol || strcmp(tp->symbol, "0x0"))
+ goto error;
+ }
/* Use the tp->address for uprobes */
if (tev->uprobes)
ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s:0x%lx",
tp->module, tp->address);
+ else if (!strncmp(tp->symbol, "0x", 2))
+ /* Absolute address. See try_to_find_absolute_address() */
+ ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s0x%lx",
+ tp->module ?: "", tp->module ? ":" : "",
+ tp->address);
else
ret = e_snprintf(buf + len, MAX_CMDLEN - len, "%s%s%s+%lu",
tp->module ?: "", tp->module ? ":" : "",
@@ -1874,8 +1907,8 @@ out:
}
static int convert_to_perf_probe_point(struct probe_trace_point *tp,
- struct perf_probe_point *pp,
- bool is_kprobe)
+ struct perf_probe_point *pp,
+ bool is_kprobe)
{
char buf[128];
int ret;
@@ -2331,7 +2364,9 @@ static int probe_trace_event__set_name(struct probe_trace_event *tev,
if (pev->event)
event = pev->event;
else
- if (pev->point.function && !strisglob(pev->point.function))
+ if (pev->point.function &&
+ (strncmp(pev->point.function, "0x", 2) != 0) &&
+ !strisglob(pev->point.function))
event = pev->point.function;
else
event = tev->point.realname;
@@ -2598,6 +2633,98 @@ err_out:
goto out;
}
+static int try_to_find_absolute_address(struct perf_probe_event *pev,
+ struct probe_trace_event **tevs)
+{
+ struct perf_probe_point *pp = &pev->point;
+ struct probe_trace_event *tev;
+ struct probe_trace_point *tp;
+ int i, err;
+
+ if (!(pev->point.function && !strncmp(pev->point.function, "0x", 2)))
+ return -EINVAL;
+ if (perf_probe_event_need_dwarf(pev))
+ return -EINVAL;
+
+ /*
+ * This is 'perf probe /lib/libc.so 0xabcd'. Try to probe at
+ * absolute address.
+ *
+ * Only one tev can be generated by this.
+ */
+ *tevs = zalloc(sizeof(*tev));
+ if (!*tevs)
+ return -ENOMEM;
+
+ tev = *tevs;
+ tp = &tev->point;
+
+ /*
+ * Don't use tp->offset, use address directly, because
+ * in synthesize_probe_trace_command() address cannot be
+ * zero.
+ */
+ tp->address = pev->point.abs_address;
+ tp->retprobe = pp->retprobe;
+ tev->uprobes = pev->uprobes;
+
+ err = -ENOMEM;
+ /*
+ * Give it a '0x' leading symbol name.
+ * In __add_probe_trace_events, a NULL symbol is interpreted as
+ * invalud.
+ */
+ if (asprintf(&tp->symbol, "0x%lx", tp->address) < 0)
+ goto errout;
+
+ /* For kprobe, check range */
+ if ((!tev->uprobes) &&
+ (kprobe_warn_out_range(tev->point.symbol,
+ tev->point.address))) {
+ err = -EACCES;
+ goto errout;
+ }
+
+ if (asprintf(&tp->realname, "abs_%lx", tp->address) < 0)
+ goto errout;
+
+ if (pev->target) {
+ tp->module = strdup(pev->target);
+ if (!tp->module)
+ goto errout;
+ }
+
+ if (tev->group) {
+ tev->group = strdup(pev->group);
+ if (!tev->group)
+ goto errout;
+ }
+
+ if (pev->event) {
+ tev->event = strdup(pev->event);
+ if (!tev->event)
+ goto errout;
+ }
+
+ tev->nargs = pev->nargs;
+ tev->args = zalloc(sizeof(struct probe_trace_arg) * tev->nargs);
+ if (!tev->args) {
+ err = -ENOMEM;
+ goto errout;
+ }
+ for (i = 0; i < tev->nargs; i++)
+ copy_to_probe_trace_arg(&tev->args[i], &pev->args[i]);
+
+ return 1;
+
+errout:
+ if (*tevs) {
+ clear_probe_trace_events(*tevs, 1);
+ *tevs = NULL;
+ }
+ return err;
+}
+
bool __weak arch__prefers_symtab(void) { return false; }
static int convert_to_probe_trace_events(struct perf_probe_event *pev,
@@ -2614,6 +2741,10 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
}
}
+ ret = try_to_find_absolute_address(pev, tevs);
+ if (ret > 0)
+ return ret;
+
if (arch__prefers_symtab() && !perf_probe_event_need_dwarf(pev)) {
ret = find_probe_trace_events_from_map(pev, tevs);
if (ret > 0)
@@ -2784,3 +2915,22 @@ end:
return ret;
}
+int copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
+ struct perf_probe_arg *pvar)
+{
+ tvar->value = strdup(pvar->var);
+ if (tvar->value == NULL)
+ return -ENOMEM;
+ if (pvar->type) {
+ tvar->type = strdup(pvar->type);
+ if (tvar->type == NULL)
+ return -ENOMEM;
+ }
+ if (pvar->name) {
+ tvar->name = strdup(pvar->name);
+ if (tvar->name == NULL)
+ return -ENOMEM;
+ } else
+ tvar->name = NULL;
+ return 0;
+}
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h
index 83ee95e..6e7ec68 100644
--- a/tools/perf/util/probe-event.h
+++ b/tools/perf/util/probe-event.h
@@ -59,6 +59,7 @@ struct perf_probe_point {
bool retprobe; /* Return probe flag */
char *lazy_line; /* Lazy matching pattern */
unsigned long offset; /* Offset from function entry */
+ unsigned long abs_address; /* Absolute address of the point */
};
/* Perf probe probing argument field chain */
@@ -156,4 +157,7 @@ int e_snprintf(char *str, size_t size, const char *format, ...)
/* Maximum index number of event-name postfix */
#define MAX_EVENT_INDEX 1024
+int copy_to_probe_trace_arg(struct probe_trace_arg *tvar,
+ struct perf_probe_arg *pvar);
+
#endif /*_PROBE_EVENT_H */
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 7b80f8c..29c43c068 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -553,24 +553,9 @@ static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf)
char buf[32], *ptr;
int ret = 0;
- if (!is_c_varname(pf->pvar->var)) {
- /* Copy raw parameters */
- pf->tvar->value = strdup(pf->pvar->var);
- if (pf->tvar->value == NULL)
- return -ENOMEM;
- if (pf->pvar->type) {
- pf->tvar->type = strdup(pf->pvar->type);
- if (pf->tvar->type == NULL)
- return -ENOMEM;
- }
- if (pf->pvar->name) {
- pf->tvar->name = strdup(pf->pvar->name);
- if (pf->tvar->name == NULL)
- return -ENOMEM;
- } else
- pf->tvar->name = NULL;
- return 0;
- }
+ /* Copy raw parameters */
+ if (!is_c_varname(pf->pvar->var))
+ return copy_to_probe_trace_arg(pf->tvar, pf->pvar);
if (pf->pvar->name)
pf->tvar->name = strdup(pf->pvar->name);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-08-26 13:00 +0200 |
| Subject | [PATCH v3 4/6] perf probe: Fix error reported when offset without function |
| Message-ID | <q1GAX-3v0-23@gated-at.bofh.it> |
| In reply to | #1213737 |
This patch fixes a bug that, when offset is provided but function is
lost, parse_perf_probe_point() will give a "" string as function name,
so the checking code at the end of parse_perf_probe_point() become useless.
For example:
# perf probe +0x1234
Failed to find symbol in kernel
Error: Failed to add events.
After this patch:
# perf probe +0x1234
Semantic error :Offset requires an entry function.
Error: Command Parse Error.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
tools/perf/util/probe-event.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 926bcec..eaacb58 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1194,9 +1194,13 @@ static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev)
*ptr++ = '\0';
}
- tmp = strdup(arg);
- if (tmp == NULL)
- return -ENOMEM;
+ if (arg[0] == '\0')
+ tmp = NULL;
+ else {
+ tmp = strdup(arg);
+ if (tmp == NULL)
+ return -ENOMEM;
+ }
if (file_spec)
pp->file = tmp;
--
1.8.3.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-08-26 14:30 +0200 |
| Subject | RE: [PATCH v3 4/6] perf probe: Fix error reported when offset without function |
| Message-ID | <q1I02-5Dg-1@gated-at.bofh.it> |
| In reply to | #1213741 |
PiBGcm9tOiBXYW5nIE5hbiBbbWFpbHRvOndhbmduYW4wQGh1YXdlaS5jb21dDQo+IA0KPiBUaGlz IHBhdGNoIGZpeGVzIGEgYnVnIHRoYXQsIHdoZW4gb2Zmc2V0IGlzIHByb3ZpZGVkIGJ1dCBmdW5j dGlvbiBpcw0KPiBsb3N0LCBwYXJzZV9wZXJmX3Byb2JlX3BvaW50KCkgd2lsbCBnaXZlIGEgIiIg c3RyaW5nIGFzIGZ1bmN0aW9uIG5hbWUsDQo+IHNvIHRoZSBjaGVja2luZyBjb2RlIGF0IHRoZSBl bmQgb2YgcGFyc2VfcGVyZl9wcm9iZV9wb2ludCgpIGJlY29tZSB1c2VsZXNzLg0KPiBGb3IgZXhh bXBsZToNCj4gDQo+ICAjIHBlcmYgcHJvYmUgKzB4MTIzNA0KPiAgRmFpbGVkIHRvIGZpbmQgc3lt Ym9sICBpbiBrZXJuZWwNCj4gICAgRXJyb3I6IEZhaWxlZCB0byBhZGQgZXZlbnRzLg0KPiANCj4g QWZ0ZXIgdGhpcyBwYXRjaDoNCj4gDQo+ICAjIHBlcmYgcHJvYmUgKzB4MTIzNA0KPiAgU2VtYW50 aWMgZXJyb3IgOk9mZnNldCByZXF1aXJlcyBhbiBlbnRyeSBmdW5jdGlvbi4NCj4gICAgRXJyb3I6 IENvbW1hbmQgUGFyc2UgRXJyb3IuDQoNCk9LLCBzZWVtcyBzYW5lIG5vdyA6KQ0KDQpBY2tlZC1i eTogTWFzYW1pIEhpcmFtYXRzdSA8bWFzYW1pLmhpcmFtYXRzdS5wdEBoaXRhY2hpLmNvbT4NCg0K VGhhbmtzIQ0KDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBXYW5nIE5hbiA8d2FuZ25hbjBAaHVhd2Vp LmNvbT4NCj4gQ2M6IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBrZXJuZWwub3JnPg0K PiBDYzogSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+DQo+IENjOiBNYXNhbWkgSGlyYW1h dHN1IDxtYXNhbWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29tPg0KPiBDYzogTmFtaHl1bmcgS2lt IDxuYW1oeXVuZ0BrZXJuZWwub3JnPg0KPiBDYzogU3RldmVuIFJvc3RlZHQgPHJvc3RlZHRAZ29v ZG1pcy5vcmc+DQo+IC0tLQ0KPiAgdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMgfCAxMCAr KysrKysrLS0tDQo+ICAxIGZpbGUgY2hhbmdlZCwgNyBpbnNlcnRpb25zKCspLCAzIGRlbGV0aW9u cygtKQ0KPiANCj4gZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jIGIv dG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMNCj4gaW5kZXggOTI2YmNlYy4uZWFhY2I1OCAx MDA2NDQNCj4gLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMNCj4gKysrIGIvdG9v bHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMNCj4gQEAgLTExOTQsOSArMTE5NCwxMyBAQCBzdGF0 aWMgaW50IHBhcnNlX3BlcmZfcHJvYmVfcG9pbnQoY2hhciAqYXJnLCBzdHJ1Y3QgcGVyZl9wcm9i ZV9ldmVudCAqcGV2KQ0KPiAgCQkqcHRyKysgPSAnXDAnOw0KPiAgCX0NCj4gDQo+IC0JdG1wID0g c3RyZHVwKGFyZyk7DQo+IC0JaWYgKHRtcCA9PSBOVUxMKQ0KPiAtCQlyZXR1cm4gLUVOT01FTTsN Cj4gKwlpZiAoYXJnWzBdID09ICdcMCcpDQo+ICsJCXRtcCA9IE5VTEw7DQo+ICsJZWxzZSB7DQo+ ICsJCXRtcCA9IHN0cmR1cChhcmcpOw0KPiArCQlpZiAodG1wID09IE5VTEwpDQo+ICsJCQlyZXR1 cm4gLUVOT01FTTsNCj4gKwl9DQo+IA0KPiAgCWlmIChmaWxlX3NwZWMpDQo+ICAJCXBwLT5maWxl ID0gdG1wOw0KPiAtLQ0KPiAxLjguMy40DQoNCg== -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Wang Nan <tipbot@zytor.com> |
|---|---|
| Date | 2015-08-28 08:50 +0200 |
| Subject | [tip:perf/core] perf probe: Fix error reported when offset without function |
| Message-ID | <q2lE6-3R6-9@gated-at.bofh.it> |
| In reply to | #1213741 |
Commit-ID: 6c6e024f0a62a6a08c06002fd3caa2307cc54fd0
Gitweb: http://git.kernel.org/tip/6c6e024f0a62a6a08c06002fd3caa2307cc54fd0
Author: Wang Nan <wangnan0@huawei.com>
AuthorDate: Wed, 26 Aug 2015 10:57:44 +0000
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 26 Aug 2015 10:40:34 -0300
perf probe: Fix error reported when offset without function
This patch fixes a bug that, when offset is provided but function is
lost, parse_perf_probe_point() will give a "" string as function name,
so the checking code at the end of parse_perf_probe_point() become
useless. For example:
# perf probe +0x1234
Failed to find symbol in kernel
Error: Failed to add events.
After this patch:
# perf probe +0x1234
Semantic error :Offset requires an entry function.
Error: Command Parse Error.
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-6-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/probe-event.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 926bcec..eaacb58 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1194,9 +1194,13 @@ static int parse_perf_probe_point(char *arg, struct perf_probe_event *pev)
*ptr++ = '\0';
}
- tmp = strdup(arg);
- if (tmp == NULL)
- return -ENOMEM;
+ if (arg[0] == '\0')
+ tmp = NULL;
+ else {
+ tmp = strdup(arg);
+ if (tmp == NULL)
+ return -ENOMEM;
+ }
if (file_spec)
pp->file = tmp;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-08-26 13:10 +0200 |
| Subject | [PATCH v3 3/6] perf probe: Fix list result when address is zero |
| Message-ID | <q1GKC-3VH-9@gated-at.bofh.it> |
| In reply to | #1213737 |
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>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
tools/perf/util/probe-event.c | 28 +++++++++++++++++++++++++---
1 file changed, 25 insertions(+), 3 deletions(-)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index f7bacbb..926bcec 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)
} 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) {
--
1.8.3.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | 平松雅巳 / HIRAMATU,MASAMI <masami.hiramatsu.pt@hitachi.com> |
|---|---|
| Date | 2015-08-26 14:20 +0200 |
| Subject | RE: [PATCH v3 3/6] perf probe: Fix list result when address is zero |
| Message-ID | <q1HQm-5s4-13@gated-at.bofh.it> |
| In reply to | #1213742 |
PiBGcm9tOiBXYW5nIE5hbiBbbWFpbHRvOndhbmduYW4wQGh1YXdlaS5jb21dDQo+IA0KPiBXaGVu IG1hbnVhbGx5IGFkZGVkIHVwcm9iZSBwb2ludCB3aXRoIHplcm8gYWRkcmVzcywgJ3BlcmYgcHJv YmUgLWwnDQo+IHJlcG9ydHMgZXJyb3IuIEZvciBleGFtcGxlOg0KPiANCj4gICMgZWNobyBwOnBy b2JlX2xpYmMvYWJzXzAgL3BhdGgvdG8vbGliLmJpbjoweDAgYXJnMT0lYXggPiBcDQo+ICAgICAg ICAgICAgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy91cHJvYmVfZXZlbnRzDQo+IA0KPiAgIyBw ZXJmIHByb2JlIC1sDQo+ICBFcnJvcjogRmFpbGVkIHRvIHNob3cgZXZlbnQgbGlzdC4NCj4gDQo+ IFByb2JpbmcgYXQgMHgwIGlzIHBvc3NpYmxlIGFuZCB1c2VmdWwgd2hlbiBsaWIuYmluIGlzIG5v dCBhIG5vcm1hbA0KPiBzaGFyZWQgb2JqZWN0IGJ1dCBpcyBtYW51YWxseSBtYXBwZWQuIEhvd2V2 ZXIsIGluIHRoaXMgY2FzZSBrZXJuZWwNCj4gcmVwb3J0Og0KPiANCj4gICMgY2F0IC9zeXMva2Vy bmVsL2RlYnVnL3RyYWNpbmcvdXByb2JlX2V2ZW50cw0KPiAgcDpwcm9iZV9saWJjL2Fic18wIC9w YXRoL3RvL2xpYi5iaW46MHggICAgICAgICAgKG51bGwpIGFyZzE9JWF4DQo+IA0KPiBUaGlzIHBh dGNoIHN1cHBvcnRzIHRoZSBhYm92ZSBrZXJuZWwgb3V0cHV0Lg0KDQpPSywgTG9va3MgZ29vZCB0 byBtZTopDQoNCg0KQWNrZWQtYnk6IE1hc2FtaSBIaXJhbWF0c3UgPG1hc2FtaS5oaXJhbWF0c3Uu cHRAaGl0YWNoaS5jb20+DQoNClRoYW5rcyENCg0KDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBXYW5n IE5hbiA8d2FuZ25hbjBAaHVhd2VpLmNvbT4NCj4gQ2M6IEFybmFsZG8gQ2FydmFsaG8gZGUgTWVs byA8YWNtZUBrZXJuZWwub3JnPg0KPiBDYzogSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+ DQo+IENjOiBNYXNhbWkgSGlyYW1hdHN1IDxtYXNhbWkuaGlyYW1hdHN1LnB0QGhpdGFjaGkuY29t Pg0KPiBDYzogTmFtaHl1bmcgS2ltIDxuYW1oeXVuZ0BrZXJuZWwub3JnPg0KPiBDYzogU3RldmVu IFJvc3RlZHQgPHJvc3RlZHRAZ29vZG1pcy5vcmc+DQo+IC0tLQ0KPiAgdG9vbHMvcGVyZi91dGls L3Byb2JlLWV2ZW50LmMgfCAyOCArKysrKysrKysrKysrKysrKysrKysrKysrLS0tDQo+ICAxIGZp bGUgY2hhbmdlZCwgMjUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYg LS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9w cm9iZS1ldmVudC5jDQo+IGluZGV4IGY3YmFjYmIuLjkyNmJjZWMgMTAwNjQ0DQo+IC0tLSBhL3Rv b2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jDQo+ICsrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9i ZS1ldmVudC5jDQo+IEBAIC0xNTE5LDkgKzE1MTksMzEgQEAgaW50IHBhcnNlX3Byb2JlX3RyYWNl X2NvbW1hbmQoY29uc3QgY2hhciAqY21kLCBzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldikN Cj4gIAl9IGVsc2UNCj4gIAkJcCA9IGFyZ3ZbMV07DQo+ICAJZm10MV9zdHIgPSBzdHJ0b2tfcihw LCAiKyIsICZmbXQpOw0KPiAtCWlmIChmbXQxX3N0clswXSA9PSAnMCcpCS8qIG9ubHkgdGhlIGFk ZHJlc3Mgc3RhcnRlZCB3aXRoIDB4ICovDQo+IC0JCXRwLT5hZGRyZXNzID0gc3RydG91bChmbXQx X3N0ciwgTlVMTCwgMCk7DQo+IC0JZWxzZSB7DQo+ICsJLyogb25seSB0aGUgYWRkcmVzcyBzdGFy dGVkIHdpdGggMHggKi8NCj4gKwlpZiAoZm10MV9zdHJbMF0gPT0gJzAnKQl7DQo+ICsJCS8qDQo+ ICsJCSAqIEZpeCBhIHNwZWNpYWwgY2FzZToNCj4gKwkJICogaWYgYWRkcmVzcyA9PSAwLCBrZXJu ZWwgcmVwb3J0cyBzb21ldGhpbmcgbGlrZToNCj4gKwkJICogcDpwcm9iZV9saWJjL2Fic18wIC9s aWIvbGliYy0yLjE4LnNvOjB4ICAgICAgICAgIChudWxsKSBhcmcxPSVheA0KPiArCQkgKiBOZXdl ciBrZXJuZWwgbWF5IGZpeCB0aGF0LCBidXQgd2Ugd2FudCB0bw0KPiArCQkgKiBzdXBwb3J0IG9s ZCBrZXJuZWwgYWxzby4NCj4gKwkJICovDQo+ICsJCWlmIChzdHJjbXAoZm10MV9zdHIsICIweCIp ID09IDApIHsNCj4gKwkJCWlmICghYXJndlsyXSB8fCBzdHJjbXAoYXJndlsyXSwgIihudWxsKSIp KSB7DQo+ICsJCQkJcmV0ID0gLUVJTlZBTDsNCj4gKwkJCQlnb3RvIG91dDsNCj4gKwkJCX0NCj4g KwkJCXRwLT5hZGRyZXNzID0gMDsNCj4gKw0KPiArCQkJZnJlZShhcmd2WzJdKTsNCj4gKwkJCWZv ciAoaSA9IDI7IGFyZ3ZbaSArIDFdICE9IE5VTEw7IGkrKykNCj4gKwkJCQlhcmd2W2ldID0gYXJn dltpICsgMV07DQo+ICsNCj4gKwkJCWFyZ3ZbaV0gPSBOVUxMOw0KPiArCQkJYXJnYyAtPSAxOw0K PiArCQl9IGVsc2UNCj4gKwkJCXRwLT5hZGRyZXNzID0gc3RydG91bChmbXQxX3N0ciwgTlVMTCwg MCk7DQo+ICsJfSBlbHNlIHsNCj4gIAkJLyogT25seSB0aGUgc3ltYm9sLWJhc2VkIHByb2JlIGhh cyBvZmZzZXQgKi8NCj4gIAkJdHAtPnN5bWJvbCA9IHN0cmR1cChmbXQxX3N0cik7DQo+ICAJCWlm ICh0cC0+c3ltYm9sID09IE5VTEwpIHsNCj4gLS0NCj4gMS44LjMuNA0KDQo= -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | tip-bot for Wang Nan <tipbot@zytor.com> |
|---|---|
| Date | 2015-08-28 08:50 +0200 |
| Subject | [tip:perf/core] perf probe: Fix list result when address is zero |
| Message-ID | <q2lE7-3R6-43@gated-at.bofh.it> |
| In reply to | #1213742 |
Commit-ID: be07afe92a09638db9159d2c0794487d66a437a2
Gitweb: http://git.kernel.org/tip/be07afe92a09638db9159d2c0794487d66a437a2
Author: Wang Nan <wangnan0@huawei.com>
AuthorDate: Wed, 26 Aug 2015 10:57:43 +0000
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Wed, 26 Aug 2015 10:39:20 -0300
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>
---
tools/perf/util/probe-event.c | 28 +++++++++++++++++++++++++---
1 file changed, 25 insertions(+), 3 deletions(-)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index f7bacbb..926bcec 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)
} 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) {
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Wangnan (F)" <wangnan0@huawei.com> |
|---|---|
| Date | 2015-08-26 13:10 +0200 |
| Subject | Re: [PATCH v3 2/6] perf probe: Fix list result when neither dwarf nor map can't find symbol |
| Message-ID | <q1GKC-3VH-19@gated-at.bofh.it> |
| In reply to | #1213737 |
Please ignore this one, and use the identical one with shorter title.
Sorry for the noisy.
On 2015/8/26 18:57, Wang Nan wrote:
> 'perf probe -l' reports error if it is unable find symbol through
> address. Here is an example.
>
> # echo 'p:probe_libc/abs_5 /lib64/libc.so.6:0x5' >
> /sys/kernel/debug/tracing/uprobe_events
> # cat /sys/kernel/debug/tracing/uprobe_events
> p:probe_libc/abs_5 /lib64/libc.so.6:0x0000000000000005
> # perf probe -l
> Error: Failed to show event list
>
> Also, this situation triggers a logical inconsistency in
> convert_to_perf_probe_point() that, it returns ENOMEM but actually
> it never try strdup().
>
> This patch removes !tp->module && !is_kprobe condition, so it
> always uses address to build function name if symbol not found.
>
> Test result:
>
> # perf probe -l
> probe_libc:abs_5 (on 0x5 in /lib64/libc.so.6)
>
> Signed-off-by: Wang Nan <wangnan0@huawei.com>
> Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
> Cc: Namhyung Kim <namhyung@kernel.org>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> ---
> tools/perf/util/probe-event.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 6c7e538..f7bacbb 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -1866,7 +1866,7 @@ static int convert_to_perf_probe_point(struct probe_trace_point *tp,
> if (tp->symbol) {
> pp->function = strdup(tp->symbol);
> pp->offset = tp->offset;
> - } else if (!tp->module && !is_kprobe) {
> + } else {
> ret = e_snprintf(buf, 128, "0x%" PRIx64, (u64)tp->address);
> if (ret < 0)
> return ret;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Date | 2015-08-26 13:10 +0200 |
| Subject | [PATCH v3 2/6] perf probe: Fix list result when neither dwarf nor map can't find symbol |
| Message-ID | <q1GKC-3VH-21@gated-at.bofh.it> |
| In reply to | #1213737 |
'perf probe -l' reports error if it is unable find symbol through
address. Here is an example.
# echo 'p:probe_libc/abs_5 /lib64/libc.so.6:0x5' >
/sys/kernel/debug/tracing/uprobe_events
# cat /sys/kernel/debug/tracing/uprobe_events
p:probe_libc/abs_5 /lib64/libc.so.6:0x0000000000000005
# perf probe -l
Error: Failed to show event list
Also, this situation triggers a logical inconsistency in
convert_to_perf_probe_point() that, it returns ENOMEM but actually
it never try strdup().
This patch removes !tp->module && !is_kprobe condition, so it
always uses address to build function name if symbol not found.
Test result:
# perf probe -l
probe_libc:abs_5 (on 0x5 in /lib64/libc.so.6)
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
tools/perf/util/probe-event.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 6c7e538..f7bacbb 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -1866,7 +1866,7 @@ static int convert_to_perf_probe_point(struct probe_trace_point *tp,
if (tp->symbol) {
pp->function = strdup(tp->symbol);
pp->offset = tp->offset;
- } else if (!tp->module && !is_kprobe) {
+ } else {
ret = e_snprintf(buf, 128, "0x%" PRIx64, (u64)tp->address);
if (ret < 0)
return ret;
--
1.8.3.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web