Re: [PATCH 1/1] perf archive: unpack to correct dir given by perf

From: Michael Petlan
Date: Tue Jul 16 2024 - 08:30:18 EST


On Tue, 16 Jul 2024, royenheart wrote:
> On 2024/7/12 12:35, Namhyung Kim wrote:
> > Hello,
> >
> > On Mon, Jul 08, 2024 at 02:04:31AM +0800, Haoze Xie wrote:
> >> In perf-archive.sh, the code segment that defines 'PERF_BUILDID_DIR' is
> >> advanced before 'unpack' operation for subsequent use, followed by a
> >> 'mkdir' operation to ensure that the dir exists. Symbols in 'unpack' will
> >> be extracted to correct dir given by perf.
> >>
> >> When '--unpack' param is appointed, the symbols are extracted to '~/.debug'
> >> folder by default, without using 'PERF_BUILDID_DIR' given by perf. This
> >> will cause perf to be unable to find the correct buildid's path when users
> >> configured buildid.dir in 'perf config' or used '--buildid-dir' cli param,
> >> since perf will read these params and put them in 'PERF_BUILDID_DIR' env.
> >> 'perf script' and 'perf report' will use the env as the basis for buildid
> >> indexing.
> >
> > Can you please add an example command line and the output for the error
> > case? It'd be helpful to understand the problem more intuitively.
> >
> >>

[...]

>
> I have two machines A and B, I use 'perf record' and 'perf archive' to get
> a buildid archive 'perf.data.tar.bz2' on A:
>
> $ perf record -a -g -- sleep 1
> $ perf archive
>
> then I transfer 'perf.data' and its buildid archive to B. On machine B, I
> use 'perf archive' to extract the buildid:
>
> $ perf archive --unpack
> $ Found target file for unpacking: ./perf.data.tar.bz2
> $ .build-id/d1/a727ab038085dbbb50e74c812e5a6e8502e8c7
> $ ...
>
> But when I use 'perf script' to view hotspots, no function names are shown:
>
> $ perf script
> $ No kallsyms or vmlinux with build-id
> $ 251c1248b97a17df394058a189dffe381169ddcd was found
> $ perf 1770 [000] 1022235.467607: 1 cycles:P:
> $ ffffffff8ae9ceb6 [unknown] ([kernel.kallsyms])
> $ ffffffff8ae15af5 [unknown] ([kernel.kallsyms])
> $ ffffffff8ae0f83b [unknown] ([kernel.kallsyms])
> $ ......
>
> The problem is, I used 'perf config' to change buildid search path before:
>
> $ perf config --user buildid.dir=/usr/local/symbols
> $ cat ~/.perfconfig
> $ # this file is auto-generated.
> $ [buildid]
> $ dir = /usr/local/symbols
>

Shouldn't then perf-archive just determine the directory from perf-config
without any additional env var?

> But 'perf archive --unpack' just extract them to '~/.debug', which makes
> perf can't found right path to search for buildid info. If I add
> 'buildid-dir' param to replace buildid path defined in perfconfig, problem
> can be solved temporarily:
>
> $ ./perf --buildid-dir ~/.debug script
> $ perf 1770 [000] 1022235.467607: 1 cycles:P:
> $ ffffffff8ae9ceb6 native_write_msr+0x6 ([kernel.kallsyms])
> $ ffffffff8ae15af5 intel_pmu_enable_all+0x15 ([kernel.kallsyms])
> $ ffffffff8ae0f83b x86_pmu_enable+0x1ab ([kernel.kallsyms])
>
> The code that determines the buildid path is in the
> 'util/config.c:set_buildid_dir' function, which will generate
> 'PERF_BUILDID_DIR' var.

As above, the var seems to be a duplicate to what is already stored in
perf-config...

>
>

Regards,
Michael