aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Weisbecker <fweisbec@gmail.com>2009-06-13 11:39:23 -0400
committerIngo Molnar <mingo@elte.hu>2009-06-13 11:51:00 -0400
commitc17c2db1f3cea41c3543025905d3582c6937dd95 (patch)
treea795e310e24c7d07a6ea279c1b2332ee80b5b797
parentef281a196d66b8bc2d067a3704712e5b93691fbc (diff)
perf annotate: Fixes for filename:line displays
- fix addr2line on userspace binary: don't only check kernel image. - fix string allocation size for path: missing ending null char room - fix overflow in symbol extra info Reported-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> LKML-Reference: <1244907563-7820-1-git-send-email-fweisbec@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r--tools/perf/builtin-annotate.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 7a5b27867a96..94cea678fd7e 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -1116,7 +1116,7 @@ parse_line(FILE *file, struct symbol *sym, __u64 start, __u64 len)
1116 if (offset < len) 1116 if (offset < len)
1117 hits = sym->hist[offset]; 1117 hits = sym->hist[offset];
1118 1118
1119 if (sym_ext) { 1119 if (offset < len && sym_ext) {
1120 path = sym_ext[offset].path; 1120 path = sym_ext[offset].path;
1121 percent = sym_ext[offset].percent; 1121 percent = sym_ext[offset].percent;
1122 } else if (sym->hist_sum) 1122 } else if (sym->hist_sum)
@@ -1190,7 +1190,8 @@ static void free_source_line(struct symbol *sym, int len)
1190} 1190}
1191 1191
1192/* Get the filename:line for the colored entries */ 1192/* Get the filename:line for the colored entries */
1193static void get_source_line(struct symbol *sym, __u64 start, int len) 1193static void
1194get_source_line(struct symbol *sym, __u64 start, int len, char *filename)
1194{ 1195{
1195 int i; 1196 int i;
1196 char cmd[PATH_MAX * 2]; 1197 char cmd[PATH_MAX * 2];
@@ -1216,7 +1217,7 @@ static void get_source_line(struct symbol *sym, __u64 start, int len)
1216 continue; 1217 continue;
1217 1218
1218 offset = start + i; 1219 offset = start + i;
1219 sprintf(cmd, "addr2line -e %s %016llx", vmlinux, offset); 1220 sprintf(cmd, "addr2line -e %s %016llx", filename, offset);
1220 fp = popen(cmd, "r"); 1221 fp = popen(cmd, "r");
1221 if (!fp) 1222 if (!fp)
1222 continue; 1223 continue;
@@ -1224,7 +1225,7 @@ static void get_source_line(struct symbol *sym, __u64 start, int len)
1224 if (getline(&path, &line_len, fp) < 0 || !line_len) 1225 if (getline(&path, &line_len, fp) < 0 || !line_len)
1225 goto next; 1226 goto next;
1226 1227
1227 sym_ext[i].path = malloc(sizeof(char) * line_len); 1228 sym_ext[i].path = malloc(sizeof(char) * line_len + 1);
1228 if (!sym_ext[i].path) 1229 if (!sym_ext[i].path)
1229 goto next; 1230 goto next;
1230 1231
@@ -1285,7 +1286,7 @@ static void annotate_sym(struct dso *dso, struct symbol *sym)
1285 len = sym->end - sym->start; 1286 len = sym->end - sym->start;
1286 1287
1287 if (print_line) { 1288 if (print_line) {
1288 get_source_line(sym, start, len); 1289 get_source_line(sym, start, len, filename);
1289 print_summary(filename); 1290 print_summary(filename);
1290 } 1291 }
1291 1292