Re: [PATCH v5] perf record: collect user registers set jointly with dwarf stacks

From: Arnaldo Carvalho de Melo
Date: Tue Jun 04 2019 - 10:16:20 EST


Em Fri, May 31, 2019 at 09:27:38AM +0300, Alexey Budankov escreveu:
> On 30.05.2019 22:41, Arnaldo Carvalho de Melo wrote:
> > Em Thu, May 30, 2019 at 10:03:36PM +0300, Alexey Budankov escreveu:
> >> When dwarf stacks are collected jointly with user specified register
> >> set using --user-regs option like below the full register context is
> >> captured on a sample:
> >>
> >> $ perf record -g --call-graph dwarf,1024 --user-regs=IP,SP,BP -- stack_test2.g.O3
> >>
> >> 188143843893585 0x6b48 [0x4f8]: PERF_RECORD_SAMPLE(IP, 0x4002): 23828/23828: 0x401236 period: 1363819 addr: 0x7ffedbdd51ac
> >> ... FP chain: nr:0
> >> ... user regs: mask 0xff0fff ABI 64-bit
> >> .... AX 0x53b
> >> .... BX 0x7ffedbdd3cc0
> >> .... CX 0xffffffff
> >> .... DX 0x33d3a
> >> .... SI 0x7f09b74c38d0
> >> .... DI 0x0
> >> .... BP 0x401260
> >> .... SP 0x7ffedbdd3cc0
> >> .... IP 0x401236
> >> .... FLAGS 0x20a
> >> .... CS 0x33
> >> .... SS 0x2b
> >> .... R8 0x7f09b74c3800
> >> .... R9 0x7f09b74c2da0
> >> .... R10 0xfffffffffffff3ce
> >> .... R11 0x246
> >> .... R12 0x401070
> >> .... R13 0x7ffedbdd5db0
> >> .... R14 0x0
> >> .... R15 0x0
> >> ... ustack: size 1024, offset 0xe0
> >> . data_src: 0x5080021
> >> ... thread: stack_test2.g.O:23828
> >> ...... dso: /root/abudanko/stacks/stack_test2.g.O3
> >>
> >> After applying the change suggested in the patch the sample data contain
> >> only user specified register values. IP and SP registers (DWARF_MINIMAL_REGS)
> >> are collected anyways regardless of the --user-regs value provided from
> >> the command line:
> >
> > Applied, changed the subject and description to:
> >
> > perf record: Allow mixing --user-regs with --call-graph=dwarf
> >
> > When DWARF stacks were requested and at the same time that the user
> > specifies a register set using the --user-regs option the full register
> > context was being captured on samples:
> >
> > $ perf record -g --call-graph dwarf,1024 --user-regs=IP,SP,BP -- stack_test2.g.O3
> >
> > 188143843893585 0x6b48 [0x4f8]: PERF_RECORD_SAMPLE(IP, 0x4002): 23828/23828: 0x401236 period: 1363819 addr: 0x7ffedbdd51ac
> > ... FP chain: nr:0
> > ... user regs: mask 0xff0fff ABI 64-bit
> > .... AX 0x53b
> > .... BX 0x7ffedbdd3cc0
> > .... CX 0xffffffff
> > .... DX 0x33d3a
> > .... SI 0x7f09b74c38d0
> > .... DI 0x0
> > .... BP 0x401260
> > .... SP 0x7ffedbdd3cc0
> > .... IP 0x401236
> > .... FLAGS 0x20a
> > .... CS 0x33
> > .... SS 0x2b
> > .... R8 0x7f09b74c3800
> > .... R9 0x7f09b74c2da0
> > .... R10 0xfffffffffffff3ce
> > .... R11 0x246
> > .... R12 0x401070
> > .... R13 0x7ffedbdd5db0
> > .... R14 0x0
> > .... R15 0x0
> > ... ustack: size 1024, offset 0xe0
> > . data_src: 0x5080021
> > ... thread: stack_test2.g.O:23828
> > ...... dso: /root/abudanko/stacks/stack_test2.g.O3
> >
> > I.e. the --user-regs=IP,SP,BP was being ignored, being overridden by the
> > needs of --call-graph=dwarf.
> >
> > After applying the change in this patch the sample data contains the
> > user specified register, but making sure that at least the minimal set
> > of register needed for DWARF unwinding (DWARF_MINIMAL_REGS) is
> > requested.
> >
> > The user is warned that DWARF unwinding may not work if extra registers
> > end up being needed.
> >
> > -g call-graph dwarf,K full_regs
> > --user-regs=user_regs user_regs
> > -g call-graph dwarf,K --user-regs=user_regs user_regs + DWARF_MINIMAL_REGS
> > <REST remains the same>
> >
>
> Sounds better. Thanks!
>
> ~Alexey

Now cross building to a few arches is failing, so far:

