jdb - Java デバッガ

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

形式

jdb [ options ] [ class ] [ arguments ] 
options
次に示すコマンド行オプション
class
デバッグを開始するクラスの名前
arguments
classmain() メソッドに渡す引数

解説

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 インタプリタに jdb を接続することです。セキュリティ上の理由で、Java インタプリタは、-Xdebug オプションで開始したときだけデバッグされます。-Xdebug オプションで開始した場合、Java インタプリタは jdb が使用するパスワードを表示します。また、デバッグされるインタプリタは、JIT コンパイラと一緒に実行してはいけません。JIT コンパイラをロードしないようにするには、-Djava.compiler=NONE オプションを使います。デバッグされるインタプリタが、特別なデバッガクラスを利用できるようにする必要があります。これらのクラスは、デフォルトのランタイムクラスライブラリには含まれていません。オプション -Xbootclasspath:$INSTALL_DIR/jre/lib/rt.jar:$INSTALL_DIR/lib/tools.jar を使って、デバッグされるインタプリタが必要なすべてのクラスを検索できるようにします。つまり、次のようにして Java インタプリタを起動します。

   % java -Xdebug -Djava.compiler=NONE   ¥
     -Xbootclasspath:$INSTALL_DIR/jre/lib/rt.jar:$INSTALL_DIR/lib/tools.jar <class>

起動している Java インタプリタに jdb を接続するには (セッションパスワードがわかっている場合)、次のようにして呼び出します。

   % jdb -host <hostname> -password <password>

基本 jdb コマンド

基本的な jdb コマンドの一覧を示します。Java デバッガがサポートするコマンドはこれ以外にもあり、それらは jdbhelp コマンドを使用して表示することができます。

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

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

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

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

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

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

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

threads
スレッドを一覧表示します。スレッドはオブジェクト ID により参照されます。

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

ブレークポイント

ブレークポイントは、"stop at MyClass:45" などとして、jdb でクラスに設定されます。ソースファイルの行番号、またはメソッドの名前で指定しなければなりません (ブレークポイントはそのメソッドの最初の命令に設定される)。clear コマンドは、clear MyClass:45 のような構文を使用してブレークポイントを削除します。引数を付けないで clear コマンドを使うと、現在設定されているすべてのブレークポイントが一覧表示されます。cont コマンドは実行を継続します。ステップ実行は、step コマンドを使用すると利用できます。

例外

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

特定の例外は、catch コマンドでキャッチすることができます。たとえば、catch FileNotFoundException または catch mypackage.BigTroubleException のようにします。Java デバック機能によってこれらの例外のリストが保持され、そのどれかがスローされると、例外を発生させた命令にブレークポイントが設定されていたかのように処理されます。ignore コマンドは、このリストから例外クラスを取り除きます。

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

オプション

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

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

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

環境変数

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

関連項目

javac, java, javah, javap, javadoc