Movable Type のプラグインをデバッグする方法というと、ログにメッセージや変数を出力する、いわゆる「printfデバッグ」になると思います。
ですが、怪しいと思う場所をすんなりと特定できなかったり、変数が想定していたのとは違う値を持っていたり、となるとログを取る場所や変数を変えたり、増やしたり、という作業を繰り返すわけですが、何度も同じ作業をやるのは面倒だし、時間はかかるし、イライラしてきます。
そういう時は、printfデバッグをさっさとあきらめ、perl debuggerを使ってデバッグします。
- ソースを編集し、デバッガを起動したい行の直前に、以下の1行(ブレークポイント)を設定します。(MTのコードはBEGINプロックで実行されるので、デバッガのプロンプトが出た時点では実行が完了しています。ですからソースに直接ブレークポイントを仕込んでおきます。)
- デバッガ用にターミナルを開き、デバイス名を調べます。
- ターミナルのデバイスファイルのパーミッションを変更します。
- ターミナルのカラム、ライン数を調べます。
- .htaccessを編集し、事前に調べたターミナルのデバイス名、カラム、ラインを環境変数として設定します。
- デバッガ用ターミナルで以下のコマンドを入力し、デバッガからの接続を待ちます。
- mt.cgiを編集し、perlに渡す引数を-dに変更します。
- ブラウザからmt.cgiにアクセスします。
- 以下のような表示が出て、デバッガが開き、設定したブレークポイントで停止すれば成功です。
$DB::signal = 1;
# tty /dev/pts/0
# chmod a+rw /dev/pts/0
# stty -a speed 9600 baud; rows 50; columns 102; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol =; eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0; -parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel -iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echoe -echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
SetEnv PERLDB_OPTS TTY=/dev/pts/0 SetEnv COLUMNS 102 SetEnv LINES 50
# clear; sleep 10000
#!/usr/bin/perl -d
Loading DB routines from perl5db.pl version 1.28 Editor support available. Enter h or `h h' for help, or `man perldebug' for more help. MT::Plugin::Hoge::check_param(/var/www/html/mt/plugins/Hoge/hoge.pl:58): 58: my ($eh, $app, $param, $tmpl) = @_; DB<1>
これでさっくりとバグを直してしまいましょう。