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
何か案は?
私は共有するかもしれないと思った これAppleメーリングリストの議論 私は最近出くわした。
ここで説明する動作は、まさに私が経験しているものです。 gprofはOSXでかなり前から壊れているようです。
私はDaveRigbyによって有益に提案されたSharkに頼りました。
ありがとう!
プログラムがクリーンでない方法で終了した場合、プロファイルデータは正しく書き込まれません-プログラムはどのように終了しますか?
とにかく、gprofの代わりに Shark を使用することを強くお勧めします-非常に使いやすく、gprofよりもほとんどすべての点で優れています-プログラムを再コンパイルする必要はありません。
おそらくOPの質問とは関係ありませんが、「時間が蓄積されない」という一般的なシナリオがあります。コードがカーネルを呼び出すか、-pg
でコンパイルされていないライブラリを呼び出すと、費やされた時間に対して蓄積された時間は表示されません。そこ。
プログラムはどのくらいの速さで実行されますか?非常に速い場合は、実際にプロファイリングするには速すぎる可能性があります。非常に単純なテキスト処理プログラムでこの問題が発生しました。サブ1kbのテストファイルで実行すると、時間列にすべて0が報告されました。グレートギャツビーの全文を流してこれを解決しました。より大きなデータセットを試すか、メインの計算を数百回ループしてみてください。
ところで、あなたはあなたのコードでfork()をしますか?その場合は、fork()の直後の子プロセスにこれを追加します。
extern void _start (void), etext (void);
monstartup ((u_long) &_start, (u_long) &etext);
それは私にとってトリックでした。
プログラムは複数のスレッドを使用していますか? Linux上のマルチスレッドプログラムでこの問題が発生しましたが、OSXで同じ問題が発生するかどうかはわかりません
これは、私が過去に成功裏に使用したマルチスレッドの問題に対する 解決策 です。
gprofの時間の精度は0.00
です。そのため、モジュールの所要時間は短くなる可能性があります(ミリ秒/マイクロ秒)。したがって、0.00
が表示され、時間は累積されません。したがって、プログラム全体を1000/1000000 times
について実行して、数秒になるようにします。最後に、取得した時間をループ係数(1000/1000000)
で除算すると、それが処理時間になります。私も同じ問題に直面しました、そしてこれをすることによってそれは解決されます。