[perfbuilder@quaco ~]$ cat /tmp/dm.log/summary
alpine:3.4: Ok
alpine:3.5: Ok
alpine:3.6: Ok
alpine:3.7: Ok
alpine:3.8: Ok
alpine:3.9: Ok
alpine:edge: Ok
amazonlinux:1: Ok
amazonlinux:2: Ok
android-ndk:r12b-arm: Ok
android-ndk:r15c-arm: Ok
centos:5: Ok
centos:6: Ok
centos:7: Ok
clearlinux:latest: Ok
debian:8: Ok
debian:9: Ok
debian:experimental: Ok
debian:experimental-x-arm64: Ok
debian:experimental-x-mips: FAIL
debian:experimental-x-mips64: FAIL
debian:experimental-x-mipsel: FAIL
fedora:20: Ok
fedora:22: Ok
fedora:23: Ok
fedora:24: Ok
fedora:24-x-ARC-uClibc: FAIL
fedora:25: Ok
fedora:26: Ok
fedora:27: Ok
[perfbuilder@quaco ~]$

For instance:

[perfbuilder@quaco ~]$ cat /tmp/dm.log/debian\:experimental-x-mips64
<SNIP>
CC /tmp/build/perf/tests/pmu.o
util/evsel.c: In function '__perf_evsel__config_callchain':
util/evsel.c:672:38: error: 'PERF_REG_IP' undeclared (first use in this function); did you mean 'PERF_REGS_MAX'?
#define DWARF_MINIMAL_REGS ((1ULL << PERF_REG_IP) | (1ULL << PERF_REG_SP))
^~~~~~~~~~~
util/evsel.c:708:31: note: in expansion of macro 'DWARF_MINIMAL_REGS'
attr->sample_regs_user |= DWARF_MINIMAL_REGS;
^~~~~~~~~~~~~~~~~~
util/evsel.c:672:38: note: each undeclared identifier is reported only once for each function it appears in
#define DWARF_MINIMAL_REGS ((1ULL << PERF_REG_IP) | (1ULL << PERF_REG_SP))
^~~~~~~~~~~
util/evsel.c:708:31: note: in expansion of macro 'DWARF_MINIMAL_REGS'
attr->sample_regs_user |= DWARF_MINIMAL_REGS;
^~~~~~~~~~~~~~~~~~
util/evsel.c:672:62: error: 'PERF_REG_SP' undeclared (first use in this function); did you mean 'PERF_MEM_S'?
#define DWARF_MINIMAL_REGS ((1ULL << PERF_REG_IP) | (1ULL << PERF_REG_SP))
^~~~~~~~~~~
util/evsel.c:708:31: note: in expansion of macro 'DWARF_MINIMAL_REGS'
attr->sample_regs_user |= DWARF_MINIMAL_REGS;
^~~~~~~~~~~~~~~~~~
LD /tmp/build/perf/bench/perf-in.o
CC /tmp/build/perf/tests/hists_common.o
mv: cannot stat '/tmp/build/perf/util/.evsel.o.tmp': No such file or directory
make[4]: *** [/git/linux/tools/build/Makefile.build:97: /tmp/build/perf/util/evsel.o] Error 1
make[4]: *** Waiting for unfinished jobs....
<SNIP>



[perfbuilder@quaco ~]$ cat /tmp/dm.log/fedora\:24-x-ARC-uClibc

<SNIP>
CC /tmp/build/perf/tests/mmap-basic.o
CC /tmp/build/perf/ui/hist.o
util/evsel.c: In function '__perf_evsel__config_callchain':
util/evsel.c:672:38: error: 'PERF_REG_IP' undeclared (first use in this function); did you mean 'PERF_MEM_S'?
#define DWARF_MINIMAL_REGS ((1ULL << PERF_REG_IP) | (1ULL << PERF_REG_SP))
^
util/evsel.c:708:31: note: in expansion of macro 'DWARF_MINIMAL_REGS'
attr->sample_regs_user |= DWARF_MINIMAL_REGS;
^~~~~~~~~~~~~~~~~~
util/evsel.c:672:38: note: each undeclared identifier is reported only once for each function it appears in
#define DWARF_MINIMAL_REGS ((1ULL << PERF_REG_IP) | (1ULL << PERF_REG_SP))
^
util/evsel.c:708:31: note: in expansion of macro 'DWARF_MINIMAL_REGS'
attr->sample_regs_user |= DWARF_MINIMAL_REGS;
^~~~~~~~~~~~~~~~~~
util/evsel.c:672:62: error: 'PERF_REG_SP' undeclared (first use in this function); did you mean 'PERF_REG_IP'?
#define DWARF_MINIMAL_REGS ((1ULL << PERF_REG_IP) | (1ULL << PERF_REG_SP))
^
util/evsel.c:708:31: note: in expansion of macro 'DWARF_MINIMAL_REGS'
attr->sample_regs_user |= DWARF_MINIMAL_REGS;
^~~~~~~~~~~~~~~~~~
MKDIR /tmp/build/perf/ui/stdio/
mv: cannot stat '/tmp/build/perf/util/.evsel.o.tmp': No such file or directory
/git/linux/tools/build/Makefile.build:96: recipe for target '/tmp/build/perf/util/evsel.o' failed
make[4]: *** [/tmp/build/perf/util/evsel.o] Error 1