Perl/CGI研究室 'PERL-LABO'

Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

デバッグの基本

研究内容

デバッグ(エラーを直すこと)をするときにとても重要なことを学びます。

詳細

プログラムにはエラーがつきものです

CGIプログラムを作り始めて、とりあえずとても簡単なCGIプログラムを動かすことができて、 さぁこれから!という感じですね。でも、ここからが大変です。 というのは、いつもすんなりCGIプログラムが動いてくれるとは限らないです。 プログラムにはエラーがつきもの。 それも、ちょっとしたタイプミスによるエラーとか、よく起きます。 悲しいことに、1文字打ち間違えただけでも、動きません。 そこで、エラーの直し方の基礎知識を学んでおきましょう。

エラーが起きたときのメッセージ

一番多いエラーはやっぱり入力ミスによるエラーだと思います。 そこで、実際に、入力ミスしてるCGIプログラムを実行して、 どうなるか試してみましょう! 次のプログラムを実行してみます。

#!/usr/bin/perl

print "Content-type: text/html\n"
print "\n";
print "Hello World!";
このCGIプログラムを実行します! (別窓が開きます)

「Internal Server Error うんぬん…」って出ましたね。 これ、サーバーによって表示される内容が違うこともあるようなのですが、 要するにCGIプログラムが間違ってますよっていう意味です。 たぶん、これから、この画面を何度も見ることになります (^^;

さて、上のCGIプログラム、間違っているらしいです。どこが間違っているか分かりますか? よーく見ると、1つ目の print 文の最後の ; を付けるのを忘れてます! Perl では、; で命令の終わりを表します。; が無いと、次の行までまとめて1つの命令だと 考えてしまうんです。そうすると、print "〜" print "〜"; っていう命令だと考えて、 これを実行しようとするんですが、Perl インタプリタさんは、「なにコレ?なんかよくわかんない!」と 実行をあきらめちゃいます。融通がききませんよね。; を忘れたんだってことくらい、 分かってくれよ!という感じですが…ダメです。で、 「Internal Server Error うんぬん…」になっちゃいます。

このように、たった1文字の ; を忘れただけでCGIプログラムは動かなくなってしまいます。 しかも、画面には「Internal Server Error うんぬん…」と出るだけで、どこが悪かったのか、 教えてくれません。これじゃ、直さなきゃいけないことは分かっても、 どこを直したらいいのか分からないですよね? 上のプログラムは短いので、1行ずつ見ていけば ; を付け忘れてることを見つけることが できますが、もっと長いCGIプログラムだったりすると、全部1行1行見ていくなんて 大変すぎますよね。それで、もういいや!ってCGIプログラムをやめちゃったりっていう人も 今まで沢山いたんじゃないかなぁ…。

でも大丈夫、安心してください! とてもいい方法があるんです!

エラーが起きたとき、ヒントをブラウザの画面に表示する方法

問題は、エラーが起きた時に、どこが間違っていたのかっていうヒントが なんにもないことですよね。どこでエラーになったのかっていうことが 分かればそのまわりをチェックすればいいですが、それもありません。 逆に、このヒントがあれば、タイプミスのエラーを直すのは難しくないです。

で、このヒントを画面に表示させる方法ですが、次の1行を、 1行目のアレの直後とかに足します。

use CGI::Carp qw(fatalsToBrowser);

簡単ですね!これだけです。 これがどういう意味なのかっていうことは、知る必要はまったくありません。 私もまだ分かっていません (^^; それはいつか研究することにしましょう。 では、これをCGIプログラムに足すとどうなるのか実験してみましょう。 先ほどのエラーが出るプログラムに、この1行を足してみましょう。

#!/usr/bin/perl

use CGI::Carp qw(fatalsToBrowser);

print "Content-type: text/html\n"
print "\n";
print "Hello World!";
このCGIプログラムを実行します! (別窓が開きます)

今度は、「Software error うんぬん…」って出てきました。 よく見ると、英語ですが、次のように書いてあります。 「syntax error at error2.cgi line 6, near "print"」 error はエラーでしょ。error2.cgi はこのCGIプログラムのファイル名です。 line 6 っていうのは、6 行目っていう意味です。near "print" っていうのは、"print" のそばっていう意味です。

ね?エラーがあった行番号と、そのそばの単語が1つ。 これだけでも、なにも情報が無いのと比べたら、全然違います! たとえば、print 文が200個くらいあるプログラムだったら? 1,000個くらいあるプログラムだったら?100,000個くらい…そんなプログラムは無いと思うけど、 何行目でエラーが出ましたっていう情報があれば、プログラムの大きさに関係なく、 エラーが起きた場所を探すのは簡単です!

これ、とても大切です。 CGIプログラムに挑戦する方、この知識は必ず役に立ちますよ! 「Internal Server Error …」が出て、どこが間違っているのか分からなかったら、 この記事のことを思い出してくださいね!

メモ帳で指定した行番号へジャンプする方法

私はメモ帳でプログラムを打ち込んでいるんですが、 WindowsXPのメモ帳の場合、メニューの [編集]-[行へ移動] を使えば、 指定した行番号の行にジャンプできます。 ただし、[書式]-[右端で折り返す] がオフじゃないとダメみたいなので注意しましょう。

実は私、これ知りませんでした

この記事、Perl/CGIプログラミングを始めるなら最初に知っておくべき内容なのですが、 実は私、これ知りませんでした…。 当サイトの研究記事の58番目になります。 このサイトを立ち上げてからだいぶ時間が経っていますし、 結構いろんな研究をしてきました。 その間、何度も何度もエラーが出ました。 でも、いつも「Internal Server Error うんぬん…」で、 どこが間違っているのか分からず、さっきまで動いてたのに… どこを変えたっけ…どこが間違ってるの…これ…ここ…あれ…どこ…あ…これこれ! という感じで、それはもう、エラーを修正する作業、大変でした (^^; その分、苦労して作ったCGIプログラムが動いた時の感動は大きかったと思いますが、 でももっと早く知っていたら楽ができたのに〜と心底思います (^^;

分かったこと

  1. use CGI::Carp qw(fatalsToBrowser); という1行を足すとエラー内容がブラウザに表示されます。
Perl/CGI研究室 'PERL-LABO' TOPへ
戻る(History.Back)

Copyright (c) 'PERL-LABO' All Rights Reserved.  リンクフリーです。