perf srcline: Make addr2line configuration failure more verbose
authorIan Rogers <irogers@google.com>
Tue, 13 Jun 2023 03:48:16 +0000 (20:48 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 14 Jun 2023 02:40:32 +0000 (23:40 -0300)
To aid debugging why it fails. Also, combine the loops for reading a
line for the llvm/binutils cases.

Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Changbin Du <changbin.du@huawei.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Nathan Chancellor <nathan@kernel.org>
Cc: Nick Desaulniers <ndesaulniers@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Tom Rix <trix@redhat.com>
Cc: llvm@lists.linux.dev
Link: https://lore.kernel.org/r/20230613034817.1356114-2-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/srcline.c

index aec596a..d477332 100644 (file)
@@ -443,7 +443,7 @@ enum a2l_style {
        LLVM,
 };
 
-static enum a2l_style addr2line_configure(struct child_process *a2l)
+static enum a2l_style addr2line_configure(struct child_process *a2l, const char *dso_name)
 {
        static bool cached;
        static enum a2l_style style;
@@ -452,6 +452,7 @@ static enum a2l_style addr2line_configure(struct child_process *a2l)
                char buf[128];
                struct io io;
                int ch;
+               int lines;
 
                if (write(a2l->in, ",\n", 2) != 2)
                        return BROKEN;
@@ -461,19 +462,29 @@ static enum a2l_style addr2line_configure(struct child_process *a2l)
                if (ch == ',') {
                        style = LLVM;
                        cached = true;
+                       lines = 1;
                } else if (ch == '?') {
                        style = GNU_BINUTILS;
                        cached = true;
+                       lines = 2;
                } else {
-                       style = BROKEN;
+                       if (!symbol_conf.disable_add2line_warn) {
+                               char *output = NULL;
+                               size_t output_len;
+
+                               io__getline(&io, &output, &output_len);
+                               pr_warning("%s %s: addr2line configuration failed\n",
+                                          __func__, dso_name);
+                               pr_warning("\t%c%s", ch, output);
+                       }
+                       return BROKEN;
                }
-               do {
+               while (lines) {
                        ch = io__get_char(&io);
-               } while (ch > 0 && ch != '\n');
-               if (style == GNU_BINUTILS) {
-                       do {
-                               ch = io__get_char(&io);
-                       } while (ch > 0 && ch != '\n');
+                       if (ch <= 0)
+                               break;
+                       if (ch == '\n')
+                               lines--;
                }
                /* Ignore SIGPIPE in the event addr2line exits. */
                signal(SIGPIPE, SIG_IGN);
@@ -593,12 +604,9 @@ static int addr2line(const char *dso_name, u64 addr,
                        pr_warning("%s %s: addr2line_subprocess_init failed\n", __func__, dso_name);
                goto out;
        }
-       a2l_style = addr2line_configure(a2l);
-       if (a2l_style == BROKEN) {
-               if (!symbol_conf.disable_add2line_warn)
-                       pr_warning("%s: addr2line configuration failed\n", __func__);
+       a2l_style = addr2line_configure(a2l, dso_name);
+       if (a2l_style == BROKEN)
                goto out;
-       }
 
        /*
         * Send our request and then *deliberately* send something that can't be interpreted as