検索

キーワード


【Eclipse 入門】エラーが解決できないときに役立つ!デバッグの使い方

  • 公開日:2021-02-08 11:19:29
  • 最終更新日:2021-02-08 18:00:39
【Eclipse 入門】エラーが解決できないときに役立つ!デバッグの使い方

作成したプログラムを実行してみると、

エラーとなって動かなかった!イメージしていた結果が返ってこなかった…

なんてことがよく起こります。

そういったときはプログラムのどこかに誤字や、

コードに欠陥があるといった小さなミス「バグ」が発生していることが多いです。

バグが発生したら膨大なコードの中からその原因を探らなくてはなりません。

そこで効率良く原因を探る機能として「デバッグ」が用意されています。

エラーがでたら「詰んだ…」と諦めず、デバッグを使って修正箇所を発見しましょう。

この記事を読むことで基本的なバグの探り方について理解を深めることが出来るでしょう。


関連記事リンク:Eclipse 基本的な用語・機能まとめ / パッケージの役割を理解する / クラスの基本まとめ / 変数の基礎を知る

Eclipse入門 デバッグ機能の使い方

プログラミングを学び始めるとプログラマーが必ず出会うことになる「エラー」。

Eclipse を使い初めたばかりだと、赤くて難解な文字群のエラーにビックリするかもしれません。

プログラミングを続けていく上での壁となるエラーですが、

落ち着いてエラー文を見返してみると案外何を言っているのか理解できて解決できたりもします。

しかしエラー文を読んでも解決できないバグが発生するときもあります。

こういったときはコードの動作が意図した形で動いているか、

1つずつチェックしていくことでエラー箇所を特定していきます。

このとき非常に役立つ機能が「デバッグ」というもので、

デバッグの使い方を学べば効率的にエラー箇所の特定が可能となります。

ここではデバッグの基本的な使い方を解説しますので、

プログラミングの壁を1つ乗り越えるきっかけになればと思います。


デバッグとは?

プログラミングのミスなどによって発生したバグを効率よく発見するための機能がデバッグです。

(デバッグを行うプログラム自体のことをデバッガーと呼びます。)

プログラムが動くプロセスを順番に見ていくこともできるためバグの有無に関わらず、

意図した通りにプログラムが動いているかチェックするために使うこともできます。

そのようなことから簡単なプログラムであっても、

1つのプログラムが作れるようになったら身に着けておくべき知識と言えるでしょう。


デバッグ画面の見方

デバッグ機能を使う際、デバッグ用のパースペクティブが開きます。

まずはデバッグ機能の立ち上げ方と各機能の配置から確認しましょう。


パースペクティブが何かわからないという方はこちら。

また以降クラスの作成方法の解説は省略しますので、

わからないという方もこちらをご確認ください。

 Eclipse 基本的な用語・機能まとめ


デバッグの立ち上げ方

デバッグをするには検証用のコードが必要となります。

今回もコードには Java を使ってクラスを作成します。

以下のコードを自身で作ったクラスの中へ書き込みましょう。

 ※パッケージ名・クラス名・変数名は不問です。


先にパッケージが何なのか知りたいという方はこちら。

 パッケージの役割を理解する

クラスって何?という方はこちら。

 クラスの基本まとめ

変数がわからないという方はこちら。

 変数の基礎を知る


package test;

public class Debug {

	public static void main(String[] args) {
		int a =10;
		System.out.println(a);
	}
}

このプログラムに対してデバッグをかけるにはまずチェックしたいコードの行へ印を付けます。

この印のことをブレークポイントと呼び、

ブレークポイントはコードの左端をダブルクリックすることで付与することが出来ます。

誤った場所にブレークポイントを付けた場合は同じ場所をダブルクリックすることで取り除けます。

ブレークポイントの付与

○の付いている部分がブレークポイントです。


デバッグをかけると順番にプログラムが実行されていき、

このブレークポイントへ到達すると処理が一旦ストップします。

こうすることでブレークポイント以降の動作を順に追ったり、

変数に入っている値を確認することができるようになります。


