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

From: Arnaldo Carvalho de Melo
Date: Thu Aug 14 2014 - 14:56:00 EST


Em Thu, Aug 14, 2014 at 06:29:38PM +0000, Masami Hiramatsu escreveu:
> 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,

That was quick!

The changelog also was nicely written, stating the problem, then
providing an example to exhibit the problem before the patch, then the
end result, with the intended behaviour, after the patch.

Thanks a lot!

- Arnaldo

> $ 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.
> 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>
> ---
> tools/perf/util/probe-event.c | 40 ++++++++++++++++++++++------------------
> 1 file changed, 22 insertions(+), 18 deletions(-)
>
> diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
> index 784ea42..57eb343 100644
> --- a/tools/perf/util/probe-event.c
> +++ b/tools/perf/util/probe-event.c
> @@ -258,21 +258,32 @@ 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, ", path);
> + if (!module || !strtailcmp(path, ".ko"))
> + pr_warning("rebuild with CONFIG_DEBUG_INFO=y.\n");
> + else
> + pr_warning("rebuild with -g.\n");
> + }
> + return ret;
> }
>
> +
> static int get_text_start_address(const char *exec, unsigned long *address)
> {
> Elf *elf;
> @@ -333,15 +344,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 +466,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 +627,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 +777,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;
> }
--
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/