デバッグ

デバッグとは

デバッグとは、プログラムの誤り(バグと呼ばれる)を探し、取り除くことです。
プログラムは人間が作成するため、どうしても誤りが混入してしまいます。
そのため、デバッグはプログラム開発過程において非常に重要な意味を持ちます。

Eclipseでは処理の途中で処理を一時停止する機能として、デバッグ機能が備わっています。
デバック機能はプログラム処理の状況を確認して、処理の動きを確認するための機能です。

デバッグの実践

「com.cmps.debug」パッケージを作成、「Debug」クラスを作成しましょう。
次のサンプルプログラムを使って、デバッグ機能を使ってみましょう。

public class Debug {

    public static void main(String[] args) {
        // ランダムに生成される0から9の数値
        int random = (int)(Math.random() * 10);
        int input;
        
        System.out.println("0から9までの数字を入力してください");
        input = read();
        // ランダムに生成した数値と、ユーザーが入力した数値を比較
        if(random == input) {
            System.out.println("OK");
        } else {
            System.out.println("NG");
        }
    }
    
    // 入力された数値
    static int read() {
        Scanner scan = new Scanner(System.in);
        int i = scan.nextInt();
        return i;
    }
}

これはランダムに生成された数値と、入力された数値を比較し、
一致した場合「OK」、そうでなければ「NG」が表示されるプログラムとなっています。

デバッグ画面の表示

Eclipseのデバッグを行うには、デバッグパースペクティブへ切り替えをします。

Eclipseのパースペクティブ
パースペクティブとは、それぞれの目的に合ったビューの画面配置のことです。
デバッグパースペクティブには、デバッグに必要なビューが配置されています。Javaパースペクティブは、Javaでコーディングを行う際に使います。

上部から、「ウインドウ(W)」->「ビューの表示」->「デバッグ」を選択してください。

デバッグ画面の表示

選択すると、作業画面上に「デバッグ」タグが表示されます。
表示されたデバッグは見やすいように位置を調整しましょう!

もうひとつ、上部から、「ウインドウ(W)」->「ビューの表示」->「変数」を選択してください。
変数ビューは処理実行時に宣言した変数の中身を確認できるツールです。

変数タグの表示

選択すると、作業画面上に「変数」タグが表示されます。

ステップオーバーを使用したデバッグ

ブレイクポイントの設定

次に、処理を止めたい箇所に対して、ブレイクポイントを仕掛けます。直訳すると休憩地点、という意味です。

仕掛けることで処理を途中で一時停止する事が可能です。
気を付けたいのがあくまで一時停止のため、PC上では処理は継続されている事になります。
処理を終了する時は、中断ボタンを押して処理を中断させてください。

エディター上の左側に青い枠が見えるかと思います。
青枠部分はデバッグで処理を一時停止することができる箇所になります。

デバッグで処理を一時中断できる目印

青枠の中をダブルクリックして、ブレイクポイントを設定、
もう一度ダブルクリックすることでブレイクポイントを外すことが可能です。

今回は、ソースコードの9行目にブレークポイントを設定してください。
ブレイクポイントが設定された行には、青い印が付きます。

デバッグの開始

ブレイクポイントを設定したら、デバッグを開始します。
「Debug.java」を右クリック、デバッグを選択、Javaアプリケーションを選択します。

デバッグの実行

デバッグビューを見ると、9行目のブレイクポイントにて実行が一時中断されていることがわかります。

デバックビュー

ソースコードエディタを見ると、一時中断している9行目がハイライトされています。
9行目が実行される直前で停止しています。

デバッグ実行中のソースコード

ステップオーバーでのプログラムの実行

続いて、ステップオーバーを実行して、9行目からプログラムを1ステップ実行し、プログラムの動きを確認します。このとき、変数に代入されている値も見ることができます。

上部のツールバーにある「ステップオーバー」をクリックしてください。
するとプログラムは、12行目が実行される直前で停止します。
つまり、9行目と10行目は既に実行されたことになります。

ステップオーバーの様子

変数ビューを見てみると、9行目で定義した変数randomが表示されています。
Debugクラスのrandomメソッドを利用して作成した値は、今回の場合は「6」だったことがわかります。

デバッグ中の変数ビュー

もう一度ステップオーバーをクリックすると、13行目で停止します。

2回目のステップオーバーの様子

13行目で停止、つまり13行目が実行される直前ということなので、
コンソールビューには12行目の実行結果「0から9までの数字を入力してください」が表示されます。

もう一度ステップオーバーをクリックしましょう。
readメソッドが実行され、ユーザーが数値を入力していない(ステップが完了していない)状態なので「ステップ」と表示されています。

ステップ中のデバッグビュー

