Perlでスタックトレース

Java で開発していたときは、エラー発生時に e.printStackTrace() や new Throwable().printStackTrace() でスタックトレースを出力していました。これがないと目隠しでデバッグするようなもので、開発段階では必須でした。Perl でも Devel::StackTrace というモジュールを使うとスタックトレースがとれます。これをラップしたのが Catalyst::Plugin::StackTrace です。以下のようにして使います。

MyApp/lib/MyApp.pm

package MyApp;

use Catalyst qw/-Debug Dumper StackTrace/;
use Data::Dumper;

sub end : Private {
    my ( $self, $c ) = @_;

    # some fatal error occured
    if (scalar @{$c->error}) {
        #$c->log->debug('verbose $c: ', Dumper($c)); # very large size !!!!!
        $c->log->fatal('verbose $c->_stacktrace: ', Dumper($c->_stacktrace));
        $c->log->fatal('verbose $c->error: ', Dumper($c->error));
        $c->{error} = [];
    }

$c をダンプするとスタックトレースやエラーの内容ももれなくついてきますが、ひどいときには数千行や数万行になるので、的をしぼって出力することをおすすめします。