実践的な Haskell debugging
私的なメモ。GHCを生でインストールし、cabalのラッパーであるcabを使っている。stackはたまに使うことがある程度。
例外が起きた場所を探す
以下で例外が起きたときにスタックトレースが取れる。
% prog +RTS -xc
GHCiを使う方法もある。
ボトルネックを探す
以下で、プログラムの終了時にプロファイルが取れる。サーバの場合は、横から停止すればプロファイルが作られる。
% prog +RTS -p % cat prog.prof
スペースリークを探す
以下で、prog.hp というファイルが作られ、ヒーププロファイルが格納される。このファイルは、プログラムが実装されている間中育っていく。プログラムを終了する必要はない。サーバの実働中もヒーププロファイルが見れるので、監視に便利。
% prog +RTS -h -L50
注意:以前の定番である -hT
は、最近使えないようだ。
描画するには、macOSだと以下のようにする。
% hp2ps -c prog.hp; open prog.ps
PINNED
が多ければ、 ByteString
がリークしている。
ストーリー1:プロファイル機能付きのプログラムを作成する
% mkdir profile % cd profile % cab init % cab install -e -p prog % .cabal-sandbox/bin/prog +RTS -h
ストーリー2:パッケージのテストで例外が起きた場所を見付ける
% cd package % cab init % cab install -d -p -t % cab conf -e -p -t % cab build % ./dist/build/test/test +RTS -xc
備考
手元のライブラリを利用する場合は、cab init した後に cab add package するとよい。パッケージ名とディレクトリ名が異なっていても、ちゃんと認識される。