2012-03-01 7 views
1

SysProfがコールスタックを正しく生成しない場合、GProfは正確ではありません。また、-fno-omit-frame-pointerなしで動作するプロファイラーは、それに依存するものほど正確ですか?x86_64に-fomit-frame-pointerで動作するプロファイラはありますか?

+2

マンページ自体が '-fomit-frame-pointer'について警告することを覚えておいてください:" [...]一部のマシンではデバッグが不可能になります。 " –

+0

ディストリビューション(Fedora)はデフォルトでコンパイルします。 – lamefun

+0

x86_64の場合 'fomit-frame-pointer'はコマンドラインで指定されていなくてもデフォルトです。これはlibunwindが存在するためです。これは '-fno-omit-frame-pointer'を時代遅れにします。 – hirschhornsalz

答えて

2

私が知っていることはありません。フレームポインタを使用すると、スタックを歩くことはかなり簡単です。古いフレームポインタ、スタックポインタ、および命令ポインタを見つけるためにフレームポインタを参照解除し、完了するまで繰り返すだけです。フレームポインタがなければ、ELFプラットフォームでは一般的にDWARF CFIを意味する追加情報なしで確実にスタックを歩くことはできません。 DWARFは解析するのがかなり複雑で、プロファイラーが作業する必要がある時間的制約の中で行うのは、かなりの量の追加情報を読み込む必要があります。

これを実装するには1つのもっともらしい方法がありますすべてのサンプルでスタックメモリを使用し、CFIを使用してオフラインで歩き、適切に巻き戻します。スタックの深さによっては、かなりの記憶容量が必要になる可能性があり、コピーが禁止される可能性があります。私はこの手法を使ったプロファイラについて聞いたことがありませんが、Julian Seward floated it as a potential implementation strategyはFirefoxの組み込みプロファイラです。 Linuxのperf

+0

私はdwarf(スタックアンワインド)メソッドでperfを使用しています。 -fno-omit-frame-pointerでコンパイルせずに動作します。 – Nasir

1

-fomit-frame-pointerがアサートされていると、ほとんどのプロファイラが動作しなくなります。合理的なプロファイリングをしたい場合は、おそらくそれを使用したり、ライブラリのデバッグバージョン(ほとんどの場合、-fomit-frame-pointerなしでコンパイルされています)にリンクする必要があります。

+0

ライブラリが '-fomit-frame-pointer'なしでコンパイルされたとしても、 '-O'オプションが使用されている限り有効になります。これはx86_64のデフォルトオプションです。 libunwindでは、フレームポインタなしでデバッグを行うことができます。 – hirschhornsalz

1

最近のバージョンは、(--call-graph dwarfと共に)使用することができる。

perf record -F99 --call-graph dwarf myapp 

これはスタックをアンワインドするlibunwindのと.eh_frames(又は.debug_frames)を使用します。

私の経験では、時々迷子になります。

Haswellのperf +カーネルの最新バージョンでは、use the Last Branch Record--call-graph lbrを設定できます。

+0

これを実行すると、 'perf script'出力にスタックトレースがありません。何か案は? –

+0

@TavianBarnes、私は現在、perf_4.0とperf_4.1と同じ[Debianの問題](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=793409)を持っています。 perf_3.16( 'perf script' =>' perf_3.16 script'の場合)に切り替えると、期待通りに動いています。私はこれがアップストリームの問題であるかどうかを(まだ)確認していませんでした。 – ysdx

+0

参照のため、AFAIKは各サンプルのディスク上のスタックの一部をコピーし、後でCFIを使用して巻き戻します。 – ysdx

関連する問題