diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-05-20 11:15:33 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-05-20 11:15:33 -0400 |
commit | b36f19d572151abb987ce308a3e066b977a2146f (patch) | |
tree | 07f520f8b3da969d288e34a121cc31a0209eb519 /tools/perf/util/symbol.c | |
parent | 17930b405e0ecdc8ecc4d336377a92950e2de76a (diff) |
perf annotate: Use build-ids to find the right DSO
We were still using the pathname found on the MMAP event, that could not
be the one we used when recording, so use the build-id cache for that,
only falling back to use the pathname in the MMAP event if no build-ids
are available.
With this we now also are able to do secure, seamless offline annotation.
Example:
[root@doppio linux-2.6-tip]# perf report -g none -v 2> /dev/null | head -10
8.12% Xorg /usr/lib64/libpixman-1.so.0.14.0 0x0000000000026d02 B [.] pixman_rasterize_edges
4.68% firefox /usr/lib64/xulrunner-1.9.1/libxul.so 0x00000000005dbdba B [.] 0x000000005dbdba
3.70% swapper /lib/modules/2.6.34-rc6/build/vmlinux 0xffffffff81022cea ! [k] read_hpet
2.96% init /lib/modules/2.6.34-rc6/build/vmlinux 0xffffffff81022cea ! [k] read_hpet
2.73% swapper /lib/modules/2.6.34-rc6/build/vmlinux 0xffffffff8100a738 ! [k] mwait_idle_with_hints
[root@doppio linux-2.6-tip]# perf annotate -v pixman_rasterize_edges 2>&1 | grep Executing
Executing: objdump --start-address=0x000000371ce26670 --stop-address=0x000000371ce2709f -dS /root/.debug/.build-id/bd/6ac5199137aaeb279f864717d8d061477466c1|grep -v /root/.debug/.build-id/bd/6ac5199137aaeb279f864717d8d061477466c1|expand
[root@doppio linux-2.6-tip]# perf buildid-list | grep libpixman-1.so.0.14.0
bd6ac5199137aaeb279f864717d8d061477466c1 /usr/lib64/libpixman-1.so.0.14.0
[root@doppio linux-2.6-tip]#
Reported-by: Stephane Eranian <eranian@google.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/symbol.c')
-rw-r--r-- | tools/perf/util/symbol.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 96bff0e54863..aaa51ba147df 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
@@ -11,6 +11,7 @@ | |||
11 | #include <sys/param.h> | 11 | #include <sys/param.h> |
12 | #include <fcntl.h> | 12 | #include <fcntl.h> |
13 | #include <unistd.h> | 13 | #include <unistd.h> |
14 | #include "build-id.h" | ||
14 | #include "symbol.h" | 15 | #include "symbol.h" |
15 | #include "strlist.h" | 16 | #include "strlist.h" |
16 | 17 | ||
@@ -1293,7 +1294,6 @@ int dso__load(struct dso *self, struct map *map, symbol_filter_t filter) | |||
1293 | int size = PATH_MAX; | 1294 | int size = PATH_MAX; |
1294 | char *name; | 1295 | char *name; |
1295 | u8 build_id[BUILD_ID_SIZE]; | 1296 | u8 build_id[BUILD_ID_SIZE]; |
1296 | char build_id_hex[BUILD_ID_SIZE * 2 + 1]; | ||
1297 | int ret = -1; | 1297 | int ret = -1; |
1298 | int fd; | 1298 | int fd; |
1299 | struct machine *machine; | 1299 | struct machine *machine; |
@@ -1325,15 +1325,8 @@ int dso__load(struct dso *self, struct map *map, symbol_filter_t filter) | |||
1325 | } | 1325 | } |
1326 | 1326 | ||
1327 | self->origin = DSO__ORIG_BUILD_ID_CACHE; | 1327 | self->origin = DSO__ORIG_BUILD_ID_CACHE; |
1328 | 1328 | if (dso__build_id_filename(self, name, size) != NULL) | |
1329 | if (self->has_build_id) { | ||
1330 | build_id__sprintf(self->build_id, sizeof(self->build_id), | ||
1331 | build_id_hex); | ||
1332 | snprintf(name, size, "%s/%s/.build-id/%.2s/%s", | ||
1333 | getenv("HOME"), DEBUG_CACHE_DIR, | ||
1334 | build_id_hex, build_id_hex + 2); | ||
1335 | goto open_file; | 1329 | goto open_file; |
1336 | } | ||
1337 | more: | 1330 | more: |
1338 | do { | 1331 | do { |
1339 | self->origin++; | 1332 | self->origin++; |
@@ -1349,6 +1342,7 @@ more: | |||
1349 | case DSO__ORIG_BUILDID: | 1342 | case DSO__ORIG_BUILDID: |
1350 | if (filename__read_build_id(self->long_name, build_id, | 1343 | if (filename__read_build_id(self->long_name, build_id, |
1351 | sizeof(build_id))) { | 1344 | sizeof(build_id))) { |
1345 | char build_id_hex[BUILD_ID_SIZE * 2 + 1]; | ||
1352 | build_id__sprintf(build_id, sizeof(build_id), | 1346 | build_id__sprintf(build_id, sizeof(build_id), |
1353 | build_id_hex); | 1347 | build_id_hex); |
1354 | snprintf(name, size, | 1348 | snprintf(name, size, |