Javaの開発を行っていて、自分では正しくコーディングしたつもりでも実行結果が想定と異なる場合ありますよね?

そのような場合、ステップごとにSystem.out.printlnで各行の変数を出力して不具合の原因を確認。そして不具合を修正したらSystem.out.printlnを消したりしていませんか?

そのようなわずらわしい作業をなくしてくれるのがデバッグです。

大体どのようなIDE(統合開発環境)でもデバッグ機能を持っていますが、本記事ではEclipseを使ったデバッグ方法を解説します。

デバッグをするには?

デバッグするには、どこでプログラムの実行を一時停止したいかを示すブレークポイントを設定します。

青丸がブレークポイントです。

Eclipseでは、行番号が表示されている横の余白をダブルクリックすることでブレークポイントを指定できます。逆に、ブレークポイントを外す場合は、青丸をダブルクリックで外すことができます。

ブレークポイントを設定したら、プログラムを実行します。ただし、通常に実行してしまうとブレークポイントでは止まりません。デバッグモードでプログラムを実行する必要があります。

デバッグモードでプログラムを実行

Javaアプリケーションを実行するにはmainメソッドが記述されたクラスを以下の方法で実行しましたが、デバッグモードで実行するには実行ではなくデバッグを選択します。代表的なデバッグ方法を2つ紹介します。

クラスを開いてツールバーのデバッグボタンを押す

クラスを開き、選択した状態でツールバーの実行ボタンの横に有る虫のマーク(下図の赤枠)をクリック

クラスを選択して右クリック、デバッグを選択

パッケージエクスプローラからJavaクラスを選択し、右クリック -> デバッグ -> Javaアプリケーションを選択

デバッグ実行

初めてデバッグ実行すると下図のような画面画表示されます。

『デバッグ実行すると画面の表示が切り替わるよ』というお知らせです。デバッグの都度表示されるのも面倒なので「常にこの設定を使用する」にチェックを入れて「はい」を選択しましょう。

すると、画面が切り替わります。

図だと7行目にブレークポイントを置いたので7行目の色が変わっていて、ここで実行が止まっていることが分かります。

デバッグツールの使い方

デバッグし目的の場所で実行を停止させることまで学びました。次は、変数の値を見る方法と、デバッグ実行の方法を説明します。

変数の値を確認する方法

変数の値を確認するには2つの方法があります。値の確認だけであればどちらの方法でも構いません。

インスペクションで確認

ソース中の変数を選択した状態で、「右クリック -> インスペクション」を実行。

デバッグパースペクティブの「変数」タブで確認

デバッグパースペクティブに切り替わって、デフォルト状態だと右上に表示される画面があります。その中で変数タブを選択すると、変数の情報を確認することができます。

デバッグの実行制御

デバッグ実行したまま、次のステップへ進める方法、デバッグを終了する方法などを説明します。ツールバーにあるボタン又はショートカットを利用し制御します。

 用語 アイコンショートカット意味
再開 F8次のブレークポイントまで進める
終了 Ctrl+F2処理を中断しアプリケーションを終了させる
ステップインF5他メソッドを呼び出す場合に呼び出し側のメソッドをデバッグする
ステップオーバーF6他メソッドを呼び出す場合でも呼び出し側のメソッドはデバッグをスキップする
ステップ・リターンF7実行中のメソッドの実行を終えて呼び出し元に戻る

再開

この状態で「再開」を実行する。

次のブレークポイントまで処理を進める。

ステップイン

この状態で「ステップイン」を実行する。

呼び出し側のメソッド(Calc.add)をデバッグ実行する。

ステップオーバー

この状態で「ステップオーバー」を実行する。

呼び出し側のメソッド(Calc.add)のデバッグ実行はせず、Mainクラスの次の行が実行される。

ステップ・リターン

この状態で「ステップリ・ターン」を実行する。

呼び出し側のメソッド(Calc.divide)実行を終えて、呼び出し元(Mainクラス)へ戻る。

終わりに

デバッグ実行すると『デバッグのパースペクティブ』に画面が切り替わりました。以前の状態に戻したい場合は画面右上にあるパースペクティグの切り替えを変更すれば元の画面へ戻すことができます。

Eclipseを使ったデバッグ方法を紹介しました。実は今回紹介した機能はデバッグ機能のうち基本となるものだけですが、これさえ押さえておけばまず困らないであろうと言うものに絞りました。応用的な使い方についてはまた別途記事にしたいと思います。