OS X(clang) で C++ を書いている時にデバッグする方法いろいろ
プロファイラ
valgrind が(ほぼ)使えないので、gperftools を使う。
$ brew install gpreftools
でインストール可能。プロファイリングを有効にするには
$ g++ your.cpp -o your.out -lprofile
とコンパイル時にリンクするだけ。
プロファイル出力先は
$ CPUPROFILE=your.prof ./your.out
で実行時に指定する。
ここを読めばだいたい分かる。
ビジュアライズ
プロファイル出力はそのままでは読めないので、pprof コマンドで読む
$ pprof your.out your.prof
で対話的シェルが起動する。help で細かい使い方はわかるはず。
よく使うのは top とか web とかか。top は時間占有率(?)の高い関数がみえるし、
web は svg でコールグラフを描画して、ブラウザでオープンしてくれる。
しかし、もうちょっと便利に見たいので qcachegrind を使う
$ brew install qcachegrind
qcachegrind は callgrind の出力を見やすく表示してくれるツール。
callgrind 形式に gperftools の出力を変換する必要があるので
$ pprof --callgrind your.out your.prof > callgrind.prof
で変換。
$ qcachegrind callgrind.prof
で開く
関数名が16進数になってる...
既知の問題らしいので https://code.google.com/p/gperftools/issues/detail?id=562 に従って
コンパイル時のオプションを
$ g++ -Wl,-no_pie -g your.cpp -o your.out -lprofile
に変更。
これでも全部の関数は見えない。-g3 とかも試してるけれど効果無さそう。