以前、
MovableType のプラグインをperl debuggerでデバッグする (エムロジック放課後プロジェクト)
このエントリで、perl debuggerを使ったデバッグの仕方を書きました。この中で、
Movable Type のプラグインをデバッグする方法というと、ログにメッセージや変数を出力する、いわゆる「printfデバッグ」になると思います。
と触れられている、いわゆる「printfデバッグ」について、今回は書いてみたいと思います。
MTプラグインのデバッグで、もっとも多く行われているのがいわゆる「printfデバッグ」ではないかと思います。
これは、プラグインの中から、変数の値や、文字列をシステムログに吐き出すことによって行います。
この方法のメリットは、とりあえずプラグインを実行してみて、後から、ログをみることで、そのプラグインの動作状況を確認できることにあります。リアルタイムに確認したい場合にはあまり向いていませんが、プラグインの要所要所で、メッセージをログに吐き出すことで、動作の流れを把握することが可能です。
プラグインに以下の関数を追加します。
sub doLog {
my ($msg) = @_;
return unless defined($msg);
use MT::Log;
my $log = MT::Log->new;
$log->message($msg) ;
$log->save or die $log->errstr;
}
以下のように使います。
- 変数を出力する
-
doLog($var);
- 文字列を出力する
-
doLog('hoge');
- 配列や、ハッシュを出力する
-
use Data::Dumper;
doLog(Dumper($hash_ref)); - 配列や、ハッシュをYAMLで出力する
-
use YAML;
doLog(YAML::Dump($hash_ref);
例えば、関数に入った時に
doLog('Func:hoge');
として、関数に入ったことを記録します。
もし、システム・ログにFunc:hogeと書かれていなければ、この関数は処理されていないということが分かります。
関数内の要所要所でその処理内容を記録することで、関数内のどこまできちんと処理されたのかが分かりますし、条件分岐の流れなども追うことができます。
関数の中で
doLog("hoge:$hoge");
として、変数hogeの内容を記録すれば、その時の変数の値も分かりますし、デバッグの役に立ちます。
ループ内で、変数の状況を記録すると、ループ中にどのような処理が行われたかを調べることもできます。
システムログに書き出す、このデバッグ方法は非常に手軽です。
ただし、システムログに大量のデバッグメッセージが残ってしまいますので、こまめにログを削除した方が良いかもしれません。
それから、プラグイン完成時には、デバッグメッセージを吐き出している箇所を、すべて削除するようにしましょう。こうしないと、実際の使用時に大量のデバッグメッセージが書き出されてしまいます! ご注意を!
Windows環境の方はこちらのエントリも参照してみてください。