perf unwind: Odd message about x86 unwind
Arnaldo Carvalho de Melo
Acked-by Jiri OlsaHi He,
While testing a patch by Peter Zijlstra to the --stdio
annotation code I came accross these messages:
[acme@jouet linux]$ perf annotate __vdso_gettimeofday 2>&1 | head -20
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
Percent | Source code & Disassembly of perf-vdso.so-E5tFUx for cycles:u
-----------------------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 0000000000000cd0 <__vdso_gettimeofday@@LINUX_2.6>:
0.00 : cd0: push %rbp
0.00 : cd1: mov %rsp,%rbp
0.00 : cd4: push %r15
0.00 : cd6: push %r14
0.00 : cd8: push %r13
0.00 : cda: push %r12
0.00 : cdc: push %rbx
0.00 : cdd: sub $0x10,%rsp[acme@jouet linux]$
And bisected it down to:
commit 52ffe0ff02fc053a025c381d5808e9ecd3206dfe
Author: He Kuang <[email protected]> Date: Fri Jun 3 03:33:22 2016 +0000
perf callchain: Support x86 target platform
Support x86(32-bit) cross platform callchain unwind.
--------------------------------------------------
The source code where this message is emitted is:
struct unwind_libunwind_ops __weak *local_unwind_libunwind_ops; <SNIP>unwind__prepare_access()
{
struct unwind_libunwind_ops *ops = local_unwind_libunwind_ops;
<SNIP>
if (!strcmp(arch, "x86")) {
if (dso_type != DSO__TYPE_64BIT)
ops = x86_32_unwind_libunwind_ops;
}
<SNIP>
if (!ops) {
pr_err("unwind: target platform=%s is not supported\n", arch);
return -1;
}So, this should fallback to local_unwind_libunwind_ops, why is this not being set properly?
Feature detection says:
... libunwind: [ on ]
... libdw-dwarf-unwind: [ on ]
This is:
[acme@jouet linux]$ uname -a
Linux jouet 4.5.7-300.fc24.x86_64 #1 SMP Wed Jun 8 18:12:45 UTC 2016 x86_64 x86_64 x86_64 GNU/Linuxo
Can you please check this?
- Arnaldo
hi
Quoted 69 lines · Arnaldo Carvalho de Melo
Hi He,
While testing a patch by Peter Zijlstra to the --stdio
annotation code I came accross these messages:[acme@jouet linux]$ perf annotate
__vdso_gettimeofday2>&1 | head -20
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
Percent | Source code & Disassembly of perf-vdso.so-E5tFUx for cycles:u
-----------------------------------------------------------------------------: : : : Disassembly of section .text: : : 0000000000000cd0 <__vdso_gettimeofday@@LINUX_2.6>: 0.00 : cd0: push %rbp 0.00 : cd1: mov %rsp,%rbp 0.00 : cd4: push %r15 0.00 : cd6: push %r14 0.00 : cd8: push %r13 0.00 : cda: push %r12 0.00 : cdc: push %rbx 0.00 : cdd: sub $0x10,%rsp[acme@jouet linux]$
And bisected it down to:
commit
52ffe0ff02fc053a025c381d5808e9ecd3206dfeAuthor: He Kuang <[email protected]> Date: Fri Jun 3 03:33:22 2016 +0000perf callchain: Support x86 target platform
Support x86(32-bit) cross platform callchain unwind.
Signed-off-by He Kuang <[email protected]>Acked-by Jiri Olsa <[email protected]>--------------------------------------------------
The source code where this message is emitted is:
struct
unwind_libunwind_ops__weak*local_unwind_libunwind_ops; <SNIP>unwind__prepare_access(){ struct unwind_libunwind_ops *ops = local_unwind_libunwind_ops; <SNIP> if (!strcmp(arch, "x86")) { if (dso_type != DSO__TYPE_64BIT) ops = x86_32_unwind_libunwind_ops; } <SNIP> if (!ops) { pr_err("unwind: target platform=%s is not supported\n", arch); return -1; }So, this should fallback to
local_unwind_libunwind_ops, why is this not being set properly?Feature detection says:
... libunwind: [ on ]
... libdw-dwarf-unwind: [ on ]
Quoted 6 lines
This is:
[acme@jouet linux]$ uname -a
Linux jouet 4.5.7-300.fc24.x86_64 #1 SMP Wed Jun 8 18:12:45 UTC 2016x86_64x86_64x86_64GNU/LinuxoCan you please check this?
I think it's because of the perf.data contains both 32bit/64bit threads while perf is only build with local unwind(unwind for x86_64).
Then I have a simple test for this:
$ file hello_x86_64 hello_x86_64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.0.0, BuildID[sha1]=adc94932cbcb2be80f3b62df530b8c109f40478a, not strippe
$ file hello_i686 hello_i686: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 4.5.0, not stripped
$ perf record -o perf.data.x86_64_singlethread hello_x86_64 $ perf record -o perf.data.x86_64_allcpu -a hello_x86_64 $ perf record -o perf.data.i686_singlethread hello_i686 $ perf record -o perf.data.i686_allcpu -a hello_i686
Now I get 4 perf.data files:
ID name 32bit 64bit
1 perf.data.x86_64_singlethread N Y 2 perf.data.x86_64_allcpu N Y 3 perf.data.i686_singlethread Y N 4 perf.data.i686_allcpu Y Y
Because perf only supports local unwind(for x86_64), cases contain 32bit thread should show the warnings, i.e. case3 and case4. And perf.data contains only 32bit threads will show nothing except the warnings while the one contains both 32bit/64bit will show warnings for 32bit thread and annoate the 64bit thread.
Then check:
$ perf annotate -i perf.data.x86_64_singlethread
Percent | Source code & Disassembly of hello for cycles:pp
----------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 00000000004005c0 <fib>:
: fib():
: #endif$ perf annotate -i perf.data.x86_64_allcpu
Percent | Source code & Disassembly of hello for cycles:pp
----------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 00000000004005c0 <fib>:
: fib():
: #endif
:
: volatile int z = 0;
:
: int fib(int x)$ perf annotate -i perf.data.i686_singlethread
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
$ perf annotate -i perf.data.i686_allcpu
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
unwind: target platform=x86 is not supported
Percent | Source code & Disassembly of perf for cycles:pp
---------------------------------------------------------------
:
:
:
: Disassembly of section .text:
:
: 0000000000442a8f <record__mmap_read>:
: record__mmap_read():
:
: return backward_rb_find_range(data, mask, head, start,
end);
: }
The result is the same as we expected, so if your case matches the case4, the result is right. But I think we can improve the warning message for not confusing the users.
Thank you.
Quoted 2 lines
- Arnaldo