mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-09 14:50:19 +00:00
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: Arnaldo 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: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
c7ad21af2c
commit
3846df2e0a
@ -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 {
|
|||||||
|
|
||||||
#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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user