perf srcline: Make addr2line configuration failure more verbose
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>
This commit is contained in:
Родитель
d436373a75
Коммит
c7a0023a14
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче