デバッグとは、プログラムのバグ(誤動作の原因)を取り除くことを言います。ここでは、どうしてもCGIスクリプトが動かない場合(サーバーエラーになってしまう場合)の、デバッグを方法をいくつか紹介します。
マシンで Perl を使用可能な場合は、コマンドライン(Windowsの場合は MS-DOSプロンプト)で実行確認してみましょう。期待通りのHTML文書が表示されていればOKです。(test.cgi は、作成したCGIスクリプトのファイル名です。)
perl test.cgi
オプション -wc を用いることで、より詳細なシンタックス(構文)チェックを行うことができます。
perl -wc test.cgi
Webサーバのエラーログ(/var/log/apache/error_logなど)を確認できる場合は確認してみましょう。何かヒントになるメッセージが書き込まれているかもしれません。
サーバ上でしかデバッグができない場合は、CGIスクリプトの2行目(1行目は perl のパス名だと思うので)に、以下の文章を挿入してください。
print "Content-type: text/html\n\nOK.\n"; exit(1);
この状態でブラウザからCGIを呼び出して「OK.」が表示されれば、CGIの設定は正常です。これでもサーバーエラーになってしまう場合は、以下のような原因が考えられます。
「OK.」が表示された場合、上記で追加した行を10行目あたりに移動して、再度ブラウザから呼び出してください。これで「OK.」が表示されれば、1行目から10行目の間に記述されたスクリプトは正常に動作していることがわかります。
10行目に追記した行を50行目に移動し、「OK.」だったら100行目あたりに、エラーだったら25行目あたりに移動して、スクリプトの「どの部分」でエラーが発生しているかを見つけていきます。
たとえば下記の例で、26行目に挿入した時は「OK.」が表示されたのに、28行目に挿入するとサーバーエラーとなる場合、27行目が「怪しい」行となります。
25: print "<h1>テスト</h1>\n"; 26: 27: print "<a href="test.html">TEST</a>\n"; 28: 29: print "<table>\n";
この場合(あくまで上記の場合は・・・ですが)、27行目の " を \" に、つまり、27行目を次のように修正すれば、動くようになるかもしれません。
27: print "<a href=\"test.html\">TEST</a>\n";
上記と同じように、スクリプトの2行目に下記の行を追加してください。
print "Content-type: text/html\n\n";
また、スクリプトの適当な個所で下記の例に示す行を追加してください。
print "DEBUG: XXX=$FORM{'XXX'}<br>\n";
これにより、その時点における変数の値を表示させることもできます。
あと、サーバにアップロードしたCGIを大胆にデバッグする方法を紹介していただきました。まず、スクリプトの1行目(1行目が #! ではじまっている場合は2行目)に下記の行を挿入してください。
eval {
また、スクリプトの一番最後に以下の行を追加してください。
}; if ($@) { print "Content-type: text/html\n\n"; print "<title>ERROR</title>\n"; print "ERROR = $@\n"; }
これにより、うまくいけば、スクリプトをすべて実行評価し、致命的なエラーがある場合に、eval { ... }; を抜けてエラーメッセージを表示します。eval { ... } の後のセミコロン( ; )を忘れないようにしてください。