目次 >> 第6章 デバッグ

第6章 デバッグ

| 前の章 | 次の章 |

 この章は、BlueJのデバッグ機能の中で、もっとも重要な面を紹介するものです。コンピュータ関係の教師たちと話す中で、わたしたちは頻繁に、教える最初の年でデバッガを使うのが良いのだけれども、それを導入するための時間がないと聞きました。学生たちは、エディタやコンパイラ、プログラムの実行と格闘します。他の複雑なツールを導入する時間などないのです。
 それが、わたしたちがデバッガをできるかぎりシンプルにすると決めた理由です。目標は、あなたが15分で説明できて、学生がそれ以上の指示なしですぐに使えるデバッガを持つことです。では成功したかどうか、見ることにしましょう。
 まず第一に、わたしたちは伝統的なデバッガの機能を3つに減らしました。

 3つの作業のいずれも非常に簡単です。そのひとつひとつを試しましょう。
 始めるには、debugdemoプロジェクトを開いてください、これは配布ファイル中の examples ディレクトリに含まれています。このプロジェクトは、デバッガ機能を実演するという唯一の目的――さもなければ多くの意味をなしません――のために、二、三のクラスを含んでいます。

第1節 ブレークポイントの設定

 ブレークポイントを設定することで、ソースコードの特定箇所で実行を中断できます。実行が中断されている間、オブジェクトの状態を調べることができます。これはしばしば、ソースコードにおいて何が起こっているかをあなたが理解するのを助けます。
 エディタには、テキストの左側にブレークポイント領域があります(図13)。そこをクリックすることでブレークポイントを設定することができます。ブレークポイントを示すために、小さな STOP マークが現われます。試してみてください。Demoクラスを開き、loopメソッドを見つけてください。そしてループのどこかにブレークポイントを設定してください。エディタに STOP マークが現われるでしょう。

図13:ブレークポイント

 ブレークポイントを設定したコードに達したとき、実行は中断されるでしょう。試してみてください。
 Demoクラスのオブジェクトを生成し、たとえばパラメータを10としてloopメソッドを呼びます。ブレークポイントに達するとすぐ、エディタウインドウがポップアップ表示され、コードの現在行を示します。そしてデバッガウインドウがポップアップします。それは図14のように見えることでしょう。[訳注]

図14:デバッガウインドウ

[訳注]
ここでは原文のマニュアルにあった画像を模倣したため、STOPマークと、現在行を示す矢印&ハイライト表示が違う行になっています。しかし実際は、STOPマークと矢印とが重なった状態で実行が中断します。つまりブレークポイント設定行が実行される前に一時停止するのです。

 エディタにおけるハイライト表示は、次に実行される行を示します(この行が実行される前に、実行が中断されるのです)。

要約:ブレークポイントを設定するには、エディタのテキストの左にあるブレークポイント領域をクリックします。

第2節 コードのステップ実行

 実行を中断し、コードを一行ずつ実行し、処理がどのように進むかを見ることができます(これはメソッドが本当に実行され、そしてこの地点にそのコードが本当に辿りついたかどうかを検証します)。そのためには、デバッガウインドウで繰り返し Step ボタンをクリックします。あなたはエディタのソース行が変化するのを見るでしょう(ハイライト表示が、ソース行の実行に合わせて移動します)。Step ボタンをクリックするときはいつでも、コードが一行だけが実行され、再び中断されます。デバッガウインドウで、変数の値が表示されている注釈も変わります(たとえばsumの値)。したがって、一行一行実行して、起きたことを観察することができるのです。いったんこれに疲れたなら、再度ブレークポイントをクリックして削除し、それからデバッガの Continue をクリックすることで、実行を再開し、通常どおり続けることができます。
 別のメソッドで、再び試してみましょう。DemoクラスのcarTest()メソッドにある次の行にブレークポイントを設定してください。

  places = myCar.seats();

 メソッドを呼んでください。ブレークポイントが検証される時には、ちょうど、Carクラスのseats()メソッドを呼び出すために、そのメソッドを含む行を実行しかかっています。Step をクリックすることは、その全行を飛び越すことです。今回は Step Into を試してみましょう。Step Into でメソッドを呼び出すなら、そのメソッドの中に入って、メソッド自身の(一行としてではない)行を実行します。この場合、あなたはCarクラスのseats()メソッドの内部に導かれます。コードの終端に達し、呼び出し側のメソッドに戻るまで、快適にステップ実行することができます。どのようにデバッガの表示が変わるかに注意していてください。
 StepStep into は、現在行がメソッド呼び出しを含んでいないのなら、同様にふるまいます。

要約:コードを一行単位で実行するには、デバッガで、Step ボタンや Step into ボタンを使います。

第3節 変数の検証

 自分のコードをデバッグするとき、オブジェクト(ローカル変数やインスタンス変数)の状態を検査できることは重要です。
 これをやるのは些細なことです。既にそのほとんどを見てしまっています。変数を検査するために特別なコマンドはいりません。実行中のオブジェクトのインスタンス変数と、実行中のメソッドのローカル変数は、いつも自動的に表示され更新されます。
 他の、現在アクティブであるオブジェクトとメソッドの変数を見るために、連続呼び出しという方法を選択することができます。たとえばcarTest()メソッドのブレークポイントを再び試してみてください。デバッガウインドウの左側に、呼び出し系列があります。それは既に表示されています。

  Car.seats
  Demo.carTest

 これはCar.seatsが、Demo.carTestによって呼ばれたことを示しています。ソースと、このメソッドの現在の変数の値を検査するために、このリストからDemo.carTestを選択することができます。
 コンストラクタnew Car(...)を含む行を通過すると、ローカル変数myCarの値が<object reference>として示されることに気づくでしょう。Stringを除くオブジェクト型のすべての値が、このように示されます。それをダブルクリックすれば、この変数を検査することができます。そして前に説明した(第5章の第1節)のと同じオブジェクト検査ウインドウが開きます。ここでオブジェクトを検査することと、オブジェクトベンチでオブジェクトを検査することとは、どのような違いもありません。

要約:変数の検査は簡単です。それらはデバッガで自動的に表示されます。

第4節 一時停止と終了

 時々、プログラムが長時間実行中であると、あなたはすべてが順調なのか疑問になってきます。おそらく無限ループがあることでしょう。だから長い時間が費やされているのです。さて、わたしたちはチェックすることができます。Demoクラスのlongloop()メソッドを呼んでください。これはしばらく実行されています。
 何がどうなっているのか知ることにしましょう。デバッガウインドウを見てください。まだ画面の上になければ開いてください(ところで、マシンが実行の間動いていることを示すturningマークをクリックすることは、デバッガウインドウを開くための近道でもあります)。
 今度は Halt ボタンをクリックします。ブレークポイントを設定していたかのように、実行が中断されます。あなたは二、三の段階を踏んで、変数を観察し、それらが順調であるかを見ることができます。完了するまでに多少の時間が必要ですが。数回の ContinueHalt で、それがどれほど速く数えられているかを見ることができます。先に進むのをやめるには(たとえば本当に無限ループに入っていると気づいたときなど)、Terminate をクリックすることで、全体の実行を終わらせることができます。Terminate は頻繁に使うものではありません。JavaVMを終了して、矛盾した状態にある素晴らしく良く書かれたオブジェクトから抜け出すことができるのですから、緊急事態が起きたときのためだけに使われるべきです。

要約:HaltTerminate は、実行を一時的もしくは永久に止めるために使うことができます。