Commit 3846df2e authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by Ingo Molnar

perf symbols: Improve debugging information about symtab origins

Be more clear about DSO long names and tell from which file
kernel symbols were obtained, all in --verbose mode:

    [root@mica ~]# perf report -v > /dev/null
    Looking at the vmlinux_path (5 entries long)
    Using /lib/modules/2.6.33-rc8-tip-00777-g0918527-dirty/build/vmlinux for symbols
    [root@mica ~]# mv /lib/modules/2.6.33-rc8-tip-00777-g0918527-dirty/build/vmlinux /tmp/dd
    [root@mica ~]# perf report -v > /dev/null
    Looking at the vmlinux_path (5 entries long)
    Using /proc/kallsyms for symbols
    [root@mica ~]#
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1266866139-6361-1-git-send-email-acme@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent c7ad21af
...@@ -5,6 +5,11 @@ ...@@ -5,6 +5,11 @@
#include <stdio.h> #include <stdio.h>
#include "debug.h" #include "debug.h"
const char *map_type__name[MAP__NR_TYPES] = {
[MAP__FUNCTION] = "Functions",
[MAP__VARIABLE] = "Variables",
};
static inline int is_anon_memory(const char *filename) static inline int is_anon_memory(const char *filename)
{ {
return strcmp(filename, "//anon") == 0; return strcmp(filename, "//anon") == 0;
......
...@@ -13,6 +13,8 @@ enum map_type { ...@@ -13,6 +13,8 @@ enum map_type {
#define MAP__NR_TYPES (MAP__VARIABLE + 1) #define MAP__NR_TYPES (MAP__VARIABLE + 1)
extern const char *map_type__name[MAP__NR_TYPES];
struct dso; struct dso;
struct ref_reloc_sym; struct ref_reloc_sym;
struct map_groups; struct map_groups;
......
...@@ -367,6 +367,10 @@ size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp) ...@@ -367,6 +367,10 @@ size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp)
struct rb_node *nd; struct rb_node *nd;
size_t ret = fprintf(fp, "dso: %s (", self->short_name); size_t ret = fprintf(fp, "dso: %s (", self->short_name);
if (self->short_name != self->long_name)
ret += fprintf(fp, "%s, ", self->long_name);
ret += fprintf(fp, "%s, %sloaded, ", map_type__name[type],
self->loaded ? "" : "NOT ");
ret += dso__fprintf_buildid(self, fp); ret += dso__fprintf_buildid(self, fp);
ret += fprintf(fp, ")\n"); ret += fprintf(fp, ")\n");
for (nd = rb_first(&self->symbols[type]); nd; nd = rb_next(nd)) { for (nd = rb_first(&self->symbols[type]); nd; nd = rb_next(nd)) {
...@@ -1580,6 +1584,9 @@ static int dso__load_vmlinux(struct dso *self, struct map *map, ...@@ -1580,6 +1584,9 @@ static int dso__load_vmlinux(struct dso *self, struct map *map,
err = dso__load_sym(self, map, vmlinux, fd, filter, 0); err = dso__load_sym(self, map, vmlinux, fd, filter, 0);
close(fd); close(fd);
if (err > 0)
pr_debug("Using %s for symbols\n", vmlinux);
return err; return err;
} }
...@@ -1594,7 +1601,6 @@ int dso__load_vmlinux_path(struct dso *self, struct map *map, ...@@ -1594,7 +1601,6 @@ int dso__load_vmlinux_path(struct dso *self, struct map *map,
for (i = 0; i < vmlinux_path__nr_entries; ++i) { for (i = 0; i < vmlinux_path__nr_entries; ++i) {
err = dso__load_vmlinux(self, map, vmlinux_path[i], filter); err = dso__load_vmlinux(self, map, vmlinux_path[i], filter);
if (err > 0) { if (err > 0) {
pr_debug("Using %s for symbols\n", vmlinux_path[i]);
dso__set_long_name(self, strdup(vmlinux_path[i])); dso__set_long_name(self, strdup(vmlinux_path[i]));
break; break;
} }
...@@ -1661,12 +1667,16 @@ static int dso__load_kernel_sym(struct dso *self, struct map *map, ...@@ -1661,12 +1667,16 @@ static int dso__load_kernel_sym(struct dso *self, struct map *map,
if (asprintf(&kallsyms_allocated_filename, if (asprintf(&kallsyms_allocated_filename,
"%s/.debug/[kernel.kallsyms]/%s", "%s/.debug/[kernel.kallsyms]/%s",
getenv("HOME"), sbuild_id) == -1) getenv("HOME"), sbuild_id) == -1) {
pr_err("Not enough memory for kallsyms file lookup\n");
return -1; return -1;
}
kallsyms_filename = kallsyms_allocated_filename; kallsyms_filename = kallsyms_allocated_filename;
if (access(kallsyms_filename, F_OK)) { if (access(kallsyms_filename, F_OK)) {
pr_err("No kallsyms or vmlinux with build-id %s "
"was found\n", sbuild_id);
free(kallsyms_allocated_filename); free(kallsyms_allocated_filename);
return -1; return -1;
} }
...@@ -1680,6 +1690,8 @@ static int dso__load_kernel_sym(struct dso *self, struct map *map, ...@@ -1680,6 +1690,8 @@ static int dso__load_kernel_sym(struct dso *self, struct map *map,
do_kallsyms: do_kallsyms:
err = dso__load_kallsyms(self, kallsyms_filename, map, filter); err = dso__load_kallsyms(self, kallsyms_filename, map, filter);
if (err > 0)
pr_debug("Using %s for symbols\n", kallsyms_filename);
free(kallsyms_allocated_filename); free(kallsyms_allocated_filename);
out_try_fixup: out_try_fixup:
......
...@@ -53,11 +53,6 @@ int thread__comm_len(struct thread *self) ...@@ -53,11 +53,6 @@ int thread__comm_len(struct thread *self)
return self->comm_len; return self->comm_len;
} }
static const char *map_type__name[MAP__NR_TYPES] = {
[MAP__FUNCTION] = "Functions",
[MAP__VARIABLE] = "Variables",
};
static size_t __map_groups__fprintf_maps(struct map_groups *self, static size_t __map_groups__fprintf_maps(struct map_groups *self,
enum map_type type, FILE *fp) enum map_type type, FILE *fp)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment