web-dev-qa-db-ja.com

gprofは蓄積された時間を報告しません

OSX10.5.7を実行しているマシンでgprofを使用してC++アプリケーションのプロファイルを作成しようとしています。通常の方法でg ++を使用してコンパイルしますが、-pgフラグを使用してアプリケーションを実行し、gprofを使用してコールグラフを表示してみます。

残念ながら、私のコールグラフには、すべての時間列のすべてのゼロが含まれています。 「呼び出された」列の値は妥当な値であるため、何かがプロファイルされたように見えますが、他のデータが不足していることに不思議に思っています。

私のすべてのソースファイルは同様の方法でコンパイルされます:

g++ -pg -O2 -DNDEBUG -I./ -ansi -c -o  ScenarioLoader.o ScenarioLoader.cpp

次に、「ar」を実行して、すべてのオブジェクトファイルをライブラリにバンドルします。後で、gprofを次のようにリンクして実行します。

g++ -pg -lm  -o vrpalone vrpalone.o ../src/atomicprof.a lastbuild.o
./vrpalone
gprof gmon.out | less

何か案は?

25
Daniel

私は共有するかもしれないと思った これAppleメーリングリストの議論 私は最近出くわした。

ここで説明する動作は、まさに私が経験しているものです。 gprofはOSXでかなり前から壊れているようです。

私はDaveRigbyによって有益に提案されたSharkに頼りました。

ありがとう!

5
Daniel

プログラムがクリーンでない方法で終了した場合、プロファイルデータは正しく書き込まれません-プログラムはどのように終了しますか?

とにかく、gprofの代わりに Shark を使用することを強くお勧めします-非常に使いやすく、gprofよりもほとんどすべての点で優れています-プログラムを再コンパイルする必要はありません。

11
DaveR

おそらくOPの質問とは関係ありませんが、「時間が蓄積されない」という一般的なシナリオがあります。コードがカーネルを呼び出すか、-pgでコンパイルされていないライブラリを呼び出すと、費やされた時間に対して蓄積された時間は表示されません。そこ。

3
Fixee

プログラムはどのくらいの速さで実行されますか?非常に速い場合は、実際にプロファイリングするには速すぎる可能性があります。非常に単純なテキスト処理プログラムでこの問題が発生しました。サブ1kbのテストファイルで実行すると、時間列にすべて0が報告されました。グレートギャツビーの全文を流してこれを解決しました。より大きなデータセットを試すか、メインの計算を数百回ループしてみてください。

2
psanf

ところで、あなたはあなたのコードでfork()をしますか?その場合は、fork()の直後の子プロセスにこれを追加します。

extern void _start (void), etext (void);
monstartup ((u_long) &_start, (u_long) &etext);

それは私にとってトリックでした。

2
Big Papoo

プログラムは複数のスレッドを使用していますか? Linux上のマルチスレッドプログラムでこの問題が発生しましたが、OSXで同じ問題が発生するかどうかはわかりません

これは、私が過去に成功裏に使用したマルチスレッドの問題に対する 解決策 です。

2
bdk

gprofの時間の精度は0.00です。そのため、モジュールの所要時間は短くなる可能性があります(ミリ秒/マイクロ秒)。したがって、0.00が表示され、時間は累積されません。したがって、プログラム全体を1000/1000000 timesについて実行して、数秒になるようにします。最後に、取得した時間をループ係数(1000/1000000)で除算すると、それが処理時間になります。私も同じ問題に直面しました、そしてこれをすることによってそれは解決されます。

0
Tharun Meddi