名前
jdb - Javaプラットフォーム・プログラムでバグを検索して修正
シノプシス
jdb
[options] [classname] [arguments]
- options
- これは、
jdb
コマンド行オプションです。 「jdbコマンドのオプション」を参照してください。 - classname
- これは、デバッグされるメイン・クラスの名前です。
- arguments
- これは、クラスの
main()
メソッドに渡される引数です。
説明
Javaデバッガ(JDB)は、Javaクラス用の簡単なコマンド行デバッガです。 JDBは、jdb
コマンドとそのオプションによって呼び出されます。 jdb
コマンドは、Java Platform Debugger Architectureのデモを示し、ローカルまたはリモートのJVMの検査とデバッグを提供します。
JDBセッションの開始
JDBセッションを開始するには様々な方法があります。 最も頻繁に使用される方法は、JDBがデバッグ対象のアプリケーションのメイン・クラスを使用して新しいJVMを起動するようにすることです。 これを行うには、コマンド行でjava
コマンドの代わりにjdb
コマンドを入力します。 たとえば、アプリケーションのメイン・クラスがMyClass
の場合は、JDB環境でデバッグするときに次のコマンドを使用します。
jdb MyClass
この方法で起動すると、jdb
コマンドは、指定されたパラメータを使用して2つ目のJVMを呼び出し、指定されたクラスをロードし、JVMを停止してから、そのクラスの最初の命令を実行します。
jdb
コマンドのもう1つの使用方法は、すでに実行している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に接続するため、jdb
コマンド行にはMyClass
引数が指定されません。
デバッガを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
- ヘルプ・メッセージを表示します。
-sourcepath
dir1:
dir2:
...- 指定されたパスを使用して、指定されたパス内のソース・ファイルを検索します。 このオプションを指定しない場合は、デフォルト・パスのドット(
.
)を使用します。 -attach
address- デフォルトの接続メカニズムを使用して、実行中のJVMにデバッガを接続します。
-listen
address- 実行中のJVMが標準のコネクタを使用して指定されたアドレスに接続するまで待機します。
-listenany
- 実行中のJVMが標準コネクタを使用して使用可能なアドレスに接続するまで待ちます。
-launch
- デバッグ対象のアプリケーションを
jdb
コマンドの起動直後に起動します。-launch
オプションを指定すれば、run
コマンドを使用する必要がなくなります。 デバッグ対象のアプリケーションは、起動後、初期アプリケーション・クラスがロードされる直前に停止します。 その時点で、必要なブレークポイントを設定し、cont
コマンドを使用して実行を継続できます。 -listconnectors
- このJVMで使用可能なコネクタを一覧表示します。
-connect
connector-name:
name1=
value1....- 指定のコネクタおよび一覧表示された引数の値を使用して、ターゲットJVMに接続します。
-dbgtrace
[flags]jdb
コマンドのデバッグに関する情報を出力します。-tclient
- Java HotSpot VMクライアントでアプリケーションを実行します。
-trackallthreads
- 仮想スレッドを含むすべてのスレッドを作成時に追跡します。 下記の「仮想スレッドの操作」を参照してください。 仮想スレッドは、Javaプラットフォームのプレビュー機能です。
-tserver
- Java HotSpot VMサーバーでアプリケーションを実行します。
-J
option- JDB JVMにoptionを渡します。ここで、Javaアプリケーション・ランチャの参照ページで説明されているオプションの1つです。 たとえば、
-J-Xms48m
と指定すると、スタートアップ・メモリーは48Mバイトに設定されます。 javaの「Javaオプションの概要」を参照してください。
次のオプションは、デバッガ・プロセスに転送されます。
-R
option- デバッグJVMにoptionを渡します。ここで、optionはJavaアプリケーション・ランチャの参照ページで説明されているオプションの1つです。 たとえば、
-R-Xms48m
は起動メモリーを48 MBに設定します。 javaの「Javaオプションの概要」を参照してください。 -v
または-verbose
[:
class |gc
|jni
]- 冗長モードにします。
-D
name=
value- システム・プロパティを設定します。
-classpath
dir- クラスが検索されるディレクトリをコロンで区切ったリストを表示します。
-X
option- 非標準のターゲットJVMオプションです。
デバッガとデバッグ対象のJVMを接続するための代替メカニズムを提供するために、その他のオプションもサポートされています。
仮想スレッドの操作
仮想スレッドは、Javaプラットフォームのプレビュー機能です。 プレビュー機能は、今後のリリースで削除するか、Javaプラットフォームの永続機能にアップグレードすることができます。
多くの場合、仮想シードは、デバッガを圧倒できるような大きな数と頻度で作成されます。 このため、デフォルトでは、JDBは作成時に仮想スレッドを追跡しません。 ブレークポイント・イベントなど、イベントが到着した仮想スレッドのみを追跡します。 -trackallthreads
オプションを使用すると、JDBがすべての仮想スレッドを作成時に追跡できます。
JDBは、最初に接続するときに、デバッグ・エージェントからすべての既知のスレッドのリストをリクエストします。 デフォルトでは、デバッグ・エージェントはこのリスト内の仮想スレッドを返しません。これは、リストが大きすぎてデバッガを圧倒する可能性があるためです。 デバッグ・エージェントには、この動作を変更するために有効にできるincludevirtualthreads
オプションがあり、すべての既知の仮想スレッドがリストに含まれます。 JDB -trackallthreads
オプションを使用すると、JDBがデバッグするアプリケーションを起動したときに、JDBによって自動的にデバッグ・エージェントのincludevirtualthreads
オプションが有効になります。 ただし、デバッグ対象アプリケーションにアタッチされるJDBより前に作成された仮想スレッドについては、デバッグ・エージェントが認識していない場合があることに注意してください。