Here is v2 patch, which I've added "or install an appropriate debuginfo pacakge." :)
Thank you, (2014/08/15 10:44), Masami Hiramatsu wrote: > Warn user to rebuild target with debuginfo when the perf probe > fails to find debug information in the target binary. > Without this, perf probe just reports the failure, but it's > no hint for users. This gives more hint for users. > > Without this, > > $ strip perf > $ ./perf probe -x perf -L argv_split > Failed to open debuginfo file. > Error: Failed to show lines. > > With this, > > $ strip perf > $ ./perf probe -x perf -L argv_split > The /home/fedora/ksrc/linux-3/tools/perf/perf file has no debug information. > Rebuild with -g, or install an appropriate debuginfo pacakge. > Error: Failed to show lines. > > The "rebuild with ..." part changes to "rebuild with CONFIG_DEBUG_INFO" > if the target is the kernel or a kernel module. > > Signed-off-by: Masami Hiramatsu <[email protected]> > Reported-by: Arnaldo Carvalho de Melo <[email protected]> > Cc: Jiri Olsa <[email protected]> > Cc: Namhyung Kim <[email protected]> > Cc: David Ahern <[email protected]> > Cc: Brendan Gregg <[email protected]> > --- > tools/perf/util/probe-event.c | 41 > +++++++++++++++++++++++------------------ > 1 file changed, 23 insertions(+), 18 deletions(-) > > diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c > index 784ea42..9a29c72 100644 > --- a/tools/perf/util/probe-event.c > +++ b/tools/perf/util/probe-event.c > @@ -258,21 +258,33 @@ static void clear_probe_trace_events(struct > probe_trace_event *tevs, int ntevs) > #ifdef HAVE_DWARF_SUPPORT > > /* Open new debuginfo of given module */ > -static struct debuginfo *open_debuginfo(const char *module) > +static struct debuginfo *open_debuginfo(const char *module, bool silent) > { > const char *path = module; > + struct debuginfo *ret; > > if (!module || !strchr(module, '/')) { > path = kernel_get_module_path(module); > if (!path) { > - pr_err("Failed to find path of %s module.\n", > - module ?: "kernel"); > + if (!silent) > + pr_err("Failed to find path of %s module.\n", > + module ?: "kernel"); > return NULL; > } > } > - return debuginfo__new(path); > + ret = debuginfo__new(path); > + if (!ret && !silent) { > + pr_warning("The %s file has no debug information.\n", path); > + if (!module || !strtailcmp(path, ".ko")) > + pr_warning("Rebuild with CONFIG_DEBUG_INFO=y, "); > + else > + pr_warning("Rebuild with -g, "); > + pr_warning("or install an appropriate debuginfo pacakge.\n"); > + } > + return ret; > } > > + > static int get_text_start_address(const char *exec, unsigned long *address) > { > Elf *elf; > @@ -333,15 +345,13 @@ static int find_perf_probe_point_from_dwarf(struct > probe_trace_point *tp, > pr_debug("try to find information at %" PRIx64 " in %s\n", addr, > tp->module ? : "kernel"); > > - dinfo = open_debuginfo(tp->module); > + dinfo = open_debuginfo(tp->module, verbose == 0); > if (dinfo) { > ret = debuginfo__find_probe_point(dinfo, > (unsigned long)addr, pp); > debuginfo__delete(dinfo); > - } else { > - pr_debug("Failed to open debuginfo at 0x%" PRIx64 "\n", addr); > + } else > ret = -ENOENT; > - } > > if (ret > 0) { > pp->retprobe = tp->retprobe; > @@ -457,13 +467,11 @@ static int try_to_find_probe_trace_events(struct > perf_probe_event *pev, > struct debuginfo *dinfo; > int ntevs, ret = 0; > > - dinfo = open_debuginfo(target); > + dinfo = open_debuginfo(target, !need_dwarf); > > if (!dinfo) { > - if (need_dwarf) { > - pr_warning("Failed to open debuginfo file.\n"); > + if (need_dwarf) > return -ENOENT; > - } > pr_debug("Could not open debuginfo. Try to use symbols.\n"); > return 0; > } > @@ -620,11 +628,9 @@ static int __show_line_range(struct line_range *lr, > const char *module) > char *tmp; > > /* Search a line range */ > - dinfo = open_debuginfo(module); > - if (!dinfo) { > - pr_warning("Failed to open debuginfo file.\n"); > + dinfo = open_debuginfo(module, false); > + if (!dinfo) > return -ENOENT; > - } > > ret = debuginfo__find_line_range(dinfo, lr); > debuginfo__delete(dinfo); > @@ -772,9 +778,8 @@ int show_available_vars(struct perf_probe_event *pevs, > int npevs, > if (ret < 0) > return ret; > > - dinfo = open_debuginfo(module); > + dinfo = open_debuginfo(module, false); > if (!dinfo) { > - pr_warning("Failed to open debuginfo file.\n"); > ret = -ENOENT; > goto out; > } > > -- Masami HIRAMATSU Software Platform Research Dept. Linux Technology Research Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: [email protected] -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

