From: James Clark <james.clark@linaro.org>
To: Ian Rogers <irogers@google.com>
Cc: Tony Jones <tonyj@suse.de>, Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>,
Adrian Hunter <adrian.hunter@intel.com>,
Howard Chu <howardchu95@gmail.com>,
Stephen Brennan <stephen.s.brennan@oracle.com>,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v3 0/7] perf: Add a libdw addr2line implementation
Date: Mon, 12 Jan 2026 11:18:12 +0000 [thread overview]
Message-ID: <dbdd0541-0a67-4d61-9ae2-7820920e8f7a@linaro.org> (raw)
In-Reply-To: <20260111041338.1817056-1-irogers@google.com>
On 11/01/2026 4:13 am, Ian Rogers wrote:
> addr2line is a performance bottleneck in perf, add a libdw based
> implementation that avoids forking addr2line and caches the decoded
> debug information.
>
> Allow the addr2line implementation to be picked via the configuration
> file or --addr2line-style with `perf report`.
>
> Test/fix that inline callchains are properly displayed by perf script.
>
> An example:
> ```
> $ perf record --call-graph dwarf -e cycles:u -- perf test -w inlineloop 1
> [ perf record: Woken up 132 times to write data ]
> [ perf record: Captured and wrote 32.814 MB perf.data (4074 samples) ]
> $ perf script --fields +srcline
> ...
> perf-inlineloop 1814670 293100.228871: 640004 cpu_core/cycles/u:
> 55a11d6e61ee leaf+0x2e
> inlineloop.c:21 (inlined)
> 55a11d6e61ee middle+0x2e
> inlineloop.c:27 (inlined)
> 55a11d6e61ee parent+0x2e (perf)
> inlineloop.c:32
> 55a11d6e629b inlineloop+0x8b (perf)
> inlineloop.c:47
> 55a11d69a3bc run_workload+0x5a (perf)
> builtin-test.c:715
> 55a11d69aa9f cmd_test+0x417 (perf)
> builtin-test.c:825
> 55a11d6155f5 run_builtin+0xd4 (perf)
> perf.c:349
> 55a11d61588d handle_internal_command+0xdd (perf)
> perf.c:401
> 55a11d6159e6 run_argv+0x35 (perf)
> perf.c:445
> 55a11d615d2f main+0x2cb (perf)
> perf.c:553
> 7fae3d233ca7 __libc_start_call_main+0x77 (libc.so.6)
> libc_start_call_main.h:58
> 7fae3d233d64 __libc_start_main_impl+0x84
> libc-start.c:360 (inlined)
> 55a11d565f80 _start+0x20 (perf)
> ??:0
> ...
> ```
>
> v3: Make the caller inline file and line number accurate in the libdw
> addr2line, rather than using the function's declared location.
> Fix reference counts in unwind-libdw. Add fixes tag for srcline
> inline printing.
>
> v2: Fix bias issue with libdwfl functions. Use cu_walk_functions_at
> from perf's dwarf-aux to fully walk inline functions. Add testing
> that inlined functions are shown in the perf script srcline
> callchain information. Add configurability as to which addr2line
> style to use.
> https://lore.kernel.org/lkml/20260110082647.1487574-1-irogers@google.com/
>
> v1: https://lore.kernel.org/lkml/20251122093934.94971-1-irogers@google.com/
>
> Ian Rogers (7):
> perf unwind-libdw: Fix invalid reference counts
> perf addr2line: Add a libdw implementation
> perf addr2line.c: Rename a2l_style to cmd_a2l_style
> perf srcline: Add configuration support for the addr2line style
> perf callchain: Fix srcline printing with inlines
> perf test workload: Add inlineloop test workload
> perf test: Test addr2line unwinding works with inline functions
>
> tools/perf/builtin-report.c | 10 ++
> tools/perf/tests/builtin-test.c | 1 +
> tools/perf/tests/shell/addr2line_inlines.sh | 47 ++++++
> tools/perf/tests/tests.h | 1 +
> tools/perf/tests/workloads/Build | 2 +
> tools/perf/tests/workloads/inlineloop.c | 52 +++++++
> tools/perf/util/Build | 1 +
> tools/perf/util/addr2line.c | 20 +--
> tools/perf/util/config.c | 4 +
> tools/perf/util/dso.c | 2 +
> tools/perf/util/dso.h | 11 ++
> tools/perf/util/evsel_fprintf.c | 8 +-
> tools/perf/util/libdw.c | 153 ++++++++++++++++++++
> tools/perf/util/libdw.h | 60 ++++++++
> tools/perf/util/srcline.c | 116 ++++++++++++++-
> tools/perf/util/srcline.h | 3 +
> tools/perf/util/symbol_conf.h | 10 ++
> tools/perf/util/unwind-libdw.c | 7 +-
> 18 files changed, 486 insertions(+), 22 deletions(-)
> create mode 100755 tools/perf/tests/shell/addr2line_inlines.sh
> create mode 100644 tools/perf/tests/workloads/inlineloop.c
> create mode 100644 tools/perf/util/libdw.c
> create mode 100644 tools/perf/util/libdw.h
>
I don't see the differences to the other addr2line implementations
anymore, but only because it falls through to the old ones when libdw
fails now.
For example when building Perf with LLVM it can't get the line in the
inlineloop workload, and there's still a few things in libc and other
system libraries it fails on.
But I think it's fine because it doesn't give the wrong line anymore, it
just falls through to another working addr2line implementation.
Reviewed-by: James Clark <james.clark@linaro.org>
next prev parent reply other threads:[~2026-01-12 11:18 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-11 4:13 [PATCH v3 0/7] perf: Add a libdw addr2line implementation Ian Rogers
2026-01-11 4:13 ` [PATCH v3 1/7] perf unwind-libdw: Fix invalid reference counts Ian Rogers
2026-01-11 4:13 ` [PATCH v3 2/7] perf addr2line: Add a libdw implementation Ian Rogers
2026-01-12 19:52 ` Arnaldo Carvalho de Melo
2026-01-12 21:23 ` Ian Rogers
2026-01-11 4:13 ` [PATCH v3 3/7] perf addr2line.c: Rename a2l_style to cmd_a2l_style Ian Rogers
2026-01-11 4:13 ` [PATCH v3 4/7] perf srcline: Add configuration support for the addr2line style Ian Rogers
2026-01-11 4:13 ` [PATCH v3 5/7] perf callchain: Fix srcline printing with inlines Ian Rogers
2026-01-11 4:13 ` [PATCH v3 6/7] perf test workload: Add inlineloop test workload Ian Rogers
2026-01-11 4:13 ` [PATCH v3 7/7] perf test: Test addr2line unwinding works with inline functions Ian Rogers
2026-01-12 11:18 ` James Clark [this message]
2026-01-12 14:49 ` [PATCH v3 0/7] perf: Add a libdw addr2line implementation Ian Rogers
2026-01-12 18:29 ` Ian Rogers
2026-01-13 12:03 ` James Clark
2026-01-13 23:47 ` Ian Rogers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=dbdd0541-0a67-4d61-9ae2-7820920e8f7a@linaro.org \
--to=james.clark@linaro.org \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=howardchu95@gmail.com \
--cc=irogers@google.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=stephen.s.brennan@oracle.com \
--cc=tonyj@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox