Catalyst: スタックトレースをデバッグスクリーンに表示するプラグインを試す

はじめに

Catalystで使える興味深いプラグインがリリースされました。そのプラグインとは、Catalyst::Plugin::StackTraceです。プラグインの名前から予想できるように、スタックトレースデバッグスクリーンに表示してくれるというものです。待ってました!

このプラグインの機能が目新しいかというとそんなことはありません。最近流行りのRuby on Railsはその機能に標準対応しています。また、はてなのHatena frameworkやライブドアのSlegeでもスタックトレースを実行エラー時にブラウザに出力する試みがされています(参考文献を参照)。つまり、何が言いたいのかというと、開発者をよりcomfortableにするために、実行エラー時にスタックトレースを出力できるようにしてあるフレームワークが増えつつあるということです。

ということで、このエントリーではCatalyst::Plugin::StackTraceを利用して実行時にスタックトレースデバッグスクリーンに表示してみる実験をしてみます。

実験

実験の前に、Catalyst::Plugin::StackTraceをインストールしておきます。

[ysano@fedora]~% sudo perl -MCPAN -e "install Catalyst::Plugin::StackTrace"

それでは、Catalyst::Plugin::StackTraceの簡単な実験をしてみたいと思います。話は簡単です。catalyst.plでテストアプリの雛形を生成して、生成されたコントローラモジュールにちょっと手を加えるだけです。コントローラモジュールは、Catalyst::Plugin::StackTraceのテストコード(t/05verbose1.tt/lib/TestApp/Controller/Foo.pm)を参考にして作ります。

まず、catalyst.plで雛形を生成します。次に生成されたディレクトリの中にあるlib/StackTraceTest.pmを編集します。

[ysano@fedora]~/perl% catalyst.pl StackTraceTest
[ysano@fedora]~/perl% cd StackTraceTest
[ysano@fedora]~/perl/StackTraceTest% vi lib/StackTraceTest.pm
package StackTraceTest;

use strict;
use warnings;

use Catalyst qw/-Debug StackTrace/;

our $VERSION = '0.01'; 

__PACKAGE__->config(
    name => 'StackTraceTest',
    stacktrace => {
        verbose => 0,
        context => 3,
    },
);
__PACKAGE__->setup;

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

    $c->forward('crash');
}

sub crash : Local {
    my ( $self, $c ) = @_; 

    three(); # where to call?
}

1;

やるべきことは単純です。とにかくなんとかして、実行時にエラーを発生させれば、ブラウザにスタックトレースが表示されるはずです。そこで次のような仕掛けをCatalyst::Plugin::StackTraceのテストコードを参考にして作ります。

defaultサブルーチンを見てください。defaultのアクションが呼び出されると、制御がcrashアクションに渡されます。そして、そのcrashアクション内で"three()"という未定義のサブルーチンが呼び出されます。この時、threeサブルーチンは未定義なので実行エラーとなります。

「__PACKAGE__->config」の所でスタックトレースの冗長さと、スタックトレース時に表示させる問題箇所のソースコードの量を設定しています。ここは、こういうオプションがあるんだということだけ覚えておけば十分です。ちなみに、verboseを"2"に設定すると、フレームワークの内部までスタックトレースを出力してくれるようになります。

Excellent。準備はできました。

では、テストサーバーを起動してみましょう。そして、ブラウザでhttp://fedora:3000にアクセスしてみます。(環境に合わせて読み直してください。)

[ysano@fedora]~/perl/StackTraceTest% ./script/stacktracetest_server.pl -r
[Mon Jan  2 15:21:35 2006] [catalyst] [debug] Debug messages enabled
[Mon Jan  2 15:21:35 2006] [catalyst] [debug] Loaded plugins:
.------------------------------------------------------------------------------.
| Catalyst::Plugin::StackTrace                                                 |
'------------------------------------------------------------------------------'

[Mon Jan  2 15:21:35 2006] [catalyst] [debug] Loaded dispatcher "Catalyst::Dispatcher"
[Mon Jan  2 15:21:35 2006] [catalyst] [debug] Loaded engine "Catalyst::Engine::HTTP::Restarter"
[Mon Jan  2 15:21:35 2006] [catalyst] [debug] Found home "/home/ysano/perl/StackTraceTest"
[Mon Jan  2 15:21:35 2006] [catalyst] [debug] Loaded Private actions:
.----------------------+----------------------------------------+--------------.
| Private              | Class                                  | Method       |
+----------------------+----------------------------------------+--------------+
| /default             | StackTraceTest                         | default      |
| /crash               | StackTraceTest                         | crash        |
'----------------------+----------------------------------------+--------------'

[Mon Jan  2 15:21:35 2006] [catalyst] [debug] Loaded Path actions:
.--------------------------------------+---------------------------------------.
| Path                                 | Private                               |
+--------------------------------------+---------------------------------------+
| /crash                               | /crash                                |
'--------------------------------------+---------------------------------------'

[Mon Jan  2 15:21:35 2006] [catalyst] [info] StackTraceTest powered by Catalyst 5.56
You can connect to your server at http://fedora:3000

これがスタックトレース

ブラウザには以下のようなスタックトレースが表示されます。threeサブルーチンを定義しなかったので、期待通り実行エラーが発生し、スタックトレースが表示されました。ソースコードと一緒にスタックトレースを出力してやると、本当に見やすいですね。


おわりに

スタックトレースを出力するだけでも開発者のイライラはかなり軽減できることでしょう。また、Catalyst::Plugin::StackTraceのようにスタックトレース時にソースコードの断片も一緒に表示することで、さらに開発者の負担を減らせられるのではないでしょうか。いいツールを使えるって本当に幸せなことですね。

このエントリーを読んで興味を持たれた方は、一度実際にCatalyst::Plugin::StackTraceを試してみられると良いかもしれません。実際に手を動かすことで、スタックトレースの有難みがよりいっそう感じて頂けるのではないでしょうか。

参考文献