aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/probe-finder.c
diff options
context:
space:
mode:
authorMasami Hiramatsu <masami.hiramatsu.pt@hitachi.com>2010-07-09 05:28:59 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2010-07-16 10:46:34 -0400
commit7cf0b79e6ffd04bba5d4e625a0fe2e30a5b383e5 (patch)
tree65a99a3bd6aeaafd723397ffb623a9a90e327474 /tools/perf/util/probe-finder.c
parent0dd9ac63ce26ec87b080ca9c3e6efed33c23ace6 (diff)
perf probe: Fix error message if get_real_path() failed
Perf probe -L shows incorrect error message (Dwarf error) if it fails to find source file. This can confuse users. # ./perf probe -s /nowhere -L vfs_read Debuginfo analysis failed. (-2) Error: Failed to show lines. (-2) With this patch, it shows correct message. # ./perf probe -s /nowhere -L vfs_read Failed to find source file. (-2) Error: Failed to show lines. (-2) LKML-Reference: <4C36EBDB.4020308@hitachi.com> Cc: Chase Douglas <chase.douglas@canonical.com> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Ingo Molnar <mingo@elte.hu> Acked-by: Chase Douglas <chase.douglas@canonical.com> Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/probe-finder.c')
-rw-r--r--tools/perf/util/probe-finder.c61
1 files changed, 5 insertions, 56 deletions
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 3e64e1fa1051..a934a364c30f 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -58,55 +58,6 @@ static int strtailcmp(const char *s1, const char *s2)
58 return 0; 58 return 0;
59} 59}
60 60
61/*
62 * Find a src file from a DWARF tag path. Prepend optional source path prefix
63 * and chop off leading directories that do not exist. Result is passed back as
64 * a newly allocated path on success.
65 * Return 0 if file was found and readable, -errno otherwise.
66 */
67static int get_real_path(const char *raw_path, char **new_path)
68{
69 if (!symbol_conf.source_prefix) {
70 if (access(raw_path, R_OK) == 0) {
71 *new_path = strdup(raw_path);
72 return 0;
73 } else
74 return -errno;
75 }
76
77 *new_path = malloc((strlen(symbol_conf.source_prefix) +
78 strlen(raw_path) + 2));
79 if (!*new_path)
80 return -ENOMEM;
81
82 for (;;) {
83 sprintf(*new_path, "%s/%s", symbol_conf.source_prefix,
84 raw_path);
85
86 if (access(*new_path, R_OK) == 0)
87 return 0;
88
89 switch (errno) {
90 case ENAMETOOLONG:
91 case ENOENT:
92 case EROFS:
93 case EFAULT:
94 raw_path = strchr(++raw_path, '/');
95 if (!raw_path) {
96 free(*new_path);
97 *new_path = NULL;
98 return -ENOENT;
99 }
100 continue;
101
102 default:
103 free(*new_path);
104 *new_path = NULL;
105 return -errno;
106 }
107 }
108}
109
110/* Line number list operations */ 61/* Line number list operations */
111 62
112/* Add a line to line number list */ 63/* Add a line to line number list */
@@ -1256,13 +1207,11 @@ end:
1256static int line_range_add_line(const char *src, unsigned int lineno, 1207static int line_range_add_line(const char *src, unsigned int lineno,
1257 struct line_range *lr) 1208 struct line_range *lr)
1258{ 1209{
1259 int ret; 1210 /* Copy source path */
1260
1261 /* Copy real path */
1262 if (!lr->path) { 1211 if (!lr->path) {
1263 ret = get_real_path(src, &lr->path); 1212 lr->path = strdup(src);
1264 if (ret != 0) 1213 if (lr->path == NULL)
1265 return ret; 1214 return -ENOMEM;
1266 } 1215 }
1267 return line_list__add_line(&lr->line_list, lineno); 1216 return line_list__add_line(&lr->line_list, lineno);
1268} 1217}
@@ -1460,7 +1409,7 @@ int find_line_range(int fd, struct line_range *lr)
1460 } 1409 }
1461 off = noff; 1410 off = noff;
1462 } 1411 }
1463 pr_debug("path: %lx\n", (unsigned long)lr->path); 1412 pr_debug("path: %s\n", lr->path);
1464 dwarf_end(dbg); 1413 dwarf_end(dbg);
1465 1414
1466 return (ret < 0) ? ret : lf.found; 1415 return (ret < 0) ? ret : lf.found;