トップへ
田村研究室

インターネット利用技術演習

2009年度

2009
6/29

CGIのデバッグ方法

CGIスクリプトが期待通りに動作しなかった場合にどうすればよいか

CGIスクリプトを含めて,プログラムミスのことをバグ(bug;虫)と呼ぶ.このバグを修正してプログラムを正しく動作させるための作業をデバッグ(debug)と呼ぶ.ここではCGIスクリプトのデバッグ方法のついてのヒントを示す.

CGIが動かないときのヒント

  1. 作成手順・設定手順が間違っていないか→丹念に再確認
  2. そのスクリプトはシェルから実行できるか→ コマンドラインから実行してみる.正しくHTMLや数値などが表示されるかどうか確認.
    • 動く場合,スクリプト内容は正しい.次の質問へ
    • 動かない場合,さらに次のチェック
      1. スクリプト内容の確認: スペルミスや記述の間違いをチェック
      2. スクリプトの保存方法の確認: 文字コードや改行コードは正しいか
      3. スクリプトファイルの保存場所の確認
      4. スクリプトファイルの実行属性を確認
  3. エラーメッセージを読む
    • そのスクリプトのURLを正しく指示したか
    • そのスクリプトの保存場所(cgi-bin)の読み込み属性と実行属性がついているのか
  4. スクリプトのプログラム内容が間違っていないか.→一時的にデバッグ用に書き換えて,動作を確認

作成手順・設定手順が間違っていないか再確認してみる

まず最初にすることは,あたり前のことであるが,注意深く丹念に作業内容を再確認しておくこと.一手順でも抜けると動かないことがよくある.

CGIスクリプトをコマンドラインから実行してみる

Webブラウザからアクセスしてもエラーメッセージもなにも表示されなかったり,意味のあるエラーメッセージが表示されない場合には,直接コマンド入力によってCGIスクリプトを実行してみるべきである.コマンド入力で実行できなければCGIとしても動作するはずがない.

コマンドラインから実行するには,ターミナルソフトを起動してコマンドプロンプトを表示させて後,

% cd (CGIスクリプトの格納場所)
% ./(CGIスクリプト名)

として実行すればよい.ここで「not found」や「permission denied」などエラーが表示された場合は,スクリプトの保存場所や,CGIスクリプトの属性が間違っていることが考えられる.また,スクリプト内容に 間違いがあれば,それを表示してみれることもあるので確認すること.

特に注意しなければならないこととして,入力フォームと連携しているCGIスクリプトの場合には,CGIスクリプトの実行にはパラメータが必要である.入力フォームのMETHODがPOSTの場合には,CGIスクリプトを実行後,キーボードから

sex=1&birth=12(最後にEnterキーを押す)

などのように,入力フォームから渡されてくるはずの情報と同じ形式の仮情報を手で入力してやればよい.

スクリプトにバグがあって,スクリプトの実行が終了されない場合には,コントロールキーと同時に「C」のキーを押すことで,強制的に実行を中断することができる.

CGIスクリプトのエラーを読む

WebブラウザからCGIスクリプトへアクセスしたときに,なにかエラーメッセージが表示された場合には,そこにヒントがあることがある.

エラーメッセージには様々なものがあり,サーバマシンやサーバのソフトウェアのバージョンなどによっても異なる.すべての例を挙げることはできないが,次のような(似た言い回しを含む)ものがある.

  • script not found
  • permission denied

はじめのものは,WebファイルがCGIファイルを見つけられなかったことによる.その原因としては,スクリプトファイルの位置が間違っている(ス クリプトファイルを間違ったディレクトリに保存した)か,ディレクトリ自体に読み取り属性・実行属性をつけ忘れたかが考えられる.読み取り属性・実行属性 についてはファイルシステムのテキストを参照すること.

そのほか,スクリプトファイルの記述内容が間違っていることを示すエラーが表示されることもある.その場合には,スクリプトファイル内の行番号を確認すること.その行もしくはその前後に間違いが潜んでいる.

課題に対するスクリプトファイルの記述で,よく間違われるのがifコマンドである.

if [ $(変数名) -eq 1 ] ; then

「[」や「-eq」の前後に空白文字が必ず必要である.

CGIスクリプトをデバッグ用に書き換えてみる

ここまで試してきて,手がかりが得られないようならば,スクリプトをデバッグ用に書き換えてみる必要がある.

例えば,次のようにある変数を設定している部分があったとする.

(変数名)=(なにかコマンドなど)

その行の次に,次のように変数を表示するようなコマンドを一行追加してみることが考えられる.

echo $(変数名)

これでその変数を表示できる.正しく値が設定されているかどうか確認すれば,その行,あるいはそれまでにバグがないかどうか確認できる.

あるいは,スクリプトの一部をコメント化してしまい.部分部分でデバッグすることも方法の一つである.例えば

#!/bin/sh
echo ....
echo

read param

.....

# スクリプトの後半部分
# ←行頭が#だとコメントと解釈される
#

のように,後半部分の行頭に「#」を追加して,後半部分をコメントとしてしまい,その結果スクリプトの前半だけを実行するように書き換えてしまうのである.これにより,まず前半部分だけでも正しく動作するかどうか確認するのである.

もしも前半部分が動作するならば,問題は後半部分に間違いがあることがわかる.このように,部分部分を実行してみて,少しずつ段階的にバグの位置を特定する方法がよく用いられる.

最後に,首尾よくバグの位置が特定され修正できた後は,当然のことながらデバッグ作業のために書き換えた部分は元に戻したり削除しておく必要がある.