名前
jdb - Javaプラットフォーム・プログラムでバグを検索して修正
シノプシス
jdb [options] [classname] [arguments]
- options
-
これは、
jdbコマンドライン・オプションを表します。 「jdbコマンドのオプション」を参照してください。 - classname
- これは、デバッグされるメイン・クラスの名前です。
- arguments
-
これは、クラスの
main()メソッドに渡される引数を表します。
説明
Javaデバッガ(JDB)は、Javaクラス用の簡単なコマンド行デバッガです。 JDBは、jdbコマンドとそのオプションによって呼び出されます。 jdbコマンドは、Javaプラットフォーム・デバッガ・アーキテクチャを示し、ローカルまたはリモートのJVMの検査およびデバッグを提供します。
JDBセッションの開始
JDBセッションを開始するには様々な方法があります。 最も頻繁に使用される方法は、JDBがデバッグ対象のアプリケーションのメイン・クラスを使用して新しいJVMを起動するようにすることです。 これを行うには、コマンド行でjavaコマンドの代わりにjdbコマンドを入力します。 たとえば、アプリケーションのメイン・クラスがMyClassの場合、次のコマンドを使用してJDBでデバッグします:
jdb MyClass
この方法で起動すると、jdbコマンドは、指定されたパラメータを使用して2つ目のJVMを呼び出し、指定されたクラスをロードし、JVMを停止してから、そのクラスの最初の命令を実行します。
jdbコマンドを使用する別の方法は、すでに実行されているJVMにコマンドをアタッチすることです。 JVMの実行中にjdbコマンドが接続するJVMを起動するための構文は、次のとおりです。 これは、インプロセス・デバッグ用ライブラリをロードし、接続の種類を指定します。
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n MyClass
その後、次のコマンドを使用して、jdbコマンドをJVMに接続できます。
jdb -attach 8000
8000は、実行中のJVMのアドレスです。
この場合、jdbコマンドが新しいJVMを起動するのではなく既存のJVMに接続しているため、MyClass引数がjdbコマンドラインで指定されていません。
デバッガをVMに接続するには他にも様々な方法があり、すべてjdbコマンドでサポートされています。 接続オプションについては、Java Platform Debugger Architectureのドキュメントを参照してください。
ブレークポイント
ブレークポイントは、JDBの行番号またはメソッドの最初の命令で設定できます。たとえば、次のようになります:
コマンド
stop at MyClass:22は、MyClassが含まれるソース・ファイルの22行目の最初の命令にブレークポイントを設定します。コマンド
stop in java.lang.String.lengthは、java.lang.String.lengthメソッドの先頭にブレークポイントを設定します。コマンド
stop in MyClass.<clinit>は、<clinit>を使用してMyClassの静的初期化コードを識別します。
メソッドがオーバーロードされている場合は、メソッドの引数の型も指定して、ブレークポイントに対して適切なメソッドが選択できるようにする必要があります。 たとえば、MyClass.myMethod(int,java.lang.String)またはMyClass.myMethod()と指定します。
clearコマンドは、clear MyClass:45のような構文を使用してブレークポイントを削除します。 引数を付けずにclearまたはstopコマンドを使用すると、現在設定されているすべてのブレークポイントのリストが表示されます。 contコマンドは実行を継続します。
ステッピング
stepコマンドは、現在のスタック・フレームまたはコールされたメソッドのいずれであっても、実行を次の行に進めます。 nextコマンドは、現在のスタック・フレームの次の行を実行します。
例外
例外が発生し、スロー中のスレッド呼出しスタックのどこにもcatch文が存在しない場合、通常JVMは例外トレースを出力して終了します。 ただし、JDBで実行している場合、制御は問題のあるスローでJDBに戻ります。 次に、jdbコマンドを使用して例外の原因を診断できます。
たとえば、catch java.io.FileNotFoundExceptionまたはcatch mypackage.BigTroubleExceptionのようにcatchコマンドを使用すると、デバッグ対象のアプリケーションは他の例外がスローされたときに停止します。 例外が特定のクラスまたはサブクラスのインスタンスの場合は、アプリケーションは例外がスローされた場所で停止します。
ignoreコマンドを使用すると、以前のcatchコマンドの効果が無効になります。 ignoreコマンドは、デバッグされたJVMが特定の例外を無視するわけではなく、デバッガを無視するだけです。
jdbコマンドのオプション
コマンド行でjavaコマンドのかわりにjdbコマンドを使用すると、jdbコマンドは、javaコマンドと同じオプションを多数受け入れます。
jdbコマンドでは、次のオプションを使用できます:
-help- ヘルプ・メッセージを表示します。
-sourcepathdir1:dir2:...-
指定されたパスを使用して、指定されたパス内のソース・ファイルを検索します。 このオプションを指定しない場合は、デフォルト・パスのドット(
.)を使用します。 -attachaddress- デフォルトの接続メカニズムを使用して、実行中のJVMにデバッガを接続します。
-listenaddress- 実行中のJVMが標準のコネクタを使用して指定されたアドレスに接続するまで待機します。
-listenany- 実行中のJVMが標準コネクタを使用して使用可能なアドレスに接続するまで待ちます。
-launch-
jdbコマンドの起動時に、デバッグされたアプリケーションをただちに起動します。-launchオプションを指定すれば、runコマンドを使用する必要がなくなります。 デバッグ対象のアプリケーションは、起動後、初期アプリケーション・クラスがロードされる直前に停止します。 その時点で、必要なブレークポイントを設定し、contコマンドを使用して実行を継続できます。 -listconnectors- このJVMで使用可能なコネクタを一覧表示します。
-connectconnector-name:name1=value1....- 指定のコネクタおよび一覧表示された引数の値を使用して、ターゲットJVMに接続します。
-dbgtrace[flags]-
jdbコマンドのデバッグに関する情報を出力します。 -tclient- Java HotSpot VMクライアントでアプリケーションを実行します。
-trackallthreads- 仮想スレッドを含むすべてのスレッドを作成時に追跡します。 下記の「仮想スレッドの操作」を参照してください。
-tserver- Java HotSpot VMサーバーでアプリケーションを実行します。
-Joption-
JDB JVMにoptionを渡します。ここで、Javaアプリケーション・ランチャの参照ページで説明されているオプションの1つです。 たとえば、
-J-Xms48mと指定すると、スタートアップ・メモリーは48Mバイトに設定されます。 javaの「Javaオプションの概要」を参照してください。
次のオプションは、デバッガ・プロセスに転送されます。
-Roption-
デバッグJVMにoptionを渡します。ここで、optionはJavaアプリケーション・ランチャの参照ページで説明されているオプションの1つです。 たとえば、
-R-Xms48mは起動メモリーを48 MBに設定します。 javaの「Javaオプションの概要」を参照してください。 -vまたは-verbose[:class |gc|jni]- 冗長モードにします。
-Dname=value- システム・プロパティを設定します。
-classpathdir- クラスが検索されるディレクトリをコロンで区切ったリストを表示します。
-Xoption- 非標準のターゲットJVMオプションです。
デバッガとデバッグ対象のJVMを接続するための代替メカニズムを提供するために、その他のオプションもサポートされています。
仮想スレッドの操作
多くの場合、仮想シードは、デバッガを圧倒できるような大きな数と頻度で作成されます。 このため、デフォルトでは、JDBは作成時に仮想スレッドを追跡しません。 ブレークポイント・イベントなど、イベントが到着した仮想スレッドのみを追跡します。 -trackallthreadsオプションを使用すると、JDBがすべての仮想スレッドを作成時に追跡できます。
JDBは、最初に接続するときに、デバッグ・エージェントからすべての既知のスレッドのリストをリクエストします。 デフォルトでは、デバッグ・エージェントはこのリスト内の仮想スレッドを返しません。これは、リストが大きすぎてデバッガを圧倒する可能性があるためです。 デバッグ・エージェントには、この動作を変更するために有効にできるincludevirtualthreadsオプションがあり、すべての既知の仮想スレッドがリストに含まれます。 JDB -trackallthreadsオプションを使用すると、JDBがデバッグするアプリケーションを起動したときに、JDBによって自動的にデバッグ・エージェントのincludevirtualthreadsオプションが有効になります。 ただし、デバッグ対象アプリケーションにアタッチされるJDBより前に作成された仮想スレッドについては、デバッグ・エージェントが認識していない場合があることに注意してください。