jdb (Java Debugger) における print コマンドの使用とブレークポイントのヒット

jdb を使って、起動中の VM のオブジェクトの一時変数の値を表示させることが出来るが、これには、print コマンドを使う。

jdb の使い方はhttp://www2s.biglobe.ne.jp/~dat/java/strikes/jdb.htmlが詳しい。

ここで、注意が必要なのは、この print コマンドは、表示させたいオブジェクトの toString() メソッドを呼び出し、その返り値を表示させる点だ。

もし、toString() メソッド中で、既にブレークポイントを設定したメソッド呼び出しが行われる場合、ここでもブレークポイントがヒットしてしまう。

以下の例でこのことを示す。

class A {
    public static void main(String[] args) {
	A a=new A();
    }
    String m() {
	return "class A";
    }
    public String toString() {
	return 	m();
    }
}

というクラスがあり、これを -g オプションありでコンパイルした後、

jdb A

とデバッガを立ち上げ、

stop in A.m
stop at A:4
run
print a

とコマンドを入力して、変数 a で参照する生成されたオブジェクトを表示させようとすると、

ブレークポイントのヒット: "スレッド=main", A.m(), line=6 bci=0
6       return "class A";

ブレークポイントがヒットする。