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";
とブレークポイントがヒットする。