デバッグとは、プログラムのバグ(誤動作の原因)を取り除くことを言います。ここでは、どうしても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行目の間に記述されたスクリプトは正常に動作していることがわかります。
- CGIスクリプトの設置場所が誤っている。
- プロバイダやサーバーがCGIを動かす設定になっていない。
- スクリプトの改行コードが異なる。(→ 改行コードについて)
- スクリプトのパーミッションが異なる。(→ パーミッションを変更するには)
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 "を挿入し、CGIを呼び出してみてください。うまくいけば、スクリプトをすべて実行評価し、致命的なエラーがある場合に、eval { ... }; を抜けてエラーメッセージを表示します。eval { ... } の後のセミコロン( ; )を忘れないようにしてください。ERROR \n"; print "ERROR = $@\n"; }