From: Milian Wolff <mail@milianw.de>
To: Namhyung Kim <namhyung@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>,
linux-perf-users <linux-perf-users@vger.kernel.org>,
Arnaldo Carvalho de Melo <acme@kenel.org>
Subject: Re: missing mmap events in perf profiles without dwarf callgraph
Date: Tue, 19 Jan 2021 09:09:19 +0100 [thread overview]
Message-ID: <7161646.QLfhZlOSzD@milian-workstation> (raw)
In-Reply-To: <CAM9d7cjvzO3D-vbf+-kFH1MbsiLhVxm4qAA=ySxe8FmiLKfMKQ@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 8764 bytes --]
On Donnerstag, 14. Januar 2021 09:56:36 CET Namhyung Kim wrote:
> Hi,
>
> On Thu, Jan 14, 2021 at 4:24 AM Milian Wolff <mail@milianw.de> wrote:
> > On Mittwoch, 13. Januar 2021 19:45:54 CET Jiri Olsa wrote:
> > > On Wed, Jan 13, 2021 at 06:47:22PM +0100, Milian Wolff wrote:
> > > > On Mittwoch, 13. Januar 2021 11:30:31 CET Jiri Olsa wrote:
> > > > > On Mon, Jan 11, 2021 at 05:56:52PM +0100, Milian Wolff wrote:
> > > > > > Hey there,
> > > > > >
> > > > > > in hotspot I noticed a symbolization bug for perf.data files that
> > > > > > are
> > > > > > recorded without `--call-graph dwarf`, i.e. something like this:
> > > > > >
> > > > > > ```
> > > > > > $ cat test.c
> > > > > > int main()
> > > > > > {
> > > > > >
> > > > > > int sum = 0;
> > > > > > for (int i = 0; i < 100000; ++i) sum += i;
> > > > > > return sum > 0;
> > > > > >
> > > > > > }
> > > > > > $ gcc -O0 -g test.c
> > > > > > $ perf record ./a.out
> > > > > > $ perf script --show-mmap-events | grep /a.out
> > > > > >
> > > > > > a.out 149719 18106.394277: PERF_RECORD_MMAP2
149719/149719:
> > > > > > [0x55e0b3b5e000(0x1000) @ 0 00:31 22086 3699042272]: r-xp
> > > > > > /tmp/a.out
> > > > > >
> > > > > > a.out 149719 18106.394748: 275254 cycles:u:
> > > > > > 55e0b3b5e72e
> > > > > >
> > > > > > main+0x25 (/tmp/a.out)
> > > > > >
> > > > > > a.out 149719 18106.395011: 486078 cycles:u:
> > > > > > 55e0b3b5e72e
> > > > > >
> > > > > > main+0x25 (/tmp/a.out)
> > > > > > ```
> > > > >
> > > > > for some reason I can't reproduce this and also I'm not getting
> > > > > randomized VA for your example, while I see it in other processes,
> > > > > which is strange.. I'll check on it deeper
> > > >
> > > > Out of interest: what exactly are you not reproducing? And what do you
> > > > mean by "randomized VA"?
> > >
> > > that address 55e0b3b5e72e is randomized by kernel,
> > > but I had to compile your example with -pie to get it,
> > > otherwise I was seeing the standard 0x0400000 something
> > >
> > > I'm now seeing:
> > > ex 1381597 1084961.360877: PERF_RECORD_MMAP2
1381597/1381597:
> > > [0x558f08599000(0x1000) @ 0x1000 fd:03 155428 2806170740]: r-xp
> > > /home/jolsa/trash/ex ex 1381597 1084961.360889: PERF_RECORD_MMAP2
> > > 1381597/1381597: [0x7f283cc80000(0x21000) @ 0x2000 fd:01 274841
> > > 3265102552]: r-xp /usr/lib64/ld-2.31.so ex 1381597 1084961.360898:
> > > PERF_RECORD_MMAP2 1381597/1381597: [0x7ffc2cd9c000(0x2000) @ 0 00:00 0
> > > 0]:
> > > r-xp [vdso] ex 1381597 1084961.360917: 1 cycles:u:
> > > ffffffffabc01007 [unknown] ([unknown]) ex 1381597 1084961.360920:
> > > 1 cycles:u: ffffffffabc01007 [unknown] ([unknown]) ex 1381597
> > > 1084961.360922: 9 cycles:u: ffffffffabc01007 [unknown]
> > > ([unknown]) ex 1381597 1084961.360924: 180 cycles:u:
> > > ffffffffabc01007 [unknown] ([unknown]) ex 1381597 1084961.360929:
> > > 3839 cycles:u: ffffffffabc01007 [unknown] ([unknown]) ex 1381597
> > > 1084961.361010: PERF_RECORD_MMAP2 1381597/1381597:
> > > [0x7f283caa4000(0x150000) @ 0x25000 fd:01 313184 1927740165]: r-xp
> > >
> > > /usr/lib64/libc-2.31.so ex 1381597 1084961.361695: 22432 cycles:u:
> > > 558f08599140 main+0x17 (/home/jolsa/trash/ex) ex 1381597
1084961.361702:
> > > 20545 cycles:u: 558f08599140 main+0x17 (/home/jolsa/trash/ex) ex
> > >
> > > 1381597 1084961.361709: 99474 cycles:u: 558f08599140 main+0x17
> > > (/home/jolsa/trash/ex)
> > >
> > > and it seems to work because there's 0x1000 pgoffset (number behind @)
> > > which for your test seems to be 0
> >
> > Yes, that seems to be the issue here... Can anyone explain why that is the
> > case for me? When I let my little test app print /proc/self/maps (strace
> > and perf trace don't see mmap syscalls for these events btw -
> > interesting), then I see this:
> >
> > ```
> > 55ac3bae5000-55ac3bae6000 r--p 00000000 00:31 11568
> > /tmp/ a.out
> > 55ac3bae6000-55ac3bae7000 r-xp 00000000 00:31 11568
> > /tmp/ a.out
> > 55ac3bae7000-55ac3bae9000 r--p 00000000 00:31 11568
> > /tmp/ a.out
> > 55ac3bae9000-55ac3baea000 rw-p 00001000 00:31 11568
> > /tmp/ a.out
> > ```
> >
> > That matches what I'm getting from the perf events, i.e. pgoff = 0 for the
> > second (executable) mapping... Here's the output of `readelf -l a.out` -
> > can anyone explain what I'm seeing based on that maybe? My personal
> > knowlege in that area is not sufficient.
> >
> > ```
> > $ readelf -l a.out
> > Elf file type is DYN (Shared object file)
> > Entry point 0x1b10
> > There are 11 program headers, starting at offset 64
> >
> > Program Headers:
> > Type Offset VirtAddr PhysAddr
> >
> > FileSiz MemSiz Flags Align
> >
> > PHDR 0x0000000000000040 0x0000000000000040 0x0000000000000040
> >
> > 0x0000000000000268 0x0000000000000268 R 0x8
> >
> > INTERP 0x00000000000002a8 0x00000000000002a8 0x00000000000002a8
> >
> > 0x000000000000001c 0x000000000000001c R 0x1
> >
> > [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
> >
> > LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
> >
> > 0x0000000000000b0c 0x0000000000000b0c R 0x1000
> >
> > LOAD 0x0000000000000b10 0x0000000000001b10 0x0000000000001b10
> >
> > 0x0000000000000370 0x0000000000000370 R E 0x1000
> >
> > LOAD 0x0000000000000e80 0x0000000000002e80 0x0000000000002e80
> >
> > 0x0000000000000218 0x0000000000000218 RW 0x1000
> >
> > LOAD 0x0000000000001098 0x0000000000004098 0x0000000000004098
> >
> > 0x0000000000000070 0x00000000000001f8 RW 0x1000
> >
> > DYNAMIC 0x0000000000000e98 0x0000000000002e98 0x0000000000002e98
> >
> > 0x00000000000001d0 0x00000000000001d0 RW 0x8
> >
> > GNU_RELRO 0x0000000000000e80 0x0000000000002e80 0x0000000000002e80
> >
> > 0x0000000000000218 0x0000000000001180 R 0x1
> >
> > GNU_EH_FRAME 0x0000000000000988 0x0000000000000988 0x0000000000000988
> >
> > 0x0000000000000044 0x0000000000000044 R 0x4
> >
> > GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
> >
> > 0x0000000000000000 0x0000000000000000 RW 0x0
> >
> > NOTE 0x00000000000002c4 0x00000000000002c4 0x00000000000002c4
> >
> > 0x0000000000000038 0x0000000000000038 R 0x4
> >
> > Section to Segment mapping:
> > Segment Sections...
> >
> > 00
> > 01 .interp
> > 02 .interp .note.ABI-tag .note.gnu.build-id .dynsym .gnu.version
> >
> > .gnu.version_r .gnu.hash .dynstr .rela.dyn .rela.plt .rodata
> > .gcc_except_table .eh_frame_hdr .eh_frame
> >
> > 03 .text .init .fini .plt
> > 04 .fini_array .init_array .dynamic .got
> > 05 .data .tm_clone_table .got.plt .bss
> > 06 .dynamic
> > 07 .fini_array .init_array .dynamic .got
> > 08 .eh_frame_hdr
> > 09
> > 10 .note.ABI-tag .note.gnu.build-id
> >
> > ```
> >
> > I note that the following seems to correspond to my mapping event:
> >
> > ```
> >
> > LOAD 0x0000000000000b10 0x0000000000001b10 0x0000000000001b10
> >
> > 0x0000000000000370 0x0000000000000370 R E 0x1000
> >
> > ```
> >
> > This is interesting - note how there's a difference of 0x100 between the
> > offset 0xb10 and the virt/phys addr at 0x1b10...
> >
> > So to me it looks like it's correct that pgoff is 0, as the file offset is
> > 0xb10. But it's not enough to just look at the mapping information to
> > deduce the offset <-> virt/phys addr discrepancy.
> >
> > Which makes it just the more surprising to me that perf script/report
> > seemingly copes with this situation despite these problems...
>
> What I noticed is ss->adjust_symbols which is set for user DSOs. It does
>
> sym.st_value -= shdr.sh_addr - shdr.sh_offset
>
> Maybe your program's section header has different values?
Hey Namhyung,
how would I figure that one out? Isn't that data shown in the readelf output
above? Put differently: Could someone else maybe show his readelf output so we
can compare?
@ jirka: did you have a chance to figure out why/how perf stat/report is
figuring out the right mapping address from the singular mapping event?
Thanks
--
Milian Wolff
mail@milianw.de
http://milianw.de
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2021-01-19 8:13 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-11 16:56 missing mmap events in perf profiles without dwarf callgraph Milian Wolff
2021-01-13 10:30 ` Jiri Olsa
2021-01-13 17:47 ` Milian Wolff
2021-01-13 18:45 ` Jiri Olsa
2021-01-13 19:18 ` Milian Wolff
2021-01-14 8:56 ` Namhyung Kim
2021-01-19 8:09 ` Milian Wolff [this message]
2021-01-19 9:36 ` Namhyung Kim
2021-01-19 11:33 ` Milian Wolff
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=7161646.QLfhZlOSzD@milian-workstation \
--to=mail@milianw.de \
--cc=acme@kenel.org \
--cc=jolsa@redhat.com \
--cc=linux-perf-users@vger.kernel.org \
--cc=namhyung@gmail.com \
/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;
as well as URLs for NNTP newsgroup(s).