Re: [PATCH] perf probe: Warn user to rebuild target with debuginfo

From: Masami Hiramatsu
Date: Thu Aug 14 2014 - 21:51:46 EST


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 <masami.hiramatsu.pt@xxxxxxxxxxx>
> Reported-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
> Cc: Jiri Olsa <jolsa@xxxxxxxxxx>
> Cc: Namhyung Kim <namhyung@xxxxxxxxx>
> Cc: David Ahern <dsahern@xxxxxxxxx>
> Cc: Brendan Gregg <brendan.d.gregg@xxxxxxxxx>
> ---
> 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: masami.hiramatsu.pt@xxxxxxxxxxx


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/