perf callgraphのC++デマングルを有効にするにはどうすればよいですか?注釈モードに入るとシンボルをデマングルしますが、メインのコールグラフには表示されません。 (Google Benchmarkを使用して)perfコールグラフのデマングルを有効にする
サンプルコード:
#include <benchmark/benchmark.h>
#include <vector>
static __attribute__ ((noinline)) int my_really_big_function()
{
for(size_t i = 0; i < 1000; ++i)
{
benchmark::DoNotOptimize(i % 5);
}
return 0;
}
static __attribute__ ((noinline)) void caller1()
{
for(size_t i = 0; i < 1000; ++i)
{
benchmark::DoNotOptimize(my_really_big_function());
benchmark::DoNotOptimize(i % 5);
}
}
static __attribute__ ((noinline)) void myfun(benchmark::State& state)
{
while(state.KeepRunning())
{
caller1();
}
}
BENCHMARK(myfun);
BENCHMARK_MAIN();
ビルドコマンド:
clang++ main.cpp -o main -fno-omit-frame-pointer -O0 -lpthread -lbenchmark
PERFコマンド:
perf record -g ./main
perf report -g 'graph,0.5,caller'
私も--demangleオプションを有効にしようとしました、しかしそれは出力には影響しないようです。デマングルシンボルが欠落し
コールグラフ:
│
│ 0000000000404310 <caller1()>:
│ _ZL7caller1v():
│ push %rbp
│ mov %rsp,%rbp
| $0x30,%rsp
| $0x0,-0x18(%rbp)
│10: cmpq $0x3e8,-0x18(%rbp)
│ ↓ jae 6f
│ → callq my_really_big_function()
│ lea -0x1c(%rbp),%rcx
│ mov %eax,-0x1c(%rbp)
14.29 │ mov %rcx,-0x10(%rbp)
│ mov -0x10(%rbp),%rcx
│ lea -0x28(%rbp),%rcx
│ mov $0x5,%eax
│ mov %eax,%edx
│ mov -0x18(%rbp),%rax
│ xor %esi,%esi
│ mov %rdx,-0x30(%rbp)
│ mov %esi,%edx
│ mov -0x30(%rbp),%rdi
│ div %rdi
85.71 │ mov %rdx,-0x28(%rbp)
│ mov %rcx,-0x8(%rbp)
│ mov -0x8(%rbp),%rcx
│ mov -0x18(%rbp),%rax
│ add $0x1,%rax
│ mov %rax,-0x18(%rbp)
│ ↑ jmpq 10
│6f: add $0x30,%rsp
│ pop %rbp
│ ← retq
システム情報:
- のUbuntu 15.04 64ビット
- インテルi5-6600k
Samples: 3K of event 'cycles', Event count (approx.): 2946754102 Children Self Command Shared Object Symbol + 99.82% 0.00% main main [.] _ZL5myfunRN9benchmark5StateE + 99.82% 0.00% main main [.] _ZN9benchmark12_GLOBAL__N_111RunInThreadEPKNS_8internal9Benchmark8InstanceEmiPNS0_11ThreadStatsE + 99.82% 0.00% main main [.] _ZN9benchmark22RunSpecifiedBenchmarksEPNS_17BenchmarkReporterE + 99.82% 0.00% main main [.] main + 99.82% 0.00% main libc-2.21.so [.] __libc_start_main + 99.82% 0.00% main [unknown] [.] 0x7fbe258d4c544155 + 99.75% 0.30% main main [.] _ZL7caller1v + 99.52% 99.46% main main [.] _ZL22my_really_big_functionv
注釈付き逆アセンブリ上映は、呼び出しを復号化され
- は、3.19.8-ckt6
- 打ち鳴らす3.6.0-2ubuntu1
ストレンジが、それは常に(デマングル名が合わないと痛みが時々ある)私のために、デフォルトでデマングル:今、あなたの新しいものと公式PERFを上書きするために、ちょうどあなたのPATHを設定します。 –