jdb - Java デバッガ

jdb は、Java 言語プログラムのバグを見つけ修正するのを手助けするツールです。

形式

   jdb [ options ]

機能説明

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 インタプリタでは無視されず、デバッガのみ無視します。

オプション

コマンド行で Java インタプリタの代わりに jdb を使用する場合、jdb は、java コマンドと同じオプションを受け入れます。

jdb を使用して、実行中の Java インタプリタセッションに接続する場合、jdb は以下のオプションを受け入れます:

-host <hostname>
接続するインタプリタセッションを実行する、ホストマシンの名前を指定します。

-password <password>
アクティブなインタプリタセッションに「ログイン」します。これは、-debug オプションで呼び出したとき、Java インタプリタによって表示されるパスワードです。

環境変数

CLASSPATH
ユーザ定義クラスへのパスをシステムに指定します。ディレクトリはコロン(UNIX版)やセミコロン(Windows版)で分割します。たとえば、
UNIXの場合
   .:/home/me/classes:/usr/local/java/classes.jar

Windowsの場合
   .;C:\home\me\classes;C:\java\classes.jar