デバッガの使い方

この節の要点

  • プログラムを実行しながら、処理を一時停止し変数内のデータなどを確認することができるデバッグ支援のソフトウェアをデバッガと呼ぶ。
  • デバッガでプログラムを一時停止させるためには、ブレークポイントをソースコード中に設定してあげる必要がある。
  • デバッガでのデバッグ時に、現在の行を実行して次の行に進む手続きをステップオーバー、現在の行のメソッド内に進む手続きをステップイン、そして現在の行があるメソッドの呼び出し元に戻る手続きをステップアウトと呼ぶ。
  • ブレークポイントを使って一時停止させている時、変数タブに現在使われている変数が持つ値が表示される。

デバッガ(Debugger)とは、デバッグ作業を補助するソフトウェアです。具体的には、プログラムを指定した箇所で一時的に停止させ、その際にプログラム内で利用している変数の中身を確認することができます。このデバッガを使い処理の途中で変数がどのような値となるか適宜確認することで、大規模であったり複雑なプログラムの修正を効率的に行うことができるようになります。

C言語などでは、GDBと呼ばれるターミナルで実行できるコンソールデバッガなどがあります。統合開発環境(IDE)には、先に示したコード補完だけでなく、こうしたデバッガももちろん含まれています。

以降では、NetBeansのデバッガの利用例を示していきます。

図11のプログラムを実行してみましょう。このプログラムは指定された範囲で指定された数だけの目盛りを作成することを意図しています。


public static double[] createAxis(int n, double min, double max) {

	double tick = (max - min) / n;

	double[] axisdata = new double[n + 1];

	int tickcnt = 0;
	for (double x = min; x < max; x = x + tick)
	{
		axisdata[tickcnt] = x;
		tickcnt++;
	}
	axisdata[tickcnt] = max;

	return axisdata;
}
図11:minからmaxまでをn等分した目盛りデータが格納された浮動小数点型配列を返却するcreateAxisクラスメソッド
double[] arr = createAxis(5, 1.0, 20.0);

ArrayPrinter.printDouble(arr);
図12:createAxisクラスメソッドの利用例

なお、createAxisクラスメソッドとmainメソッドは同じクラスが持ちます(図11、図12)。 ここで、図12の1行目を図13のように改変してcreateAxisメソッドを利用してみるとします。すると図14に示すように、例外ArrayIndexOutOfRangeExceptionが発生してしまいました。

double[] arr = createAxis(10, 1.0, 20.0);
図13:ArrayIndexOutOfRangeExceptionが投げられる場合

ArrayIndexOutOfRangeException発生時の出力タブ

図14:ArrayIndexOutOfRangeException発生時の出力タブ

この例外が発生した理由をデバッガを使って見ていきましょう。

デバッガを起動するためには、メニューバーからデバッグ(D) > プロジェクト()をデバッグ(D)を選択するか、ツールバーの緑三角ボタンであるプロジェクト実行アイコンの右隣のアイコン(図15)を押すことで、プロジェクトペインで選択しているプロジェクトをデバッグすることができます。

ツールバー上のデバッグ開始アイコン

図15:ツールバー上のデバッグ開始アイコン

ただ、このままデバッグを実行しても、普通にプログラムが実行され、終了するだけです。デバッグをするためには、 ブレークポイント(breakpoint) を設定する必要があります。

ブレークポイント とは、デバッグで一時停止させる地点のことです。ブレークポイントを設定して、デバッガを起動すると設定されたブレークポイントの命令を実行する直前で、プログラムが一時停止します。

例えば、先に述べたmainメソッド中のcreateAxisメソッドを呼び出す際にブレークポイントを設定してみたいと思います。

ここで、エディタペインの左端に行数が表示されていますが、ブレークポイントを設定したい行数をクリックすると、 赤四角が表示され、行背景が赤色に強調されます (図16)。赤色に強調された行は、ブレークポイントが設定されていることを示しています。ブレークポイントを削除したい場合は、もう一度クリックすることで削除することができます。

行番号上でのブレークポイント指定

図16:行番号上でのブレークポイント指定

この状態で、デバッガを起動してみましょう。すると図17に示すように、行数の代わりに緑矢印が表示され、エディタペインの行背景が緑色に変化し、プログラムが一時停止した状態で、出力タブと同じペインに変数タブが現れ、変数タブが表示されます。