先ほどの変数ビューで確認したrandomと同じ値、
つまり「当たり」になる数字「6」をコンソール上に入力し、Enterを押して先に進みましょう。

変数ビューを見ると、入力した数字がinputに格納されていることが確認できるかと思います。

2回目のデバッグ変数ビュー

このとき、15行目のif文条件式が実行される直前で停止しています。

ステップオーバー3回目

ステップオーバーをクリックすると、15行目の条件文がtrueなので、
そのままif条件文の中に入り、16行目が実行される直前で停止します。
この時点ではまだ16行目が実行されていないので、「OK」という文字列は表示されません。

さらにステップオーバーで進めます。
16行目が実行され、17行目で停止します。

コンソールビューに16行目が実行された結果が表示されていますね。

最終結果が表示されたコンソールビュー


このように、Eclipseのデバッグではブレークポイントを設定し、ステップオーバーというコマンドを使って、
現在のアクティブになっているプログラムを1ステップずつ実行することができます。

この基本的な流れを理解できるようになりましょう。

ステップオーバーと再開を組み合わせたデバッグ

ここまでブレークポイントを設定し、そこで一旦プログラムを中断した後に、
ステップオーバーを使って、プログラムの流れを追っていきました。

次は、ステップオーバーと「再開」というものを組み合わせて使っていきます。
これによって、複数のブレークポイントを設定して効率よくデバッグを行うことができます。

「再開」を利用することで、デバッグの必要がないところは一気に実行して進めてくれるので、効率よくデバッグを行なうことができます。

では、もう一度先ほどと同じプログラムを使って、デバッグを行っていきます。
最初に、9行目と13行目にブレイクポイントを設定してください。

再開

次に、Debugプログラムのデバッグを開始します。

9行目でプログラムの実行が中断されたら、ステップオーバーを使い、
変数randomの生成とその値を確認します。ここでは、ランダムで生成された値は6です。

再開:変数ビュー

次に「再開」を行うため、画面上部の「再開アイコン」をクリックしましょう。
これにより、次のブレークポイントまでプログラムを一気に実行します。

再開アイコン

このプログラムでは1行しか進みませんが、
再開を押すと次のブレークポイントまたはプログラムの最後に達するまで一気に実行されます。

ソースコードエディタを見ると、13行目で実行が中断されています。

再開:中断

ステップオーバーを使って13行目を実行し、コンソールビューへ正解の数値である変数randomの値を入力します。
変数inputの生成し、その値を変数ビューにて確認しましょう。

再開:inputへの格納

さらにステップオーバーを行い、15行目から始まるif文で処理がどうなるのかを確認してみて下さい。

このように、複数のブレークポイントを設定した場合は、
再開とステップオーバーを組み合わせて利用することで、効率よくデバッグを行うことができます。

デバッグの停止
デバッグを停止したい場合は、赤い四角の「停止」アイコンを押します。
プログラムをデバッグ中のままで放置しておくと、実行中のプログラムがたまり、PCの処理速度が低下することがあります。
デバッグを行う際は、プログラムが終了するまで続けるか、
「停止」アイコンを押してそのプログラムを終了させるようにしましょう。

ステップインでメソッドの中身を確認

ステップインを使うと、現在停止している行がメソッドを呼び出している場合に限って、そのメソッドの中に入って1ステップ実行します。
それによって、自作のメソッドの実行の流れや変数の状態などを追うことができ、意図した通りの動きになっているのかどうかを確かめることができます。

ステップオーバーとステップインを使用したデバッグ

13行目にブレイクポイントを設定します。

ステップイン

次に、Debugプログラムのデバッグを開始します。

13行目のブレイクポイントにて中断したことがデバッグビューで確認したら
画面上部のステップインアイコンをクリックしましょう。

ステップインアイコン

readメソッドを呼び出している行でステップインコマンドを実行することで、readメソッド内もデバッグ対象になります。
そのため、ソースコードを見ると現在行がreadメソッドの最初のステップである24行目を指し、そこで中断しています。

ステップイン:デバッグニュー
ステップイン:呼び出し先

引き続きステップオーバーで1ステップずつ実行していきます。
25行目が実行されると、入力待ちの状態となります。

ステップイン:入力待ちの状態

この状態になったら、値を入力しEnterキーを押します。

さらにステップオーバーを繰り返し、入力した数値が正しく変数inputに代入され、正しく「OK」または「NG」を表示する処理が行われるかを確認してみましょう。

メソッドの宣言部分の中にもブレークポイントを設定可能
ここでは、中断している行からステップインでメソッドの中に入りましたが、メソッドの中に直接ブレークポイントを設定することも可能です。
ブレークポイント、ステップオーバー、再開、ステップインをうまく組み合わせて効率的にデバッグを行いましょう

タイトルとURLをコピーしました