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が作成されることがわかる。このように,内部用のキャッシュも検出する。