今回は3か所にブレークポイントを付けました。

ただし空白の行や、クラス・メソッドを定義した行などはデバッグ対象外となります。

例えば上記1か所目は mainメソッドの定義となるためブレークポイントは動作せずに、

2か所目のブレークポイントで処理がストップします。


では実際にデバッグのかけ方から見てみましょう。

デバッグをかけたいクラスを右クリックして「デバッグ」から「Java アプリケーション」を選択してください。

デバッグを選択

デバッグ用のパースペクティブへ切り替えるための確認画面ウィンドウが出ます。

今後このウィンドウの表示が不要であれば、下部のチェックボックスへチェックを付けて

「切り替え」を選択しましょう。

デバッグ切り替え確認画面

デバッグ用の初期パースペクティブの構成は以下の通りです。

デバッグビュー」にはデバッグを行うプロジェクト名やクラス、現在の処理位置などの情報が表示されています。

「エディタ」にも現在の処理位置が色付けして表示されます。また、編集を行うこともできます。

変数」ビューは処理が行われた変数の値を確認することができます。また、エディタ上の変数へマウスカーソルを合わせることでもその値を確認することもできます。

「コンソール」は通常と同じように最終的な処理結果が表示されます。

デバッグ画面の見方


デバッグの基本機能一覧

デバッグ画面の確認が出来たので併せてデバッグの具体的な機能も見ておきましょう。

デバッグ画面ではメニューに以下の機能が追加されています。

デバッグ機能のアイコン

よく使う基本機能は7つです。


①すべてのブレークポイントをスキップ:この機能を選択して再開をすると全ブレークポイントを無視して処理を行います。

②再開(ショートカットキー f8):次のブレークポイントへ処理を進めます。

③終了(ショートカットキー ctrl + f2):デバッグを終了します。

④ステップ・イン(ショートカットキー f5):ブレークポイントの有無に関わらず次の処理まで進みます。また次の処理にメソッドがある場合はメソッド内の処理へ移ります。

⑤ステップ・オーバー(ショートカットキー f6):ブレークポイントの有無に関わらず次の処理まで進みます。また次の処理にメソッドがあった場合はメソッドの処理を済ませたうえで次の処理まで移ります。

⑥ステップ・リターン(ショートカットキー f7):実行中のメソッド内で return までの処理を済ませたうえで次の処理まで移ります。

⑦フレームにドロップ:実行中のメソッド内の処理を最初から実行し直します。このとき保持している値はそのまま引き継ぎます。


またメニューのデバッグアイコンからデバッグをかけることもできます。

デバッグアイコンの位置


デバッグの実行

基本的なデバッグの用語と機能がわかったので、実際にデバッグをかけてみましょう。


すべてのブレークポイントをスキップ/再開 機能

冒頭で作成したクラスを使って、

「すべてのブレークポイントをスキップ」と「再開」を試してみます。

クラスへブレークポイントを付与した状態でデバッグを開始させます。

2つ目のブレークポイントで処理が一旦停止していると思いますので、

「すべてのブレークポイントをスキップ」を選択して「再開」を選択してください。

「すべてのブレークポイントをスキップ」と「再開」のアイコン

次のブレークポイントへ止まらずに処理が完了します。

デバッグ実行結果

「すべてのブレークポイントをスキップ」をもう一選択して解除しておきます。


ステップ・イン/ステップ・オーバー/ステップ・リターン/フレームにドロップ 機能

冒頭で作成したクラスに以下のメソッドを追加で記述して、

「ステップ・イン」と「ステップ・オーバー」を試してみます。

calcメソッドを書き足して、以下のようなクラスにしてください。

package test;

public class Debug {

	// mainメソッド
	public static void main(String[] args) {
		int a = 10;
		a = calc(a);
		System.out.println(a);
	}

	// calcメソッド
	static int calc(int b) {
		for(int i = 0; i < 10; i++) {
			b = b + 1;
		}
		return b;
	}
}

calcメソッドは、受け取った値に対して10回分の1を足します(結果的には10を足すという意味)。

