読者です 読者をやめる 読者になる 読者になる

OS X(clang) で C++ を書いている時にデバッグする方法いろいろ

前提

  • Mac
  • C++ を書いていて
  • コンパイラgcc じゃなくて clang を使ってる
  • もっと良い方法があったら教えて欲しい。

デバッガ

gdb は使えないようなので lldb を使う。g++ コマンドが使えているなら、インストールされているはず。
gdb とコマンド名が若干ちがっているけどだいたい同じことはできる。

プロファイラ

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 とかも試してるけれど効果無さそう。