2013-06-21 8 views
5

私はとても混乱しています。 oprofileがプロファイリングレポートからスタックトレースを提供できるかどうかはわかりません。私はoprofileのマニュアルを見直しており、スタックトレースはthey can be loggedと言っていますが、その方法の例は示されていません。oprofile出力からコールスタックを取得する方法は?

g++ -g -Wall test.cpp -o test 

そして、ここに私のperf.shスクリプトが(VMでRHEL 6.2上で実行されている)です。ここで

は私のTEST.CPP

#include <iostream>        
#include <unistd.h>        
using namespace std;        

void test(){          
    for (int x = 0; x < 100000; x++) cout << "."; 
    sleep(1);          
    cout << endl;         
};            

int main(int argv, char** argc){     
    for (int x = 0; x < 120; x++) test();   
    return 0;          
}             

は、ここで私はそれをコンパイルするために使用するコマンドですです。

#!/bin/bash -x 
sudo opcontrol --no-vmlinux             
sudo opcontrol --reset              
sudo opcontrol --start --separate=library,thread --image=$HOME/test 
sudo opcontrol --callgraph=10            
sudo opcontrol --status              
read -p "Press [Enter] key to stop profiling"                  
sudo opcontrol --dump || exit 1            
sudo opreport --demangle=smart \            
       --merge=all \             
       --symbols \             
       --callgraph \             
       --global-percent \            
       --output-file=perf.out           
sudo opcontrol --shutdown             
sudo opcontrol --reset              

ここで私はこの時点では、取得していたレポートです:

CPU: CPU with timer interrupt, speed 0 MHz (estimated)        
Profiling through timer interrupt             
samples %  app name     symbol name        
------------------------------------------------------------------------------- 
14  43.7500 libstdc++.so.6.0.13  /usr/lib64/libstdc++.so.6.0.13   
    14  43.7500 libstdc++.so.6.0.13  /usr/lib64/libstdc++.so.6.0.13 [self] 
------------------------------------------------------------------------------- 
11  34.3750 libc-2.12.so    fwrite         
    11  34.3750 libc-2.12.so    fwrite [self]       
------------------------------------------------------------------------------- 
5  15.6250 libc-2.12.so    [email protected]@GLIBC_2.2.5   
    5  15.6250 libc-2.12.so    [email protected]@GLIBC_2.2.5 [self] 
------------------------------------------------------------------------------- 
2   6.2500 libc-2.12.so    __strlen_sse42       
    2   6.2500 libc-2.12.so    __strlen_sse42 [self]     
------------------------------------------------------------------------------- 

私の質問:プロファイリングレポートにスタックトレースが表示されるようにするにはどうすればよいですか?

+1

良い質問です。 docのそのビットはあまり明確ではありません。それはサンプリングの下で​​無関係なコールカウントを表示しないことをお詫びします。 100%は基本的に2つの部分に分かれているはずです。 'main:12 - > test:8 - > cout :: endl - >' 'main:12 - > test:7 - > sleep - ><システムルーチン> 。私はそれのほとんどが眠っていると思う。私は、あなたが 'stderr'に出力していない限り、' cout << "にはほとんどないだろうと思っています。とにかく、それはGDBのいくつかのスタックショットがあなたに示すものです。 –

+0

うん。 GDBはoprofileよりももう少し役に立ちましたが、私が上で書いたテストスクリプトよりもはるかに大きいマルチスレッドアプリケーションでoprofileを使う必要があることを除けば、だから、GDBを使うことは本当に私のために働くつもりはありません。他の人と話した後、私はロギング+タイマーを使った計器が意味をなさないかもしれないと感じます。 – bitcycle

+0

さて、私がやることは次のとおりです。多くのスレッドのケースでは、中断するとすべてのスレッドが停止しているので、各スレッドに 'bt'を取得します。入力を待つような何もしていないものは無視します。他のものは貴重です。ちょうど測定をするのではなく、コードを高速化する方法を見つけることが目的だと仮定しています。たぶんそれはあなたの目標ではないでしょう。あなたは他の人と話すことができますが、テクニックはそれほどよく知られているわけではないので、あなたが聞くことが期待できるものを知っています。 –

答えて

1

(これは少し遅れているが、これは他の誰かを助けるかもしれない)

あなたは(いくつかのCPU上のデフォルトの動作です)タイマモードでプロファイリングしているので、バックトレース無効にすることがありますあなたのカーネルでは(あなたがRHEL 6.2上にいるので、どのバージョンが2.6.32と思われますか)。

あなたはに試すことができます:確かに、あなたのカーネルバージョンでの制限は、これがあったかもしれないがあれば、のOProfileのカーネル部分のthe historyで見て

  1. 使用のハードウェアカウンタ
  2. 固定
  3. カーネル

を更新し、私は同じカーネルのリリースと同じ問題に直面していましたが、私はARMによ以来、私のQUI ck-fixは動作しません (thisはこの場合に適用するパッチです)。

関連する問題