Devel::Leak::Objectでメモリーリークチェック

モリーリークしてないかを簡単に確かめるためのスクリプトも作ってみた。以下のように使う。

  • Devel::Leak::Objectを使う
  • 実行回数を変えて実行する
    • perl tools/memory_leak.pl --loop 1
    • perl tools/memory_leak.pl --loop 100
  • 実行回数に応じてDevel::Leak::Objectで出力されるオブジェクト数が増えるものがあれば、それがLeakしている
#!/usr/bin/env perl
use strict;
use warnings;
use lib 't/lib';
use Devel::Leak::Object qw{ GLOBAL_bless };
use Test::TCP;
use TestApp::Web;
use HTTP::Engine;
use LWP::UserAgent;
use Getopt::Long;
use Pod::Usage;

my %argv = (
    module => 'ServerSimple',
    port  => empty_port(),
    loop => 1,
);
GetOptions(
    \%argv,
    "module=s",
    "port=i",
    "loop=i",
    "help",
) or $argv{help}++;

pod2usage(2) if $argv{help};

my $module = $argv{module};;
my $port = $argv{port};
my $loop = $argv{loop};

test_tcp(
    client => sub {
        my $port = shift;
        my $ua   = LWP::UserAgent->new;
        for ( 0 .. $loop ) {
            $ua->get("http://localhost:$port/");
        }
    },
    server => sub {
        my $port = shift;
        my $engine = TestApp::Web->new(
            server => $module,
            port   => $port,
        );
        $engine->setup;
        $engine->run;

    },
);

だんだん小物ツールが充実して便利になってきた
http://github.com/dann/angelos/tree/master/tools

# 面倒なので自動化した

memory_leak.sh

perl tools/memory_leak.pl --loop 1 > memory_leak_1.txt
perl tools/memory_leak.pl --loop 10 > memory_leak_100.txt 
diff -uNr memory_leak_1.txt memory_leak_100.txt
rm -f memory_leak_1.txt
rm -f memory_leak_100.txt