2009-12-03 30 views
19

Linux環境で作業しています。私は2つの 'C'ソースパッケージtrainとtest_trainを持っています。gprof:メインプログラムにリンクされている共有ライブラリの関数の呼び出しグラフを生成する方法

  1. 列車のパッケージにコンパイルがlibtrain.soする
  2. test_trainリンクlibtrain.so生成し、実行可能な列車の試験

を生成するときに今、私はの呼び出しシーケンスを示しているgprofのを使用してコールグラフを生成したいですメインプログラムの機能とlibtrain.so内の機能

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

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

、出力ショーは列車の試験の関数のグラフを呼び出すことではなく、問題になる可能性がどのようなlibtrain.so

に?

答えて

17

gprofは機能しません。代わりにsprofを使用する必要があります。私はこれらのリンクが役に立ったと評価して:第二のリンクから

概要:

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

手順2では、既存のディレクトリである必要があります。そうしないと、有益な警告が表示されます。そして、ステップ3では、ライブラリをlibmylib.so.X(たぶん.X.Yでも可能です)と指定する必要があります。そうしないと、何の警告も表示されません。

+0

アプリケーションで 'ldd'を実行することで、バイナリがロードしようとしているライブラリの名前(mylib.soとmylib.so.1、mylib.so.1.1など)を調べることができます。 。これは、ライブラリが直接dlopen呼び出しによって開かれている場合にのみエントリを持つべきではありません。 –

+1

[この質問]のようにあまりにも悪いsprofが非常にひどくクラッシュする(http://stackoverflow.com/questions/6216979/what-is-causing-sprof-to-complain-about-inconsistency-detected-by-ld-so ) –

+0

私のプロジェクトで選択されたコンパイラであるMinGWがsprofに付属していない場合はどうなりますか? – Charles

0

あなたがLinuxにいない場合(Solarisの場合のように)、sprofが存在しないので、運が悪いだけです。 ライブラリのソースをお持ちの場合は、スタティックライブラリをリンクし、そのライブラリでプロファイリングバイナリを作成することで、問題を解決できます。 共有ライブラリへの呼び出しをトレースする別の方法は、trussです。 -u [!]lib,...:[:][!]func, ...オプションを使用すると、実行のコール履歴を把握することができます。プロファイリングと全く同じではありませんが、いくつかのシナリオでは非常に便利です。

1

私はライブラリをPythonからロードしていて、sprofは運がありませんでした。代わりに、私は、少なくとも、Fedoraのリポジトリにあったoprofileを、使用:プロファイリングを停止するCTL-Cを終了または実行するようにアプリケーションのための

operf --callgraph /path/to/mybinary

待ちます。今度は、プロファイル・サマリーを生成してみましょう:

opreport --callgraph --symbols

は、それを解釈するdocumentationを参照してください。それは混乱のようなものです。生成されたレポートでは、各シンボルはそれ自身のブロックにリストされます。ブロックのメインシンボルはインデントされていないシンボルです。上記の項目はその関数を呼び出す関数であり、その下の項目は呼び出されるものです。以下のセクションのパーセンテージは、それらの呼び出し先で費やした相対的な時間です。

関連する問題