Test::LeakTraceは、主にXSコードのメモリリークを追うために書いたライブラリだが、誤検出(false positive)が多く使いにくかった。今回RTチケットを受け取ったのを機に、検出アルゴリズムを再考したので、誤検出はほぼなくなったはずだ*1。 新しいアルゴリズムは非常に単純である。あるコードブロック(サブルーチン)の前にSVの個数を数えておき、ブロックの実行後にもう一度SVを数え、差があればなにか良くないことが起きている、とみなす。そして、詳しくトレースするために独自のopcode実行ループ*2の制御のもとでもう一度実行し、レポートを作成するというわけだ。あまりにも単純すぎて、なぜ昔はこの方法が思い浮かばなかったのか、不思議なくらいである。 *1:しかし、依然として内部キャッシュは検出する。キャッシュとメモリリークを区別することはおそらく不可能であろう。 *2:runop