32

私はLinux環境に取り組んでいます。2つの「C」ソースパッケージtrainとtest_trainがあります。

  1. コンパイル時にtrainパッケージはlibtrain.soを生成します
  2. test_trainはlibtrain.soにリンクし、実行可能なtrain-testを生成します

ここで、gprofを使用してコールグラフを生成します。これは、メインプログラムとlibtrain.so内の関数の呼び出しシーケンスを示しています。

両方のパッケージを-pgオプションでコンパイルおよびリンクしており、デバッグレベルはo0です。./train-testを実行すると、gmon.outが生成されます。それから私はします:

$ gprof -q ./train-test gmon.out

ここで、出力は、train-testの関数のコールグラフを示していますが、libtrain.soにはありません。

何が問題なのか?

4

3 に答える 3

26

gprof動作しませんsprof。代わりに使用する必要があります。私はこれらのリンクが役に立ちました:

2番目のリンクからの要約:

  1. 共有ライブラリ(libmylib.so)をデバッグ(-g)モードでコンパイルします。いいえ-pg。
  2. LD_PROFILE_OUTPUT=`pwd`をエクスポートします
  3. LD_PROFILE=libmylib.soをエクスポートします
  4. rm -f $ LD_PROFILE.profile
  5. libmylib.soをロードするプログラムを実行します
  6. sprof PATH-TO-LIB / $ LD_PROFILE $ LD_PROFILE.profile -p> log
  7. ログを参照してください。

手順2で、既存のディレクトリである必要があることがわかりました。そうでない場合は、役立つ警告が表示されます。libmylib.so.Xまた、手順3では、ライブラリを(おそらく、わからない)として指定する必要がある場合があります.X.Y。そうしないと、警告はまったく表示されません。

于 2011-02-10T15:40:16.653 に答える
1

Linuxを使用していない場合(Solarisの場合のように)、Linuxがないため、運が悪いだけですsprof。ライブラリのソースがある場合は、静的ライブラリをリンクし、代わりにそのライブラリを使用してプロファイリングバイナリを作成することで問題を解決できます。共有ライブラリへの呼び出しを追跡するもう1つの方法は、を使用することtrussです。オプションを使用する-u [!]lib,...:[:][!]func, ...と、実行の呼び出し履歴の全体像を把握できます。これはプロファイリングと完全に同じではありませんが、一部のシナリオでは非常に役立つ場合があります。

于 2011-09-01T15:01:58.000 に答える