2015-10-10 12 views
9

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
+0

ストレンジが、それは常に(デマングル名が合わないと痛みが時々ある)私のために、デフォルトでデマングル:今、あなたの新しいものと公式PERFを上書きするために、ちょうどあなたのPATHを設定します。 –

答えて

17

PERF私はUbuntuの15.10で同じ問題を抱えていたし、私はここで解決策を見つけた:ここhttps://bugs.launchpad.net/ubuntu/+source/linux/+bug/1396654

は、手順は次のとおりです。

sudo apt-get install libiberty-dev binutils-dev 
mkdir ~/install 
cd ~/install 
apt-get source linux-tools-`uname -r` 
sudo apt-get build-dep linux-tools-`uname -r` 
cd linux-`uname -r | sed 's/-.*//'`/tools/perf 
make 

# now you should see the new "perf" executable here 
./perf 

新しいlinux-tools-commonパッケージを作成して実際にシステムに組み込むための方法もあるはずです。

export PATH=~/install/linux-`uname -r | sed 's/-.*//'`/tools/perf:$PATH 
+0

私の場合、パッケージが見つからなかったので、apt-get sourceを使ってubuntu Linux Kernelソースをダウンロードできませんでした。代わりに、https://packages.ubuntu.com/からダウンロードしました。次に、ダウンロードしたパッケージのtools/perfディレクトリにあるmakeを直接実行することでビルドすることができました(libiberty-dev binutils-devをアンインストールしたが、apt-get build-depステップなしでインストールした後)。 – aleixrocks

関連する問題