7

私は困惑している。oprofile がプロファイリング レポートからスタック トレースを提供できるかどうかはわかりません。私は oprofile マニュアルを見直してきましたが、ログに記録できると言ってスタックトレースを参照しているだけですが、その方法の例は示していません。

ここに私の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;                                    
}                                                

コンパイルに使用したコマンドは次のとおりです。

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

そして、これが私の perf.sh スクリプトです (VM の RHEL 6.2 で実行):

#!/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             _IO_file_xsputn@@GLIBC_2.2.5           
  5        15.6250  libc-2.12.so             _IO_file_xsputn@@GLIBC_2.2.5 [self]  
-------------------------------------------------------------------------------   
2         6.2500  libc-2.12.so             __strlen_sse42                         
  2         6.2500  libc-2.12.so             __strlen_sse42 [self]                
-------------------------------------------------------------------------------   

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

4

1 に答える 1

1

(これは少し遅いですが、これは他の誰かを助けるかもしれません)

タイマー モード (一部の CPU ではデフォルトの動作) でプロファイリングしているため、カーネルでバックトレース無効になっている可能性があります (RHEL 6.2 を使用しているため、バージョンは 2.6.32 のようです)。

次のことを試すことができます。

  1. ハードウェア カウンターを使用する
  2. oprofile のカーネル部分の履歴を確認してください。実際にカーネル バージョンに制限がある場合は、修正されている可能性があります。
  3. カーネルを更新する

同じカーネル リリースで同じ問題に直面しましたが、ARM を使用しているため、クイック フィックスは機能しません (この場合に適用するパッチです)。

于 2014-01-15T16:02:44.710 に答える