2012-05-12 12 views
12

MacOSXでいくつかのC++プログラムのプロファイルを作成しようとしています。だから私はgoogle-perftoolsを構築し、-gコンパイラフラグを持つMacPorts g ++ 4.7を使ってコンパイルし、libprofilerにリンクしたプログラムを書いた。それから私は走った:MacOSXのGoogle Perfools CPUプロファイラの行番号

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はアドレスが関数名を変換しないように見えます。

私がここで紛失していることを知っている人はいますか?プロファイラが正しい結果を生成できるようにするにはどうすればよいですか。

EDIT:詳細:pprofやgoogle-perftoolsの問題ではなく、gccやmacosxのようなものです。これは、Instrument.appも行番号の代わりにアドレスを表示するためです。私はデバッグシンボルがMac OS Xでどのように動作するかに精通していないので、gccやMac OS Xのバグではなく、むしろここで欠けていると思うでしょう。誰でもデバッグ情報の仕組みに関するヒントMac OS X用

+0

"私はプロファイルの一部のC++プログラムを試しています"次に、なぜこの質問をCとタグ付けしますか? –

+0

この問題はC++だけでなくCにも当てはまりません。 –

+0

私はOS Xの開発者やgoogleperfに慣れていませんが、以前はプロファイリング用のライブラリを使用していましたが、デバッグ用の-gフラグも使用しました。コンパイラとリンカに-pフラグを追加してプロファイリングの詳細を取得します。 – fduff

答えて

4

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

詳細については、this questionを参照してください。

pprofのPerlソースコードを見ると、nmc++filtを使ってシンボル名を取得しているため、それらのスタンドアロンを実行して、なぜ動作しないのかを調べることができます。 pprofソースからは、複数のバージョンのnmをカバーするために、さまざまなコマンドライン引数を試しているようです。これは、方法の要約です。

nm [-D] -n [-f] [--demangle]オブジェクトファイル2>/dev/nul [| cpp + filt]

括弧で囲まれた部分は、使用しているプラ​​ットフォームとnmおよびC++ filtに必要な場合に実行時にスクリプトが決定する部分です。上記のすべての組み合わせを試して、何が効果があるかを見てください。次に、pprofスクリプトが何をするのかを見てみましょう。

幸運。

+0

それは役に立ちません。 .oファイルを保存しようとしましたが、pprofは行番号の代わりにアドレスを表示します。 –

+0

問題はpprofではありません。これらのシンボルをロードするためにgdb内で作業することになり、何が起こっているのかを知ることができます。おそらく、.oファイルが予想外のディレクトリにあります。 – Miguel

+0

私はこれについていくつかの進歩を遂げました。 'CPUPROFILE = cpu.profile gdb。/ a.out'を使ってプログラムを起動し、' gdb'の中で 'start'と' cont'を実行すると、シンボルを正しく取得できます。だから私はそれが 'cpu.profile'の中に記録されたアドレスが間違っているように、プログラムを正常に起動するとシンボルをロードしないgoogle-perftoolsの問題かもしれないと思います。 'gdb'はかなり遅く、毎回実行するのが実用的ではないので、私は本当に' gdb'なしでプログラムを正常に起動する必要があります。だから私はそれをどのように動作させることができるか考えていますか?ありがとう。 –

6

これは私がgperftoolsの課題追跡にissue #562を提出しましたOS X 10.5

で導入アドレス空間配置のランダム化(ASLR)に関連しているようです。 -Wl,-no_pieを渡すことで、ASLRを無効にすることができます。

また、gperftoolsを使用する場合は、InstrumentsXcodeに付属)を試してみる価値があります。

+0

ありがとう、これはまさにそれでした。 -Wl、-no_pieは、Mac OS上でpprofを「そのまま」使用できるようにします。 – Ogre