デバッグで一時停止中

図17:デバッグで一時停止中

緑色に強調された行が、現在実行せずに一時停止している命令 になります。 ここで、この変数タブには、その時点でプログラムで定義されている変数名とその変数が持つ値が表示されます。 この変数タブを使うことで、先のprintfデバッグのような変数の標準出力への表示をすることなく(またそのためのコード改変をする必要もなく)、容易にデバッグ出来ます。

なお、ブレークポイントはデバッガ実行中であっても、設定・削除を自由にすることができます。

一時停止させた状態で、デバッガを終了させたい場合はツールバーにある、 赤四角のデバッガ・セッションを終了アイコンを選択することでデバッグ終了します (図18)。

また、一時停止させた状態で、次のブレークポイントまで実行させたい場合はツールバーにある、 緑丸の続行アイコンを選択することで一時停止していたプログラムを再起動できます (図18)。

ツールバーにあるデバッグで利用するアイコン

図18:ツールバーにあるデバッグで利用するアイコン

デバッガの機能は、このようなブレークポイントごとのデバッグのみではなく、 ステップ実行 することで、ブレークポイントを起点とした各命令実行時の変数の状態を確認できます。

ステップとは命令呼び出しの1単位を表します。この場合、ソースコードの命令1行が1ステップに相当します。ステップ実行とは、1ステップ実行し一時停止させるデバッグの実行方法です。

ステップ実行には、大まかに分けて、 ステップオーバー 、 ステップイン 、 ステップアウト の3つの方法があります。

ステップオーバー とは、現在の命令を実行し、単純にソースコード上でテキスト空間的に隣接している次の1命令に移動して一時停止させます。すなわち、デバッガで一時停止している状態で、一時停止している命令がメソッド呼び出しであったとしても、ステップオーバーすると、メソッド呼び出しを行いその返り値を取得した後、そのメソッドの次の命令を実行する前で一時停止させます。ステップオーバーするためには図19のアイコンをクリックします。

ステップオーバーのアイコン

図19:ツールバーにあるステップオーバーのアイコン

ステップイン とは、プログラム的に次に実行される命令で一時停止させます。つまり、デバッガで一時停止している状態で、一時停止している命令がメソッド呼び出しであれば、ステップインすると、その呼び出したメソッド内の最初の命令で一時停止させます。ステップインするためには図20のアイコンをクリックします。

ステップインのアイコン

図20:ツールバーにあるステップインのアイコン

ステップアウト とは、現在一時停止している命令が属しているメソッドを最後まで実行し、呼び出し元でその返り値を取得させた後、次の命令を実行する前で一時停止させます。ステップアウトするためには図21のアイコンをクリックします。

ステップアウトのアイコン

図21:ツールバーにあるステップアウトのアイコン

例えば、図17に示すcreateAxisクラスメソッドを実行する前で一時停止している状態から、ステップインしてみましょう。すると、図22のように、createAxisクラスメソッド中の先頭の命令行が緑背景になっていることがわかります。

図17の状態からステップイン

図22:図17の状態からステップイン

このとき、まだ緑背景の命令は実行されていません。現時点での、変数の割り当て状況を確認してみましょう。図22の変数タブを見ると、メソッドの引数に何が割り当てられたかが表示されています。ここで、ステップオーバー1回行うと、1ステップ移動します。ステップオーバーを使うことで細かく移動することができますが、目的の命令まで複数回選択することは面倒です。したがって、ブレークポイントをもう1つ設定してみましょう。今回は、for文の最初の命令の箇所にブレークポイントを設定してみます(図23)。

デバッグ実行中に別ブレークポイントを設定

図23:デバッグ実行中に別ブレークポイントを設定

図23のようにブレークポイントを設定した後、続行アイコンを押すと、一気に次のブレークポイントまで実行がなされます。

ここで、デバッグの注意点ですが、 ソースコードを変更する際には、必ず、デバッガセッションを終了アイコンを選択するなどしてデバッガを終了させておく 必要があるので注意してください。

以上のように、ステップ実行とブレークポイントを使いこなすことで、デバッグを効率的に進めることができます。