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,
|
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 bool cached;
|
||||||
static enum a2l_style style;
|
static enum a2l_style style;
|
||||||
|
@ -452,6 +452,7 @@ static enum a2l_style addr2line_configure(struct child_process *a2l)
|
||||||
char buf[128];
|
char buf[128];
|
||||||
struct io io;
|
struct io io;
|
||||||
int ch;
|
int ch;
|
||||||
|
int lines;
|
||||||
|
|
||||||
if (write(a2l->in, ",\n", 2) != 2)
|
if (write(a2l->in, ",\n", 2) != 2)
|
||||||
return BROKEN;
|
return BROKEN;
|
||||||
|
@ -461,19 +462,29 @@ static enum a2l_style addr2line_configure(struct child_process *a2l)
|
||||||
if (ch == ',') {
|
if (ch == ',') {
|
||||||
style = LLVM;
|
style = LLVM;
|
||||||
cached = true;
|
cached = true;
|
||||||
|
lines = 1;
|
||||||
} else if (ch == '?') {
|
} else if (ch == '?') {
|
||||||
style = GNU_BINUTILS;
|
style = GNU_BINUTILS;
|
||||||
cached = true;
|
cached = true;
|
||||||
|
lines = 2;
|
||||||
} else {
|
} 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);
|
ch = io__get_char(&io);
|
||||||
} while (ch > 0 && ch != '\n');
|
if (ch <= 0)
|
||||||
if (style == GNU_BINUTILS) {
|
break;
|
||||||
do {
|
if (ch == '\n')
|
||||||
ch = io__get_char(&io);
|
lines--;
|
||||||
} while (ch > 0 && ch != '\n');
|
|
||||||
}
|
}
|
||||||
/* Ignore SIGPIPE in the event addr2line exits. */
|
/* Ignore SIGPIPE in the event addr2line exits. */
|
||||||
signal(SIGPIPE, SIG_IGN);
|
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);
|
pr_warning("%s %s: addr2line_subprocess_init failed\n", __func__, dso_name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
a2l_style = addr2line_configure(a2l);
|
a2l_style = addr2line_configure(a2l, dso_name);
|
||||||
if (a2l_style == BROKEN) {
|
if (a2l_style == BROKEN)
|
||||||
if (!symbol_conf.disable_add2line_warn)
|
|
||||||
pr_warning("%s: addr2line configuration failed\n", __func__);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Send our request and then *deliberately* send something that can't be interpreted as
|
* Send our request and then *deliberately* send something that can't be interpreted as
|
||||||
|
|
Загрузка…
Ссылка в новой задаче