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

とほほのWWW入門 > とほほのCGI入門 > CGIスクリプトをデバッグするには?
2000年4月7日初版 / 2000年6月2日改版

はじめに

デバッグとは、プログラムのバグ(誤動作の原因)を取り除くことを言います。ここでは、どうしても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 のパス名だと思うので)に、以下の文章を挿入してください。
    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 "</HTML>\n";
    26:
    27: print "<BODY BGCOLOR="#FFFFFF">\n";
    28:
    29: print "<H1>テスト</H1>\n";
この場合(あくまで上記の場合は・・・ですが)、27行目の " を \" に、つまり、27行目を次のように修正すれば、動くようになるかもしれません。
    27: print "<BODY BGCOLOR=\"#FFFFFF\">\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 "ERROR\n";
        print "ERROR = $@\n";
    }
を挿入し、CGIを呼び出してみてください。うまくいけば、スクリプトをすべて実行評価し、致命的なエラーがある場合に、eval { ... }; を抜けてエラーメッセージを表示します。eval { ... } の後のセミコロン( ; )を忘れないようにしてください。

Copyright (C) 2000 とほほ
http://wakusei.cplaza.ne.jp/twn/wwwcgi7.htm