14

MacOSX でいくつかの C++ プログラムをプロファイリングしようとしています。そこで私は をビルドgoogle-perftoolsし、プログラムを書き、MacPorts g++ 4.7 を使用してコンパイルし、-gコンパイラ フラグを付けて にリンクしましたlibprofiler。それから私は走った:

CPUPROFILE=cpu.profile ./a.out

次に、pprof を実行して出力を生成しました。

[hidden ~]$ pprof --text ./a.out cpu.profile 
Using local file ./a.out.
Using local file cpu.profile.
Removing __sigtramp from all stack traces.
Total: 282 samples
     107  37.9%  37.9%      107  37.9% 0x000000010d72229e
      16   5.7%  43.6%       16   5.7% 0x000000010d721a5f
      12   4.3%  47.9%       12   4.3% 0x000000010d721de8
      11   3.9%  51.8%       11   3.9% 0x000000010d721a4e
       9   3.2%  55.0%        9   3.2% 0x000000010d721e13
       8   2.8%  57.8%        8   2.8% 0x000000010d721a64
       7   2.5%  60.3%        7   2.5% 0x000000010d7222f0
       6   2.1%  62.4%        6   2.1% 0x000000010d721a4c
       6   2.1%  64.5%        6   2.1% 0x000000010d721b1f
       6   2.1%  66.7%        6   2.1% 0x000000010d721e0c
       5   1.8%  68.4%        5   1.8% 0x000000010d721fba
    ......

perftools がアドレスを関数名に変換していないようです。

ここで何が欠けているか知っている人はいますか?プロファイラーが正しい結果を生成できるようにするにはどうすればよいですか?

編集: 詳細: pprof や google-perftools の問題ではなく、gcc や macosx などの問題です。Instrument.app も行番号の代わりにアドレスを表示するためです。私は Mac OS X でデバッグ シンボルがどのように機能するかについてよく知らないので、gcc や Mac OS X のバグではなく、ここで何かが欠けていると考えたいと思います。 Mac OS X 用。

4

2 に答える 2

4

このプラットフォームでは、デバッグ シンボルは .o ファイルに残り、実行可能ファイルには移動されません。gdb またはプロファイラーでシンボルを取得するには、.o ファイルを保存する必要があります。これは、.o ファイルを保持するために、アプリケーションを 2 つのステップ (コンパイルしてからリンク) でコンパイルする必要があることを意味する場合があります。

詳細については、この質問を参照してください。

pprof Perl ソース コードを見ると、シンボル名はnmとを使用して取得c++filtされるため、これらをスタンドアロンで実行してみて、機能しない理由を突き止めることができます。pprof ソースから、nm のいくつかのバージョンをカバーするために、さまざまなコマンド ライン引数を試しているようです。やり方まとめです

nm [-D] -n [-f] [--demangle] object-file 2>/dev/nul [| cpp+フィルター]

角かっこで囲まれた部分は、スクリプトが実行時にプラットフォームと nm および c++filt のバージョンに必要かどうかを判断する部分です。上記のすべての組み合わせを試して、何が機能するかを確認してください。次に、pprof スクリプトが何をするかを見てみましょう。おそらくそれにいくつかの printfs を追加します。

幸運を。

于 2012-05-20T17:48:36.557 に答える