CGIスクリプトをデバッグするには?

トップ > とほほのCGI入門 > CGIスクリプトをデバッグするには?

はじめに

デバッグとは、プログラムのバグ(誤動作の原因)を取り除くことを言います。ここでは、どうしてもCGIスクリプトが動かない場合(サーバーエラーになってしまう場合)の、デバッグを方法をいくつか紹介します。

Perlで動くか確認する

マシンで Perl を使用可能な場合は、コマンドライン(Windowsの場合は MS-DOSプロンプト)で実行確認してみましょう。期待通りのHTML文書が表示されていればOKです。(test.cgi は、作成したCGIスクリプトのファイル名です。)

コマンドライン
perl test.cgi

オプション -wc を用いることで、より詳細なシンタックス(構文)チェックを行うことができます。

コマンドライン
perl -wc test.cgi

Webサーバのエラーログを確認する

Webサーバのエラーログ(/var/log/apache/error_logなど)を確認できる場合は確認してみましょう。何かヒントになるメッセージが書き込まれているかもしれません。

デバッグ文を挿入してみる

サーバ上でしかデバッグができない場合は、CGIスクリプトの2行目(1行目は perl のパス名だと思うので)に、以下の文章を挿入してください。

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行目が「怪しい」行となります。

Perl
25: print "<h1>テスト</h1>\n";
26:
27: print "<a href="test.html">TEST</a>\n";
28:
29: print "<table>\n";

この場合(あくまで上記の場合は・・・ですが)、27行目の " を \" に、つまり、27行目を次のように修正すれば、動くようになるかもしれません。

Perl
27: print "<a href=\"test.html\">TEST</a>\n";

変数を表示させてみる

上記と同じように、スクリプトの2行目に下記の行を追加してください。

Perl
print "Content-type: text/html\n\n";

また、スクリプトの適当な個所で下記の例に示す行を追加してください。

Perl
print "DEBUG: XXX=$FORM{'XXX'}<br>\n";

これにより、その時点における変数の値を表示させることもできます。

大胆なデバッグ方法

あと、サーバにアップロードしたCGIを大胆にデバッグする方法を紹介していただきました。まず、スクリプトの1行目(1行目が #! ではじまっている場合は2行目)に下記の行を挿入してください。

Perl
eval {

また、スクリプトの一番最後に以下の行を追加してください。

Perl
};
if ($@) {
    print "Content-type: text/html\n\n";
    print "<title>ERROR</title>\n";
    print "ERROR = $@\n";
}

これにより、うまくいけば、スクリプトをすべて実行評価し、致命的なエラーがある場合に、eval { ... }; を抜けてエラーメッセージを表示します。eval { ... } の後のセミコロン( ; )を忘れないようにしてください。


Copyright (C) 2000 杜甫々
初版:2000年4月7日、最終更新:2000年6月2日
http://www.tohoho-web.com/wwwcgi7.htm