Test::LeakTraceをCPANにあげた
Test::LeakTraceというアイデアを形にした。
http://search.cpan.org/dist/Test-LeakTrace/
使用例:
#!perl -w # example/leaked.pl use strict; use Test::LeakTrace; use Data::Dumper; my @refs = leaked_refs{ my %a; my %b; $a{b} = \%b; $b{a} = \%a; }; print Data::Dumper->Dump([\@refs], ['*leaked']); __END__
結果:
@leaked = ( \{ 'a' => { 'b' => ${$leaked[0]} } }, {}, \${$leaked[0]}->{'a'}, {} );
leaked_refs()はリークしている値のリファレンスを返す。{}が二つリークしているのが謎だが,%aと%bの循環参照はきちんと検出できている。ときどき変わった値*1を返してくるのが面白い。
まだ基本的なAPIしか用意していないため若干使いにくい。しかし,「無限ループの中でコードを実行してメモリのグラフとにらめっこ」を自動化する方法を思いついたので次のリリースにはそのルーチンを含めるつもりである。
(追記)
Test::Weakenというモジュールが似た意図をもっているようだ。こちらはPure Perlのモジュールである。
*1:たとえば,新しいスレッドを作成すると全パッケージに*CLONEと*CLONE_SKIPが作成されることがわかる。このように,内部用のキャッシュも検出する。