jdb は、Java 言語プログラムのバグを見つけて修正するために使用するツールです。
jdb [ options ] [ class ] [ arguments ]
options
- 次に示すコマンド行オプション
class
- デバッグを開始するクラスの名前
arguments
class
のmain()
メソッドに渡す引数
Java デバッガ jdb は、Java クラス用の、dbx に似たコマンド行デバッガです。Java Debugger API を使用して、ローカルまたはリモート Java インタプリタの検査とデバッグを行います。
jdb セッションの開始
dbx と同様に、jdb をデバックに使用するための方法は 2 つあります。もっとも多く使われるのは、デバッグするクラスを指定して、jdb に Java インタプリタを起動させる方法です。これは、コマンド行で java の代わりに jdb コマンド指定することによって実行します。たとえば、jdb のもとで AppletViewer を起動するには、次のようにします。C:¥> jdb sun.applet.AppletViewerまたはC:¥> 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 を接続するには (セッションパスワードがわかっている場合)、次のようにして呼び出します。
C:¥> jdb -host <hostname> -password <password>基本 jdb コマンド
基本的な jdb コマンドの一覧を示します。Java デバッガがサポートするコマンドはこれ以外にもあり、それらは jdb の help コマンドを使用して表示することができます。注: 局所(スタック)変数をブラウズするには、クラスが -g オプションでコンパイルされていなければなりません。
- help または ?
- もっとも重要な jdb コマンド help は、認識されたコマンドのリストに簡潔な説明を付けて表示します。
- 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 により参照されます。
- where
- 引数を持たない
where
コマンドは、(threads コマンドで設定された) 現在のスレッドのスタックをダンプします。where all
コマンドは、現在のスレッドグループにあるスレッドのスタックを、すべてダンプします。where
threadid は、指定スレッドのスタックをダンプします。threadid は t@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
- ユーザ定義クラスへのパスをシステムに指定します。ディレクトリはセミコロンで分割されています。次に例を示します。
.;C:¥users¥dac¥classes;C:¥tools¥java¥classes
javac, java, javah, javap, javadoc