jdb - The Java デバッガ

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

機能説明

jdb [ options ]

説明

Java デバッガのjdb は、Java クラスのための dbx のようなコマンド行デバッガです。それは、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 デバッガは他のコマンドもサポートしています。これは、jdbhelp コマンドを使用して表示することができるコマンドに限られています。

注意: 局所(スタック)変数をブラウズするには、クラスが -g オプションでコンパイルされていなければなりません。

help, または ?
最も重要な jdb コマンド、help は、認識されたコマンドのリストに簡潔な説明をつけて表示します。
print
Java オブジェクトをブラウズします。print コマンドはオブジェクトの toString() メソッドを呼び出し、そのフォーマットはクラスにより異なります。

クラスは、オブジェクト ID または名前によって指定します。クラスがすでにロードされている場合、java.lang.ThreadThread のように、部分文字列が使用できます。

printprint MyClass.clsVarのように、Java の式をサポートします。メソッドの呼び出しは、現在サポートしていません。

dump
オブジェクトのインスタンス変数をダンプします。オブジェクトはオブジェクト ID (16進数整数)によって指定されます。

クラスは、オブジェクト ID または名前によって指定します。クラスがすでにロードされている場合、java.lang.ThreadThread のように、部分文字列が使用できます。クラスがロードされていない場合、フルネームで指定しなければなりません。そしてクラスは副次作用としてロードされます。これは、アプレットを実行する前に、参照されるクラスにブレークポイントを設定するために必要なものです。

dump コマンドは、dump 0x12345678.myCache[3].foo のような Java の式をサポートします。メソッド呼び出しは、現在サポートしていません。

threads
現在のスレッドをリストします。これはスレッドグループに分けてスレッドをすべて表示します。スレッドはオブジェクト ID により参照されるか、デフォルトのスレッドグループにある場合、t@3 のように t@<index>の形式で参照されます。

where
引数をもたない where コマンドは、(thread コマンドで設定された) 現在スレッドのスタックをダンプします。where all コマンドは、現在のスレッドグループにあるスレッドのスタックを、すべてダンプします。where threadid は、指定スレッドのスタックをダンプします。threadidt@3 のように、t@<index> の形式をとります。 要求されたスレッドが (ブレークポイントか suspend コマンドによって)、中断している場合、局所 (スタック) 変数とインスタンス変数は print コマンドと dump コマンドでブラウズできます。up コマンドと down コマンドでどのスタックフレームをカレントにするか選ぶことができます。

ブレークポイント

ブレークポイントは、"stop at MyClass:45" のようにして、jdb でクラスにセットされます。ソースファイルの行番号、またはメソッドの名前で指定しなければなりません (ブレークポイントはそのメソッドの最初の命令に設定されます)。clear コマンドは類似の構文を使用してブレークポイントを削除します。また cont コマンドは実行を続けます。シングルステップは stepコマンドで利用します。.

例外

Java プログラムのスタック上どこにも catch 文がない例外が発生した場合、Java ランタイムは通常例外トレースをダンプして終了します。しかし、jdb のもとで実行されるとき、例外は回復不能なブレークポイントとして取り扱われ、jdb は誤りを犯した命令で停止します。そのクラスが -g オプションでコンパイルされた場合、インスタンス変数と局所変数が例外の原因を判定するために表示されます。

特定の例外を、catch コマンドで捕まえることができます。たとえば、"catch FileNotFoundException"、または "catch mypackage.BigTroubleException のようにします。 Java デバック機能はこれらの例外のリストを保持し、その 1 つがスローされたとき、あたかもブレークポイントが例外を起こした命令にセットされていたかのように扱われます。ignore コマンドはこのリストから例外クラスを取り除きます。

注意: ignore コマンドでは、 Java インタプリタは例外を無視せず、デバッガのみ無視します。

オプション

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

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

-host <hostname>
接続するインタプリタセッションを実行する、ホストマシンの名前を指定します。
-password <password>
アクティブなインタプリタセッションに「ログイン」します。これは、-debug オプションで呼び出したとき、Java インタプリタによって表示されるパスワードです。

環境変数

CLASSPATH
ユーザ定義クラスへのパスをシステムに指定します。ディレクトリはコロンで分割されています。たとえば、次のとおりです。
.:/home/avh/classes:/usr/local/java/classes

参照

javac, java, javah, javap, javadoc