MacOSX Yosemiteでプロファイラを実行する

最近Mac上でC++を書いている。
プロファイラをかけようと思ったが意外に上手く行かなかったのでメモ。

上手くいった奴

Instruments

Apple純正。ビルド時のオプションは不要。
実行時に以下のようにする。

iprofiler -timeprofiler ./a.out

a.dtpsというディレクトリが生成される。
これをXcode付属のInstrumentsに読み込ませる。
Xcodeを立ち上げてメニューのXcode->Open Developer Tool->Instrumentsで起動するか、
Xcode.app/Contents/Applications/Instrumentsで直接実行するかして起動する。
先ほどのa.dtpsを読みこませればプロファイル結果をGUIで見れる。

上手く行かなかった奴

GNU gprof

g++ -pg main.cpp

で生成された実行体を実行してもgmon.outが生成されない。
clang、gccともに変わらず…。

gperftools

g++ -lprofiler main.cpp

a.outが生成される。
a.profにプロファイル情報を吐くようにする。

CPUPROFILE=a.prof ./a.out 

CPUPROFILE=a.profと./a.outを別々に実行するとa.profが生成されなかった。
このプロファイル結果をpprofでみるのだが、メソッド名が16進の文字列になる。

pprof a.out a.prof

原因はASLRにあるらしい。
コンパイル時に-Wl,-no_pieを追加。
これにより一部のメソッド名は正しく表示されるが大半は16進のまま。
そもそも呼んでないメソッド名が処理されていることになっているのでちょっとダメっぽい。

OS X Lion Heap profiling requires disabling Position Independent Executable · Issue #363 · gperftools/gperftools · GitHub
OS X requires disabling Position Independent Executable · Issue #565 · gperftools/gperftools · GitHub