From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: Ingo Molnar <mingo@elte.hu>
Cc: Paul Mackerras <paulus@samba.org>,
Corey Ashford <cjashfor@linux.vnet.ibm.com>,
linux-kernel@vger.kernel.org,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
Arnaldo Carvalho de Melo <acme@redhat.com>,
John Kacur <jkacur@redhat.com>, Mike Galbraith <efault@gmx.de>
Subject: [PATCH 1/7] perf_counter: tools: /usr/lib/debug%s.debug support
Date: Wed, 27 May 2009 20:20:22 +0200 [thread overview]
Message-ID: <20090527182100.593234422@chello.nl> (raw)
In-Reply-To: 20090527182021.231666503@chello.nl
[-- Attachment #1: perf_counter-tools-report-foo.patch --]
[-- Type: text/plain, Size: 4157 bytes --]
Some distro's seem to store debuginfo in weird places.
LKML-Reference: <new-submission>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
---
Documentation/perf_counter/builtin-report.c | 94 ++++++++++++++++++++++------
1 file changed, 76 insertions(+), 18 deletions(-)
Index: linux-2.6/Documentation/perf_counter/builtin-report.c
===================================================================
--- linux-2.6.orig/Documentation/perf_counter/builtin-report.c
+++ linux-2.6/Documentation/perf_counter/builtin-report.c
@@ -190,7 +190,8 @@ static inline int elf_sym__is_function(c
{
return elf_sym__type(sym) == STT_FUNC &&
sym->st_name != 0 &&
- sym->st_shndx != SHN_UNDEF;
+ sym->st_shndx != SHN_UNDEF &&
+ sym->st_size != 0;
}
static inline const char *elf_sym__name(const GElf_Sym *sym,
@@ -222,11 +223,11 @@ static Elf_Scn *elf_section_by_name(Elf
return sec;
}
-static int dso__load(struct dso *self)
+static int dso__load_sym(struct dso *self, int fd, char *name)
{
Elf_Data *symstrs;
uint32_t nr_syms;
- int fd, err = -1;
+ int err = -1;
uint32_t index;
GElf_Ehdr ehdr;
GElf_Shdr shdr;
@@ -234,16 +235,12 @@ static int dso__load(struct dso *self)
GElf_Sym sym;
Elf_Scn *sec;
Elf *elf;
-
-
- fd = open(self->name, O_RDONLY);
- if (fd == -1)
- return -1;
+ int nr = 0;
elf = elf_begin(fd, ELF_C_READ_MMAP, NULL);
if (elf == NULL) {
fprintf(stderr, "%s: cannot read %s ELF file.\n",
- __func__, self->name);
+ __func__, name);
goto out_close;
}
@@ -292,16 +289,63 @@ static int dso__load(struct dso *self)
goto out_elf_end;
dso__insert_symbol(self, f);
+
+ nr++;
}
- err = 0;
+ err = nr;
out_elf_end:
elf_end(elf);
out_close:
- close(fd);
return err;
}
+static int dso__load(struct dso *self)
+{
+ int size = strlen(self->name) + sizeof("/usr/lib/debug%s.debug");
+ char *name = malloc(size);
+ int variant = 0;
+ int ret = -1;
+ int fd;
+
+ if (!name)
+ return -1;
+
+more:
+ do {
+ switch (variant) {
+ case 0: /* Fedora */
+ snprintf(name, size, "/usr/lib/debug%s.debug", self->name);
+ break;
+ case 1: /* Ubuntu */
+ snprintf(name, size, "/usr/lib/debug%s", self->name);
+ break;
+ case 2: /* Sane people */
+ snprintf(name, size, "%s", self->name);
+ break;
+
+ default:
+ goto out;
+ }
+ variant++;
+
+ fd = open(name, O_RDONLY);
+ } while (fd < 0);
+
+ ret = dso__load_sym(self, fd, name);
+ close(fd);
+
+ /*
+ * Some people seem to have debuginfo files _WITHOUT_ debug info!?!?
+ */
+ if (!ret)
+ goto more;
+
+out:
+ free(name);
+ return ret;
+}
+
static size_t dso__fprintf(struct dso *self, FILE *fp)
{
size_t ret = fprintf(fp, "dso: %s\n", self->name);
@@ -336,11 +380,23 @@ static struct dso *dsos__find(const char
static struct dso *dsos__findnew(const char *name)
{
struct dso *dso = dsos__find(name);
+ int nr;
if (dso == NULL) {
dso = dso__new(name);
- if (dso != NULL && dso__load(dso) < 0)
+ if (!dso)
+ goto out_delete_dso;
+
+ nr = dso__load(dso);
+ if (nr < 0) {
+ fprintf(stderr, "Failed to open: %s\n", name);
goto out_delete_dso;
+ }
+ if (!nr) {
+ fprintf(stderr,
+ "Failed to find debug symbols for: %s, maybe install a debug package?\n",
+ name);
+ }
dsos__add(dso);
}
@@ -547,9 +603,9 @@ symhist__fprintf(struct symhist *self, u
size_t ret;
if (total_samples)
- ret = fprintf(fp, "%5.2f", (self->count * 100.0) / total_samples);
+ ret = fprintf(fp, "%5.2f%% ", (self->count * 100.0) / total_samples);
else
- ret = fprintf(fp, "%12d", self->count);
+ ret = fprintf(fp, "%12d ", self->count);
ret += fprintf(fp, "%14s [%c] ",
thread__name(self->thread, bf, sizeof(bf)),
@@ -922,10 +978,12 @@ more:
}
default: {
broken_event:
- fprintf(stderr, "%p [%p]: skipping unknown header type: %d\n",
- (void *)(offset + head),
- (void *)(long)(event->header.size),
- event->header.type);
+ if (dump_trace)
+ fprintf(stderr, "%p [%p]: skipping unknown header type: %d\n",
+ (void *)(offset + head),
+ (void *)(long)(event->header.size),
+ event->header.type);
+
total_unknown++;
/*
--
next prev parent reply other threads:[~2009-05-27 18:23 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-05-27 18:20 [PATCH 0/7] perf report --sort Peter Zijlstra
2009-05-27 18:20 ` Peter Zijlstra [this message]
2009-05-27 18:20 ` [PATCH 2/7] perf_counter: tools: report: add vmlinux support Peter Zijlstra
2009-05-27 19:51 ` [tip:perfcounters/core] perf_counter: tools: report: Add " tip-bot for Peter Zijlstra
2009-05-27 18:20 ` [PATCH 3/7] perf_counter: tools: report: rework histogram code Peter Zijlstra
2009-05-27 19:51 ` [tip:perfcounters/core] perf_counter: tools: report: Rework " tip-bot for Peter Zijlstra
2009-05-27 18:20 ` [PATCH 4/7] perf_counter: tools: report: dynamic sort/print bits Peter Zijlstra
2009-05-27 19:51 ` [tip:perfcounters/core] perf_counter: tools: report: Dynamic " tip-bot for Peter Zijlstra
2009-05-27 18:20 ` [PATCH 5/7] pref_counter: tools: report: --sort option Peter Zijlstra
2009-05-27 19:52 ` [tip:perfcounters/core] pref_counter: tools: report: Add " tip-bot for Peter Zijlstra
2009-05-27 18:20 ` [PATCH 6/7] perf_counter: tools: report: add comm sorting Peter Zijlstra
2009-05-27 19:52 ` [tip:perfcounters/core] perf_counter: tools: report: Add " tip-bot for Peter Zijlstra
2009-05-27 18:20 ` [PATCH 7/7] pref_counter: tools: report: add dso sorting Peter Zijlstra
2009-05-27 19:52 ` [tip:perfcounters/core] pref_counter: tools: report: Add " tip-bot for Peter Zijlstra
2009-05-27 20:46 ` [tip:perfcounters/core] pref_counter: tools: report: Add header printout & prettify tip-bot for Ingo Molnar
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=20090527182100.593234422@chello.nl \
--to=a.p.zijlstra@chello.nl \
--cc=acme@redhat.com \
--cc=cjashfor@linux.vnet.ibm.com \
--cc=efault@gmx.de \
--cc=jkacur@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=paulus@samba.org \
/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