From: Wang Nan <wangnan0@huawei.com>
To: acme@kernel.org
Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org,
Wang Nan <wangnan0@huawei.com>,
Arnaldo Carvalho de Melo <acme@redhat.com>,
Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
Namhyung Kim <namhyung@kernel.org>, Zefan Li <lizefan@huawei.com>,
pi3orama@163.com
Subject: [PATCH] perf probe: Adjust dso->long_name for offline module
Date: Wed, 25 Nov 2015 11:30:59 +0000 [thread overview]
Message-ID: <1448451059-156220-1-git-send-email-wangnan0@huawei.com> (raw)
If libelf unable to open debuginfo for an offline module but the ko has
symtab, something unexpected may happen.
# rm -rf ~/.debug/
# mv /usr/lib64/elfutils/libebl_x86_64.so{,.bak}
# ./perf probe -m /home/wangnan/kmodule/mymodule.ko my_func
[mymodule] with build id 326ab42550ef3d24944f53c817533728367effeb not found, continuing without symbols
Failed to find symbol my_func in /home/wangnan/kmodule/mymodule.ko
Error: Failed to add events
# ./perf buildid-cache -a ./mymodule.ko
# ./perf probe -m /home/wangnan/kmodule/mymodule.ko my_func
Added new event:
probe:my_func (on my_func in /home/wangnan/kmodule/mymodule.ko)
You can now use it in all perf tools, such as:
perf record -e probe:my_func -aR sleep 1
In the above example, probe fails if it isn't in buildid-cache. However,
user would expect it success in both case because perf is able to find
probe points actually.
The problem is because perf won't utilize module's full path if it
failed to open debuginfo. In
convert_to_probe_trace_events ->
find_probe_trace_events_from_map ->
get_target_map ->
kernel_get_module_map ->
machine__findnew_module_map ->
map_groups__find_by_name
map_groups__find_by_name() is able to find the map of that module, but
this information is found from /proc/modules before it knows the real
path of the offline module. Therefore, the map->dso->long_name is
set to something like '[mymodule]', which prevents dso__load() find
the real path of the module file.
In another aspect, if dso__load() can get the offline module through
buildid cache, it can read symble table from that ko. Even if debuginfo
is not available, 'perf probe' can success if the '.symtab' can be
found.
This patch fixes long_name so dso__load() is able to find module's path
and read symbol table in this case.
After this patch:
# rm -rf ~/.debug/
# mv /usr/lib64/elfutils/libebl_x86_64.so{,.bak}
# ./perf probe -m /home/wangnan/kmodule/mymodule.ko my_func
Added new event:
probe:my_func (on my_func in /home/wangnan/kmodule/mymodule.ko)
You can now use it in all perf tools, such as:
perf record -e probe:my_func -aR sleep 1
# mv /usr/lib64/elfutils/libebl_x86_64.so{.bak,}
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
---
tools/perf/util/probe-event.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
index 93996ec..ea4f79f 100644
--- a/tools/perf/util/probe-event.c
+++ b/tools/perf/util/probe-event.c
@@ -2516,6 +2516,7 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev,
struct probe_trace_point *tp;
int num_matched_functions;
int ret, i, j, skipped = 0;
+ const char *dup_filename;
map = get_target_map(pev->target, pev->uprobes);
if (!map) {
@@ -2523,6 +2524,21 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev,
goto out;
}
+ /*
+ * If the map's dso is an offline module, give dso__load() a chance
+ * to find the file path of that module by fixing long_name.
+ */
+ if (map->dso && strchr(pev->target, '/')) {
+ if (!map->dso->long_name || map->dso->long_name[0] == '[') {
+ dup_filename = strdup(pev->target);
+ if (!dup_filename) {
+ ret = -ENOMEM;
+ goto out;
+ }
+ dso__set_long_name(map->dso, dup_filename, true);
+ }
+ }
+
syms = malloc(sizeof(struct symbol *) * probe_conf.max_probes);
if (!syms) {
ret = -ENOMEM;
--
1.8.3.4
next reply other threads:[~2015-11-25 11:35 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-11-25 11:30 Wang Nan [this message]
2015-11-25 19:35 ` [PATCH] perf probe: Adjust dso->long_name for offline module Arnaldo Carvalho de Melo
2015-11-26 3:22 ` Wangnan (F)
2015-11-26 1:10 ` 平松雅巳 / HIRAMATU,MASAMI
2015-11-26 1:29 ` Wangnan (F)
2015-11-26 3:19 ` [PATCH v2] " Wang Nan
2015-11-26 3:59 ` [PATCH v3] " Wang Nan
2015-11-26 16:45 ` Arnaldo Carvalho de Melo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1448451059-156220-1-git-send-email-wangnan0@huawei.com \
--to=wangnan0@huawei.com \
--cc=acme@kernel.org \
--cc=acme@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=lizefan@huawei.com \
--cc=masami.hiramatsu.pt@hitachi.com \
--cc=namhyung@kernel.org \
--cc=pi3orama@163.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).