mainメソッドの「a = calc(a);」部分だけにブレークポイントを付与してデバッグを開始してください。

デバッグ準備

ではこの状態を起点に、

ステップ実行(ステップ・イン、ステップ・オーバー、ステップ・リターン)とフレームにドロップの

動きをそれぞれ見ていきましょう。


ステップ・イン

ステップ・インを選択すると calcメソッドの「for(int i = 0; i < 10; i++)」処理へ移動します。

 ※ a は一時的に b という名前に変わります。

続けてステップ・インを選択すると「b = b + 1」の処理へ移り、

もう一度ステップ・インを選択すると 10 に +1 の処理を行います。

右側の「変数」を見ると +1 の加算が行われたことが確認できます。

変数ビューの確認

継続的にステップ・インを選択していくと変数の値が1ずつ増えていくことが確認できるはずです。

値が 20 まで増えたら「return b;」へ移動し、もう一度ステップ・インすると「a = cals(a);」へ戻ります。

このようにメソッド内の処理を確認できる機能がステップ・インでした。

ステップ・インの動作が確認できたので「再開」を選択して処理を完了させましょう。


 ※もし以下のようなタブが開いた場合は、複雑なメソッドの処理へ移動しています。

  タブを閉じても問題はありません。

複雑なメソッドへステップ・インした例


ステップ・オーバー

デバッグがブレークポイントで一時停止した状態から、「ステップ・オーバー」を選択します。

このときステップ・インでは calcメソッドの処理へ移動しましたが、

今回は calcメソッドの処理が完了した状態で、次の処理へ移動しています。

ステップ・オーバー機能の確認

メソッドの結果だけを知りたい場合はステップ・オーバーを使うことで確認できます。

「再開」を選択して処理を完了させましょう。


ステップ・リターン

デバッグがブレークポイントで一時停止した状態から、

まずはステップ・インで calcメソッドの処理へ入ります。

次に「ステップ・リターン」を選択すると、

「return b;」までの処理を完了させて「a = calc(a);」へ戻ります。

ステップ・リターンの動き方

今回の場合はステップ・オーバーに似た動きを見せていますが、

メソッド内の一部の処理だけを確認したい場合などに使うことができる機能です。


フレームにドロップ

デバッグがブレークポイントで一時停止した状態から、

まずはステップ・インで calcメソッドの処理へ入ります。

「return b;」までステップ・インで処理を続けてましょう。

ここで「フレームにドロップ」を選択すると、再び calcメソッドの処理を開始します。

フレームにドロップの流れ

フレームにドロップは主にステップ・インで進め過ぎた処理があった場合などで利用できる機能です。

 ※もしメソッドの処理が完了した場合は「フレームにドロップ」は使えません。


また前述した通り処理を再び開始すると、現在の値が引き継がれるので注意が必要です。

上記例の場合でいうと「10」に「10」が追加された後、

フレームにドロップを行っているため更に「1が10回」加算されて結果的に「30」が表示されます。

フレームにドロップによる変数の引継ぎ


終了 機能

終了機能は言葉の通りデバッグを終了させます。

最後まで動作を行うものではないため、コンソールへ結果の表示もされません。

バグの確認が終わり、以降の処理の確認が必要なくなった場合などに使うことが出来ます。

デバッグを終了して Java のパースペクティブへ戻りたいときは、

メニュー右側から Java のパースペクティブを選ぶことで戻ることが出来ます。


これらデバッグの基礎を身に着けることで、

意図した動作をしているか?

結果が意図しないものの場合はどこに原因があるか?

エラーが出ている箇所はどこか?

といったことを自身で探ることができるようになります。

いつでも使えるように身に着けておきましょう。


【著者】

若江

30代で異業種となるIT業界へ転職した駆け出しのプログラマです。これまで主に Java や Ruby、HTML/CSS を使って学習を目的としたショップサイトや掲示板サイトの作成を行いました。プログラマとしての経験が浅いからこそ、未経験者の目線に近い形で基礎の紹介をしていきたいと思います。