diff options
author | Mike Galbraith <efault@gmx.de> | 2009-07-02 02:09:46 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-07-02 02:42:21 -0400 |
commit | 429764873cf3fc3e73142872a674bb27cda589c1 (patch) | |
tree | a7c11887ad7aa055f56276a14acbe004d0ead434 /tools/perf | |
parent | 6cfcc53ed4f3ecb9319e73a03f34f1eddcb644dd (diff) |
perf_counter tools: Enable kernel module symbol loading in tools
Add the -m/--modules option to perf report and perf annotate,
which enables live module symbol/image loading. To be used
with -k/--vmlinux.
(Also give perf annotate a -P/--full-paths option.)
Signed-off-by: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <1246514986.13293.48.camel@marge.simson.net>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/builtin-annotate.c | 25 | ||||
-rw-r--r-- | tools/perf/builtin-report.c | 9 | ||||
-rw-r--r-- | tools/perf/builtin-top.c | 12 |
3 files changed, 38 insertions, 8 deletions
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index 88205686eb6e..08ea6c5329d9 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c | |||
@@ -43,6 +43,10 @@ static int dump_trace = 0; | |||
43 | 43 | ||
44 | static int verbose; | 44 | static int verbose; |
45 | 45 | ||
46 | static int modules; | ||
47 | |||
48 | static int full_paths; | ||
49 | |||
46 | static int print_line; | 50 | static int print_line; |
47 | 51 | ||
48 | static unsigned long page_size; | 52 | static unsigned long page_size; |
@@ -171,7 +175,7 @@ static int load_kernel(void) | |||
171 | if (!kernel_dso) | 175 | if (!kernel_dso) |
172 | return -1; | 176 | return -1; |
173 | 177 | ||
174 | err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, 0); | 178 | err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules); |
175 | if (err <= 0) { | 179 | if (err <= 0) { |
176 | dso__delete(kernel_dso); | 180 | dso__delete(kernel_dso); |
177 | kernel_dso = NULL; | 181 | kernel_dso = NULL; |
@@ -1268,19 +1272,25 @@ static void print_summary(char *filename) | |||
1268 | 1272 | ||
1269 | static void annotate_sym(struct dso *dso, struct symbol *sym) | 1273 | static void annotate_sym(struct dso *dso, struct symbol *sym) |
1270 | { | 1274 | { |
1271 | char *filename = dso->name; | 1275 | char *filename = dso->name, *d_filename; |
1272 | u64 start, end, len; | 1276 | u64 start, end, len; |
1273 | char command[PATH_MAX*2]; | 1277 | char command[PATH_MAX*2]; |
1274 | FILE *file; | 1278 | FILE *file; |
1275 | 1279 | ||
1276 | if (!filename) | 1280 | if (!filename) |
1277 | return; | 1281 | return; |
1278 | if (dso == kernel_dso) | 1282 | if (sym->module) |
1283 | filename = sym->module->path; | ||
1284 | else if (dso == kernel_dso) | ||
1279 | filename = vmlinux; | 1285 | filename = vmlinux; |
1280 | 1286 | ||
1281 | start = sym->obj_start; | 1287 | start = sym->obj_start; |
1282 | if (!start) | 1288 | if (!start) |
1283 | start = sym->start; | 1289 | start = sym->start; |
1290 | if (full_paths) | ||
1291 | d_filename = filename; | ||
1292 | else | ||
1293 | d_filename = basename(filename); | ||
1284 | 1294 | ||
1285 | end = start + sym->end - sym->start + 1; | 1295 | end = start + sym->end - sym->start + 1; |
1286 | len = sym->end - sym->start; | 1296 | len = sym->end - sym->start; |
@@ -1291,13 +1301,14 @@ static void annotate_sym(struct dso *dso, struct symbol *sym) | |||
1291 | } | 1301 | } |
1292 | 1302 | ||
1293 | printf("\n\n------------------------------------------------\n"); | 1303 | printf("\n\n------------------------------------------------\n"); |
1294 | printf(" Percent | Source code & Disassembly of %s\n", filename); | 1304 | printf(" Percent | Source code & Disassembly of %s\n", d_filename); |
1295 | printf("------------------------------------------------\n"); | 1305 | printf("------------------------------------------------\n"); |
1296 | 1306 | ||
1297 | if (verbose >= 2) | 1307 | if (verbose >= 2) |
1298 | printf("annotating [%p] %30s : [%p] %30s\n", dso, dso->name, sym, sym->name); | 1308 | printf("annotating [%p] %30s : [%p] %30s\n", dso, dso->name, sym, sym->name); |
1299 | 1309 | ||
1300 | sprintf(command, "objdump --start-address=0x%016Lx --stop-address=0x%016Lx -dS %s", (u64)start, (u64)end, filename); | 1310 | sprintf(command, "objdump --start-address=0x%016Lx --stop-address=0x%016Lx -dS %s|grep -v %s", |
1311 | (u64)start, (u64)end, filename, filename); | ||
1301 | 1312 | ||
1302 | if (verbose >= 3) | 1313 | if (verbose >= 3) |
1303 | printf("doing: %s\n", command); | 1314 | printf("doing: %s\n", command); |
@@ -1472,8 +1483,12 @@ static const struct option options[] = { | |||
1472 | OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, | 1483 | OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, |
1473 | "dump raw trace in ASCII"), | 1484 | "dump raw trace in ASCII"), |
1474 | OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"), | 1485 | OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"), |
1486 | OPT_BOOLEAN('m', "modules", &modules, | ||
1487 | "load module symbols - WARNING: use only with -k and LIVE kernel"), | ||
1475 | OPT_BOOLEAN('l', "print-line", &print_line, | 1488 | OPT_BOOLEAN('l', "print-line", &print_line, |
1476 | "print matching source lines (may be slow)"), | 1489 | "print matching source lines (may be slow)"), |
1490 | OPT_BOOLEAN('P', "full-paths", &full_paths, | ||
1491 | "Don't shorten the displayed pathnames"), | ||
1477 | OPT_END() | 1492 | OPT_END() |
1478 | }; | 1493 | }; |
1479 | 1494 | ||
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 38d136fedfb9..b44476ca2398 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
@@ -46,6 +46,8 @@ static int dump_trace = 0; | |||
46 | static int verbose; | 46 | static int verbose; |
47 | #define eprintf(x...) do { if (verbose) fprintf(stderr, x); } while (0) | 47 | #define eprintf(x...) do { if (verbose) fprintf(stderr, x); } while (0) |
48 | 48 | ||
49 | static int modules; | ||
50 | |||
49 | static int full_paths; | 51 | static int full_paths; |
50 | 52 | ||
51 | static unsigned long page_size; | 53 | static unsigned long page_size; |
@@ -188,7 +190,7 @@ static int load_kernel(void) | |||
188 | if (!kernel_dso) | 190 | if (!kernel_dso) |
189 | return -1; | 191 | return -1; |
190 | 192 | ||
191 | err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, 0); | 193 | err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules); |
192 | if (err <= 0) { | 194 | if (err <= 0) { |
193 | dso__delete(kernel_dso); | 195 | dso__delete(kernel_dso); |
194 | kernel_dso = NULL; | 196 | kernel_dso = NULL; |
@@ -648,6 +650,9 @@ sort__sym_print(FILE *fp, struct hist_entry *self) | |||
648 | ret += fprintf(fp, "[%c] %s", | 650 | ret += fprintf(fp, "[%c] %s", |
649 | self->dso == kernel_dso ? 'k' : | 651 | self->dso == kernel_dso ? 'k' : |
650 | self->dso == hypervisor_dso ? 'h' : '.', self->sym->name); | 652 | self->dso == hypervisor_dso ? 'h' : '.', self->sym->name); |
653 | |||
654 | if (self->sym->module) | ||
655 | ret += fprintf(fp, "\t[%s]", self->sym->module->name); | ||
651 | } else { | 656 | } else { |
652 | ret += fprintf(fp, "%#016llx", (u64)self->ip); | 657 | ret += fprintf(fp, "%#016llx", (u64)self->ip); |
653 | } | 658 | } |
@@ -1710,6 +1715,8 @@ static const struct option options[] = { | |||
1710 | OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, | 1715 | OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, |
1711 | "dump raw trace in ASCII"), | 1716 | "dump raw trace in ASCII"), |
1712 | OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"), | 1717 | OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"), |
1718 | OPT_BOOLEAN('m', "modules", &modules, | ||
1719 | "load module symbols - WARNING: use only with -k and LIVE kernel"), | ||
1713 | OPT_STRING('s', "sort", &sort_order, "key[,key2...]", | 1720 | OPT_STRING('s', "sort", &sort_order, "key[,key2...]", |
1714 | "sort by key(s): pid, comm, dso, symbol, parent"), | 1721 | "sort by key(s): pid, comm, dso, symbol, parent"), |
1715 | OPT_BOOLEAN('P', "full-paths", &full_paths, | 1722 | OPT_BOOLEAN('P', "full-paths", &full_paths, |
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index 9bb25fc3d4ce..aa044ea1482b 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -66,6 +66,7 @@ static unsigned int page_size; | |||
66 | static unsigned int mmap_pages = 16; | 66 | static unsigned int mmap_pages = 16; |
67 | static int freq = 0; | 67 | static int freq = 0; |
68 | static int verbose = 0; | 68 | static int verbose = 0; |
69 | static char *vmlinux = NULL; | ||
69 | 70 | ||
70 | static char *sym_filter; | 71 | static char *sym_filter; |
71 | static unsigned long filter_start; | 72 | static unsigned long filter_start; |
@@ -265,7 +266,10 @@ static void print_sym_table(void) | |||
265 | printf("%9.1f %10ld - ", syme->weight, syme->snap_count); | 266 | printf("%9.1f %10ld - ", syme->weight, syme->snap_count); |
266 | 267 | ||
267 | color_fprintf(stdout, color, "%4.1f%%", pcnt); | 268 | color_fprintf(stdout, color, "%4.1f%%", pcnt); |
268 | printf(" - %016llx : %s\n", sym->start, sym->name); | 269 | printf(" - %016llx : %s", sym->start, sym->name); |
270 | if (sym->module) | ||
271 | printf("\t[%s]", sym->module->name); | ||
272 | printf("\n"); | ||
269 | } | 273 | } |
270 | } | 274 | } |
271 | 275 | ||
@@ -359,12 +363,13 @@ static int parse_symbols(void) | |||
359 | { | 363 | { |
360 | struct rb_node *node; | 364 | struct rb_node *node; |
361 | struct symbol *sym; | 365 | struct symbol *sym; |
366 | int modules = vmlinux ? 1 : 0; | ||
362 | 367 | ||
363 | kernel_dso = dso__new("[kernel]", sizeof(struct sym_entry)); | 368 | kernel_dso = dso__new("[kernel]", sizeof(struct sym_entry)); |
364 | if (kernel_dso == NULL) | 369 | if (kernel_dso == NULL) |
365 | return -1; | 370 | return -1; |
366 | 371 | ||
367 | if (dso__load_kernel(kernel_dso, NULL, symbol_filter, 1, 0) <= 0) | 372 | if (dso__load_kernel(kernel_dso, vmlinux, symbol_filter, verbose, modules) <= 0) |
368 | goto out_delete_dso; | 373 | goto out_delete_dso; |
369 | 374 | ||
370 | node = rb_first(&kernel_dso->syms); | 375 | node = rb_first(&kernel_dso->syms); |
@@ -680,6 +685,7 @@ static const struct option options[] = { | |||
680 | "system-wide collection from all CPUs"), | 685 | "system-wide collection from all CPUs"), |
681 | OPT_INTEGER('C', "CPU", &profile_cpu, | 686 | OPT_INTEGER('C', "CPU", &profile_cpu, |
682 | "CPU to profile on"), | 687 | "CPU to profile on"), |
688 | OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"), | ||
683 | OPT_INTEGER('m', "mmap-pages", &mmap_pages, | 689 | OPT_INTEGER('m', "mmap-pages", &mmap_pages, |
684 | "number of mmap data pages"), | 690 | "number of mmap data pages"), |
685 | OPT_INTEGER('r', "realtime", &realtime_prio, | 691 | OPT_INTEGER('r', "realtime", &realtime_prio, |
@@ -709,6 +715,8 @@ int cmd_top(int argc, const char **argv, const char *prefix __used) | |||
709 | { | 715 | { |
710 | int counter; | 716 | int counter; |
711 | 717 | ||
718 | symbol__init(); | ||
719 | |||
712 | page_size = sysconf(_SC_PAGE_SIZE); | 720 | page_size = sysconf(_SC_PAGE_SIZE); |
713 | 721 | ||
714 | argc = parse_options(argc, argv, options, top_usage, 0); | 722 | argc = parse_options(argc, argv, options, top_usage, 0); |