Messages in this thread | | | From | Ian Rogers <> | Date | Tue, 12 Dec 2023 10:07:02 -0800 | Subject | Re: [PATCH 2/3] perf unwind-libdw: Handle JIT-generated DSOs properly |
| |
On Mon, Dec 11, 2023 at 11:05 PM Namhyung Kim <namhyung@kernel.org> wrote: > > Usually DSOs are mapped from the beginning of the file, so the base > address of the DSO can be calculated by map->start - map->pgoff. > > However, JIT DSOs which are generated by `perf inject -j`, are mapped > only the code segment. This makes unwind-libdw code confusing and > rejects processing unwinds in the JIT DSOs. It should use the map > start address as base for them to fix the confusion. > > Fixes: 1fe627da3033 ("perf unwind: Take pgoff into account when reporting elf to libdwfl") > Signed-off-by: Namhyung Kim <namhyung@kernel.org> > --- > tools/perf/util/unwind-libdw.c | 21 +++++++++++++++++---- > 1 file changed, 17 insertions(+), 4 deletions(-) > > diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c > index 8554db3fc0d7..6013335a8dae 100644 > --- a/tools/perf/util/unwind-libdw.c > +++ b/tools/perf/util/unwind-libdw.c > @@ -46,6 +46,7 @@ static int __report_module(struct addr_location *al, u64 ip, > { > Dwfl_Module *mod; > struct dso *dso = NULL; > + Dwarf_Addr base; > /* > * Some callers will use al->sym, so we can't just use the > * cheaper thread__find_map() here. > @@ -58,13 +59,25 @@ static int __report_module(struct addr_location *al, u64 ip, > if (!dso) > return 0; > > + /* > + * The generated JIT DSO files only map the code segment without > + * ELF headers. Since JIT codes used to be packed in a memory > + * segment, calculating the base address using pgoff falls into > + * a different code in another DSO. So just use the map->start > + * directly to pick the correct one. > + */ > + if (!strncmp(dso->long_name, "/tmp/jitted-", 12))
Perhaps it would be better to test: dso->symtab_type == DSO_BINARY_TYPE__JAVA_JIT
Thanks, Ian
> + base = map__start(al->map); > + else > + base = map__start(al->map) - map__pgoff(al->map); > + > mod = dwfl_addrmodule(ui->dwfl, ip); > if (mod) { > Dwarf_Addr s; > > dwfl_module_info(mod, NULL, &s, NULL, NULL, NULL, NULL, NULL); > - if (s != map__start(al->map) - map__pgoff(al->map)) > - mod = 0; > + if (s != base) > + mod = NULL; > } > > if (!mod) { > @@ -72,14 +85,14 @@ static int __report_module(struct addr_location *al, u64 ip, > > __symbol__join_symfs(filename, sizeof(filename), dso->long_name); > mod = dwfl_report_elf(ui->dwfl, dso->short_name, filename, -1, > - map__start(al->map) - map__pgoff(al->map), false); > + base, false); > } > if (!mod) { > char filename[PATH_MAX]; > > if (dso__build_id_filename(dso, filename, sizeof(filename), false)) > mod = dwfl_report_elf(ui->dwfl, dso->short_name, filename, -1, > - map__start(al->map) - map__pgoff(al->map), false); > + base, false); > } > > if (mod) { > -- > 2.43.0.472.g3155946c3a-goog >
| |