2009-05-08 9 views
2

GNU gprof 2.15.94.0.2.2を使用して、呼び出しサイクルの大きなC++プログラムのプロファイリングを行います。私はgprof's documentation indicatesとしてコールグラフの出力に以下のようなものを見ることが予想さ:gprofのコールグラフ出力に循環要約に呼び出し元がないのはなぜですか?

index % time self children called  name 
---------------------------------------- 
       1.77  0 1/1  main [2] 
[3]  91.71 1.77  0 1+5 <cycle 1 as a whole> [3] 
       1.02  0 3   b <cycle 1> [4] 
       0.75  0 2   a <cycle 1> [5] 
        0  0 6/6  c [6] 
---------------------------------------- 

しかし、私の<cycle as a whole>エントリのどれもが記載されている任意の発信者を持っていません。これらはすべて次のようなものです:

index % time self children called    name 
---------------------------------------------- 
[8]  65.6 259.55 5342.63 9334767+60122608 <cycle 2 as a whole> [8] 
       133.28 2051.45 12043564+74015448 foo <cycle 2> [14] 
       18.90 976.38 2379645    bar <cycle 2> [21] 
...                  
----------------------------------------------- 

私のサイクルはかなり大きいので、サイクル内の個々の機能を介して発信者をトレースすることは非常に困難です。

サイクル発信者が出力に表示されない理由とその表示方法を教えてください。

答えて

0

これまでgprofでこれをバグと呼んでいます。私は、相互に再帰的な関数の簡単な例を設定し、まったく同じ振る舞いをしました。私は機能を持っていた:

int a(int n){return b(n);} 
int b(int n){return c(n);} 
int c(int n){return (n==0)?n:a(n-1);} 

と(メイン):

for(int j=0; j <1000; ++j) 
    for(int i=0; i < 10; ++i) 
    cout << a(i); 

私は()の呼び出しを交換しようとした:gprofのは、登録します期待して

int d(int n){return a(n);} 

main()からの呼び出しよりもd()からサイクルへの呼び出しが良いですが、同じ結果が得られました。

また、coutをprintf()に置き換えて、Cプログラムを作成しました。サイクルの呼び出し元がないという同じ結果が得られました。

+0

[元のgprof論文](http://docs.freebsd.org/44doc/psd/18.gprof/paper.pdf)の8ページの下部を読むと、著者はその再帰処理のために多くの有用性を主張する。 –

0

これはあなたの主な関心事ですか、あるいは最適化できるものを見つけるなどの大きな目標がありますか?通常、それが人々がgprofを使用する理由です。

gprof is what it is, but you can do better.

1

アプリケーションの使用マルチスレッドをしていますか? gprofはスレッドではまったく動作しません。それ以外の場合は、gprofのバグに遭遇している可能性があります。それはバグがあり、時代遅れです。 oprofileやvalgrindのようなものを使うのが良い。

関連する問題