Java デバッガである jdb は、Java クラスのための dbx(UNIX BSD系のデバッガ)
のようなコマンドラインデバッガです。それは、Java Debugger API を使用して、ローカルまたはリモート
Java インタプリタの検査とデバックを行います。
jdb の起動方法
dbxのように、jdb がデバックを開始するには、2つの方法があります。最も多く使われる方法は、デバッグするクラスを指定して、jdb
に Java インタプリタを開始させることです。これは java コマンドの代わりに jdb
コマンドを使用することによって行います。たとえば、jdb で AppletViewer を開始するには、次のようにします:
% jdb sun.applet.AppletViewer
または
% jdb -classpath $INSTALL_DIR/classes sun.applet.AppletViewer
このようにして開始すると、jdb は指定のパラメータを用い、2 つ目の Java インタプリタを呼び出します。次に指定のクラスをロードし、クラスの最初の命令を実行する前にインタプリタを停止させます。
jdb を開始するもう 1 つの方法は、すでに起動している Java インタプリタに接続することです。セキュリティ上の理由で、Java
インタプリタが、 -debug オプションで開始したときだけデバッグできます。-debug
オプションで開始した場合、Java インタプリタは jdb が使用するパスワードを表示します。
起動している Java インタプリタに (セッションパスワードが分かっている場合) jdb
を接続するには、次のようにして呼び出します:
% jdb -host <hostname> -password <password>
jdbの基本コマンド
基本的な jdb のコマンドをリストします。Java デバッガは他のコマンドもサポートしています。これは、jdb
の help コマンドを使用して表示することができます。
NOTE: ローカル(スタック)変数をブラウズするには、クラスが -g オプションでコンパイルされていなければなりません。
- help, ?
- 最も重要な jdb コマンド、help は、コマンドのリストに簡潔な説明をつけて表示します。
- print
- Java オブジェクトをブラウズします。print コマンドはオブジェクトの toString()
メソッドを呼び出します。そのフォーマットはクラスにより異なります。
クラスは、オブジェクト ID または名前によって指定します。クラスがすで にロードされている場合、java.lang.Thread
の Thread のように部分文字列が使用できます。
print は print MyClass.clsVarのように、Java の式をサポートします。メソッドの呼び出しは現在サポートしていません。
- dump
- オブジェクトのインスタンス変数をダンプします。オブジェクトはオブジェクト ID (16進数整数)によって指定されます。
クラスは、オブジェクト ID または名前によって指定します。クラスがすでにロードされている場合、java.lang.Thread
の Thread のように、部分文字列が使用できます。クラスがロードされていない場合、フルネームで指定しなければなりません。そしてクラスは副次作用としてロードされます。これは、アプレットを実行する前に参照されるクラスに、ブレークポイントを設定するために必要なものです。
dump コマンドは、dump 0x12345678.myCache[3].foo のような Java の式をサポートします。メソッド呼び出しは、現在サポートしていません。
- threads
- 現在のスレッドをリストします。これはスレッドグループに分けられたすべてのスレッドを表示します。スレッドはオブジェクト
ID により参照されるか、カレントのスレッドグループにある場合、t@3 のように t@<index>の形式で参照されます。
- where
- 引数をもたない where コマンドは、(thread コマンドで設定された) カレントのスレッドのスタックをダンプします。where
all コマンドは、カレントのスレッドグループにあるすべてのスレッドのスタックをダンプします。where
threadid は、指定スレッドのスタックをダンプします。threadid は t@3
のように、t@<index> の形式をとります。要求されたスレッドが (ブレークポイントか
suspend コマンドによって) 中断している場合、ローカル(スタック)変数とインスタンス変数は
print コマンドと dump コマンドでブラウズできます。up コマンドと down コマンドでどのスタックフレームをカレントにするか選ぶことができます。
ブレークポイント
ブレークポイントは、"stop at MyClass:45" のようにして、jdb でクラスにセットされます。ソースファイルの行番号、またはメソッドの名前で指定しなければなりません
(ブレークポイントはそのメソッドの最初の命令に設定されます)。clearコマンドは、"clear
at MyClass:45" のようにしてブレークポイントを削除します。引数無しで clear コマンドを実行すると、現在セットされているすべてのブレークポイントが削除されます。また
cont コマンドは実行を続けます。シングルステップは stepコマンドで行います。
例外
Java プログラムのスタック上どこにも catch 文がない例外が発生した場合、Java ランタイムは例外トレースをダンプして終了します。しかし、jdb
のもとで実行される場合、例外は回復不能なブレークポイントとして取り扱われ、jdb
は誤りを犯した命令で停止します。そのクラスが -g オプションでコンパイルされている場合、インスタンス変数と局所変数が例外の原因を判定するために表示されます。
特定の例外を、catch コマンドで捕まえることができます。たとえば、"catch FileNotFoundException"、または
"catch mypackage.BigTroubleException" のようにします。 Java デバック機能はこれらの例外のリストを保持し、その1つが
throw されたとき、あたかもブレークポイントが例外を起こした命令にセットされていたかのように扱われます。ignore
コマンドはこのリストから例外クラスを取り 除きます。
NOTE: ignore コマンドで指定した例外は、 Java インタプリタでは無視されず、デバッガのみ無視します。