ステップオーバーでプログラムの流れを確認
8.2 ステップオーバーでプログラムの流れを確認
プログラムが作成できたら、Eclipseのデバッグ機能を使い、意図した通りに処理が行われているかどうかの確認を行ってみましょう。
Eclipseのデバッグ機能を使うと、プログラムの途中で処理を止め、そこからソースコードを1ステップずつ実行し、記述した処理の流れを追うことができます。それによって、意図しない動作を引き起こしていないかどうかを知ることができます。
8.2.1 デバッグのための準備
Eclipseのデバッグを行うには、まず、デバッグパースペクティブへの切り替えをします。
Eclipseのパースペクティブとは
パースペクティブとは、それぞれの目的に合ったビューの画面配置のことです。
デバッグパースペクティブには、デバッグに必要なビューが配置されています。Javaパースペクティブは、Javaでコーディングを行う際に使います。
1. Eclipseの右上の部分にある、「デバッグ」という項目をクリック
図 8.2.1: デバッグパースペクティブへの変更
Eclipseに「デバッグ」が表示されていない場合
「パースペクティブを開く」アイコンをクリックします。
項目の中から「デバッグ」をクリックします。
※環境により、「その他」を選択した後に「デバッグ」をクリックする場合もあります。
2. 「デバッグパースペクティブ」に切り替わったことを確認
※ 「デバッグパースペクティブ」に切り換えた後、下の図と配置が異なる場合は、以下の手順で初期配置のデバッグパースペクティブへ変更してください。
ウィンドウ > パースペクティブのリセット
確認メッセージが出るので、「OK」を押してください。
図 8.2.2:デバッグパースペクティブ
① デバッグビュー
現在デバッグを行っているプログラムの状況を表示します。
② 変数ビュー
現在存在している変数やその値を表示します。
③ ソースコードエディタ
ソースコードを表示します。ブレークポイントのマーク、実行中断中やステップ中であればそれを表すマーク等も表示されます。
④ アウトラインビュー
現在ソースコードビューでエディターで開かれているJavaソースファイルのクラスやフィールド変数等をツリー形式で表示します。
⑤ コンソールビュー
プログラムから出力される文字列を表示します。
8.2.2 ステップオーバーを使ったデバッグ
Eclipseのデバッグでは、ブレークポイントという箇所を設定し、そこでプログラムを一時中断することができます。その中断箇所から、ステップオーバーというコマンドを使い、現在アクティブになっているプログラムを1ステップずつ実行することができます。この流れを確認していきましょう。
1. Javaパースペクティブへの変更
まずは、一旦Javaパースペクティブへ戻しておきます。Eclipse右上の「Java」をクリックして下さい。
図 8.2.3:Javaパースペクティブへの変更
確認メッセージが出るので、「OK」を押して下さい。
図 8.2.4:Javaパースペクティブ
① パッケージ・エクスプローラービュー
ワークスペース内のプロジェクトとその内容を表示します。
② ソースコードエディタ
ソースコードを表示します。ブレークポイントのマーク、プログラムの実行中断中やステップ中であればそれを表すマーク等も表示されます。
③ アウトラインビュー
現在ソースコードビューでエディターで開かれているJavaソースファイルのクラスやフィールド変数等をツリー形式で表示します。
④ コンソールビュー等
コンソールビューには、プログラムから出力される文字列を表示します。問題ビューには、プログラム上で起こっているコンパイルエラー等のエラーメッセージを表示します。
パースペクティブのカスタマイズ
パースペクティブは、比較的自由にレイアウトを変更することができます。そのため、テキストで示している初期の画面構成を意図せず崩してしまうことがあります。その場合は、次の手順で元に戻して下さい。
・ テキストとビューやエディタの位置が違う場合:
ビューをドラッグ&ドロップすることで位置を変更することが出来ます。大きさも自由に変えることができます。
・ テキストに載っているビューやエディタがない場合:
(画面上部メニューの)ウィンドウ > ビューの表示 > (表示させたいビュー) を選択して下さい。
下図は、例としてアウトラインビューを表示する場合です。
2. ブレークポイントの設定
次に、ブレークポイントの設定を行ないます。今回は、ソースコードの14行目にブレークポイントを設定してください。
ブレークポイントは、行番号をダブルクリックすることで設定できます。
ブレークポイントが設定された行には、青い丸印が付きます。
図 8.2.5:14行目にブレークポイント設定
デバッグパースペクティブでもブレークポイントの設定は可能
デバッグパースペクティブのソースコードエディタとJavaパースペクティブのソースコードエディタは全く同じものです。どちらでも、同じようにブレークポイントの設定が可能です。ここでは、プログラム作成途中でのデバッグの開始を想定し、一旦Javaパースペクティブに戻しています。
3. デバッグの開始
次に、デバッグを開始していきます。
DebugTest.javaを右クリック > デバッグ > Javaアプリケーション
図 8.2.6:デバッグの開始
もし、下のような画面が開いた場合は、「はい」を選択してください。デバッグパースペクティブが開きます。
※デバッグを開始する時に、自動でデバッグパースペクティブに切り替わるようにするには、「常にこの設定を使用する」にチェックを入れて下さい。
図 8.2.7:デバッグパースペクティブへの切り替えの確認
このウィンドウが開かなかった場合は、既にデバッグパースペクティブに自動で切り替わっていることが考えられます。その場合は問題ありませんので、そのまま次の手順へ進んで下さい。
もし、ウィンドウが開かず、なおかつデバッグパースペクティブに切り替わらない場合は、ブレークポイントの設定がされていない可能性があります。
ブレークポイントの設定がされているかどうかを確認しましょう。
デバッグの開始にはブレークポイントの設定が必要
ブレークポイントを設定していない状態では、デバッグは開始されません。通常の実行としてプログラムが開始されます。
4. ブレークポイントでのプログラム一時中断を確認
左上のデバッグビューを見ると、14行目のブレークポイントでブログラムの実行が一時中断していることが分かります。
図 8.2.8: 14行目で実行中断中
ソースコードエディタでは、ブレークポイントを示す青い丸印に矢印が重なり、現在中断している14行目がハイライトされています。14行目が実行される直前で停止しています。
図 8.2.9:14行目のブレークポイントでプログラムの実行中断中
5. ステップオーバーでのプログラムの実行
続いて、ステップオーバーを実行して、14行目からプログラムを1ステップ実行し、プログラムの動きを確認します。このとき、変数に代入されている値も見ることができます。
では、デバッグビューのツールバーにある、「ステップオーバー」をクリックしてください。
図 8.2.10: ステップオーバーアイコン
すると、プログラムは、17行目が実行される直前で停止します。つまり、14行目と15行目は既に実行されたことになります。
図 8.2.11: 17行目で停止
では、右上の変数ビューを見てみましょう。そこには、14行目で作成した変数randomNumが表示されています。Mathクラスのrandomメソッドを利用して作成した値は、今回の場合は「3」だったことがわかります。
図 8.2.12: 変数ビューでの変数に代入されている値の確認
変数が変数ビューに表示される条件
変数ビューに表示される変数は、実行中のその時点で有効な変数に限られます。
例えば、このDebugTestプログラムにはint型の変数randomNum、int型の変数playerNum、int型の変数i等の変数の宣言が書かれていますが、図 8.2.12の変数ビューで表示されているのはその内の一部のみで、これらは、17行目が実行される直前で停止している時点で有効な変数です。変数playerNumは、15行目で宣言がされているもののこの時点では初期化がされていないので表示されません。
6. 入力待ちの状態を確認
もう一度ステップオーバーをクリックすると、今度は18行目で停止します。
図 8.2.13: 18行目で実行中断中
図 8.2.14:中断中のソースコード18行目
18行目で停止しているということは、18行目が実行される直前であるということなので、コンソールビューには17行目の実行結果が表示されます。
図 8.2.13: 18行目で実行中断中
もう一度ステップオーバーをクリックしてください。
18行目のreadIntメソッドが実行され、ユーザーの入力待ち状態になりました。まだステップが完了しない状態なので、ステップ中と表示されます。
図 8.2.13: 18行目で実行中断中
先ほどの変数ビューで確認したrandomNumと同じ値、つまり「当たり」になる数字「3」を入力し、Enterを押して先に進みましょう。
図 8.2.17: キーボードから値を入力
7. 入力した数字が変数に代入されていることの確認
変数ビューを見ると、入力した数字が 変数playerNum に正しく代入されていることが確認できます。
図 8.2.18: 入力された値が変数に代入されていることを確認
8. 正常に結果が表示されることの確認
このとき、21行目のif条件文が実行される直前で停止しています。
図 8.2.19: 21行目で中断中のソースコード
ステップオーバーをクリックすると、21行目の条件文がtrueなので、そのままif条件文の中に入り、22行目が実行される直前で停止します。この時点ではまだ22行目が実行されていないので、「【当たり】」という文字列は表示されません。
図 8.2.20: 22行目で中断中のソースコード
さらにステップオーバーで進めます。22行目が実行され、else文を飛ばして26行目で停止します。
図 8.2.21: 26行目で中断中のソースコード
コンソールに22行目が実行された結果が表示されたことを確認してください。
図 8.2.22: 26行目で中断中の状態の実行画面
このように、Eclipseのデバッグでは、ブレークポイントを設定し、ステップオーバーというコマンドを使って、現在のアクティブになっているプログラムを1ステップずつ実行することができます。この基本的な流れを理解できるようになりましょう。
ステップオーバーによるプログラムの終了
ステップオーバーを利用してプログラムの最後の行が終了すると「Thread.class」がソースコードエディタに表示されます。このクラスはJavaが提供しているクラスで、プログラムを終了する処理を行なっています。自身で作成したソースコードのデバッグとは関係がありませんのでP81のコラム「デバッグの停止」を参考にデバッグを停止して下さい。
8.2.3 ステップオーバーと再開を組み合わせたデバッグ
前項では、ブレークポイントを設定し、そこで一旦プログラムを中断した後にステップオーバーを使って、プログラムの流れを追っていきました。
次は、ステップオーバーと「再開」というものを組み合わせて使っていきます。これによって、複数のブレークポイントを設定して効率よくデバッグを行うことができます。
複数のブレークポイントを指定した場合、長いプログラムだと、ステップオーバーだけで進めていくのは非常に手間がかかる場合があります。しかし、「再開」を利用すると、デバッグの必要がないところは一気に実行して進めてくれるので、効率よくデバッグを行なうことができます。
では、もう一度先ほどと同じプログラムを使って、デバッグを行っていきます。一旦Javaパースペクティブへ戻して下さい。
1. ブレークポイントの設定
まず、14行目と18行目にそれぞれブレークポイントを設定してください。
図 8.2.23: ブレークポイントの挿入
2. デバッグの開始
DebugTestプログラムのデバッグを開始します。
3. int型の変数randomNumの値を確認
14行目でプログラムの実行が中断されたら、ステップオーバーを使い、変数randomNumの生成とその値を確認します。ここでは、ランダムで生成された値は0です。
図 8.2.24: 14行目で実行中断時の変数ビュー
4. 「再開」し、次のブレークポイントで中断することを確認
続いて、「再開」を行ないます。デバッグビューの「再開アイコン」を押下してください。これによって、次のブレークポイントまでプログラムを一気に実行します。
※このプログラムは短いので1行しか進みませんが、再開を押すと次のブレークポイントまたはプログラムの最後に達するまで一気に実行されます。
図 8.2.25: 再開アイコン
5. int型の変数playerNumの値を確認
そうすると、18行目でプログラムの実行が中断されます。
図 8.2.26: 18行目で実行中断
ステップオーバーを使って18行目を実行し、コンソールビューへ正解の数値である変数randomNumの値を入力します。変数playerNumの生成とその値を確認します。
図 8.2.27: 18行目でステップ中のソースコード
図 8.2.28: キーボード入力がされ18行目実行後のコンソールビュー
図 8.2.29: 18行目実行後の変数ビュー
6. if – else文の処理を確認
さらにステップオーバーを行い、21行目から始まるif – else文で処理がどうなるのかを確認して下さい。
図 8.2.30: 21行目で実行中断中
このように、複数のブレークポイントを設定した場合は、再開とステップオーバーを組み合わせて利用することで、効率よくデバッグを行うことができます。
デバッグの停止
デバッグを停止したい場合は、「停止」アイコンを押します。プログラムをデバッグ中のままで放置しておくと、実行中のプログラムがたまり、PCの処理速度が低下することがあります。
デバッグを行う際は、プログラムが終了するまで続けるか、「停止」アイコンを押してそのプログラムを終了させるようにしましょう。