jdb は、Java 言語プログラムのバグを見つけて修正するために使用するツールです。
jdb [ options ] [ class ] [ arguments ]
options
- 次に示すコマンド行オプション
class
- デバッグを開始するクラスの名前
arguments
class
のmain()
メソッドに渡す引数
Java デバッガ jdb は、Java クラス用の簡単なコマンド行デバッガです。 Java Platform Debugger Architecture を視覚的に実行し、ローカルまたはリモートの Java Virtual Machine の検査とデバッグを行うことができます。jdb の現在のバージョンと以前のバージョンでは、コマンド行引数およびサポートされるコマンドについて、いくつか互換性がないものがあります。 oldjdb は、完全に互換性が保証された jdb として使用できます。ただし、新しい実装は信頼性がより向上しており、新しい実装を使用することをお勧めします。
jdb セッションの開始
jdb セッションを開始するにはさまざまな方法があります。 もっとも頻繁に使われるのは、デバッグするアプリケーションのメインクラスを使用して、jdb から新しい Java Virtual Machine (VM) を起動する方法です。 コマンド行で、 java の代わりに jdb コマンドを入力します。 たとえば、アプリケーションのメインクラスが MyClass の場合は、JDB 環境でデバッグするときに次のコマンドを使用します。C:\> jdb MyClassこの方法で起動すると、jdb は、指定されたパラメータを使って 2 つ目の Java VM を呼び出します。 次に、指定されたクラスをロードして、クラスの最初の命令を実行する前に VM を停止させます。jdb のもう 1 つの使用方法は、すでに起動している Java VM に jdb を接続することです。 jdb を使用してデバッグする VM は、次のオプションを使用して起動しなければなりません。
オプション 目的 -Xdebug VM でデバッグのサポートを有効にする -Xrunjdwp:transport=dt_shmem,server=y,suspend=n インプロセスデバッグ用ライブラリをロードし、接続の種類を指定する たとえば、次のコマンドは、MyClass アプリケーションを実行して、jdb があとでそのアプリケーションに接続できるようにします。
C:\> java -Xdebug -Xrunjdwp:transport=dt_shmem,address=jdbconn,server=y,suspend=n次のコマンドを使用して、jdb を VM に接続できます。C:\> jdb -attach jdbconnこの場合、jdb は新しい VM を起動する代わりに既存の VM に接続されるため、jdb コマンド行には「MyClass」は指定しません。 この例では、デフォルトの VM を使用してデバッグを行うことを前提としています。 従来の (classic) VM を使用してデバッグするには、-tclassic オプションを使用します。次に例を示します。C:\> jdb -tclassic MyClassjdb をすでに動作している従来の VM に接続する場合は、VM は次のオプションで起動しなければなりません。
オプション 目的 -Xdebug VM でデバッグのサポートを有効にする -Xrunjdwp:transport=dt_shmem,server=y,suspend=n インプロセスデバッグ用ライブラリをロードし、接続の種類を指定する -Xnoagent oldjdb に対する VM のサポートを無効にする -Djava.compiler=NONE JIT コンパイラを無効にする。 従来の VM 環境でデバッグする場合は必須 たとえば、次のコマンドは、従来の VM を使用して MyClass アプリケーションを実行し、jdb があとでそのアプリケーションに接続できるようにします。
C:\> java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_shmem,address=jdbconn,server=y,suspend=n次のコマンドを使用して、jdb を VM に接続できます。C:\> jdb -attach jdbconnデバッガを VM に接続するにはほかにもさまざまな方法があり、すべて jdb でサポートされています。 接続オプションについては、Java Platform Debugger Architecture のドキュメントを参照してください。
基本 jdb コマンド
基本的な jdb コマンドの一覧を示します。 Java デバッガがサポートするコマンドはこれ以外にもあり、それらは jdb の help コマンドを使用して表示できます。
- help または ?
- もっとも重要な jdb コマンド help は、認識されたコマンドのリストに簡潔な説明を付けて表示します。
- run
- jdb を起動して必要なブレークポイントを設定したあとに、このコマンドを使用して、デバッグするアプリケーションの実行を開始できます。 このコマンドは、既存の VM に接続している場合とは異なり、デバッグするアプリケーションが jdb から起動したときにだけ使用できます。
- cont
- ブレークポイント、例外、またはステップ実行のあとで、デバッグするアプリケーションの実行を継続します。
- Java オブジェクトおよびプリミティブ値を表示します。 プリミティブ型の変数またはフィールドの場合には、実際の値が出力されます。 オブジェクトの場合には、短い説明が出力されます。 オブジェクトについては、以降の dump コマンドの説明を参照してください。
注: 局所変数を表示するには、その変数を含むクラスが javac -g オプションでコンパイルされていなければなりません。
print では、メソッドの呼び出しを含む多数の簡単な Java 式がサポートされています。次に例を示します。
- print MyClass.myStaticField
- print myObj.myInstanceField
- print i + j + k (i、j、および k はプリミティブであり、フィールドまたは局所変数のいずれか)
- print myObj.myMethod() (myMethod が null 以外を返す場合)
- print new java.lang.String("Hello").length()
- dump
- プリミティブ値の場合には、このコマンドは print と同じです。オブジェクトの場合には、オブジェクト内に定義されている各フィールドの現在の値が出力されます。 static フィールドと instance フィールドが出力されます。
dump コマンドでは、print コマンドと同じ式がサポートされます。
- threads
- 現在実行中のスレッドを一覧表示します。 スレッドごとに、名前と現在の状態、およびほかのコマンドに使用できるインデックスが出力されます。次に例を示します。
この例では、スレッドインデックスは 4 であり、スレッドは java.lang.Thread のインスタンスです。スレッドの名前は「main」であり、現在実行中です。4. (java.lang.Thread)0x1 main running- thread
- 現在のスレッドにするスレッドを選択します。 多くの jdb コマンドは、現在のスレッドの設定に基づいて実行されます。 スレッドは、threads コマンドで説明したスレッドインデックスとともに指定します。
- where
- 引数を指定しないで
where
を実行すると、現在のスレッドのスタックがダンプされます。where all
コマンドは、現在のスレッドグループにあるスレッドのスタックを、すべてダンプします。where
threadindex は、指定スレッドのスタックをダンプします。現在のスレッドが (ブレークポイントか suspend コマンドによって) 中断している場合は、局所変数とフィールドは print コマンドと dump コマンドで表示できます。 up コマンドと down コマンドで、どのスタックフレームをカレントにするかを選ぶことができます。
ブレークポイント
ブレークポイントは、行番号またはメソッドの最初の命令で jdb に設定できます。次に例を示します。
- stop at MyClass:22 (MyClass が含まれるソースファイルの 22 行目の最初の命令にブレークポイントを設定)
- stop in java.lang.String.length (java.lang.String.length メソッドの最初にブレークポイントを設定)
- stop in MyClass.<init> (<init> は MyClass コンストラクタを識別)
- stop in MyClass.<clinit> (<clinit> は MyClass の静的初期化コードを識別)
メソッドがオーバーロードされている場合には、メソッドの引数の型も指定して、ブレークポイントに対して適切なメソッドが選択されるようにしなければなりません。 たとえば、「MyClass.myMethod(int,java.lang.String)」または「MyClass.myMethod()」と指定します。
clear コマンドは、「clear MyClass:45」のような構文を使用してブレークポイントを削除します。 clear を使用するか、引数を指定しないでコマンドを使用すると、現在設定されているすべてのブレークポイントが表示されます。 cont コマンドは実行を継続します。
ステップ実行
step コマンドは、現在のスタックフレームまたは呼び出されたメソッド内で、次の行を実行します。 next コマンドは、現在のスタックフレームの次の行を実行します。例外
スローしているスレッドの呼び出しスタック上のどこにも catch 文がない場合に例外が発生すると、VM は通常、例外トレースを出力して終了します。 ただし、jdb 環境で実行している場合は、例外が発生すると jdb に制御が戻ります。 次に、jdb を使用して例外の原因を診断します。catch コマンドを使用すると、デバッグしているアプリケーションはほかの例外がスローされたときに停止します。 たとえば、「catch java.io.FileNotFoundException」または「catch mypackage.BigTroubleException」のようにします。 例外が特定のクラス (またはサブクラス) のインスタンスの場合は、アプリケーションは例外がスローされた場所で停止します。
ignore コマンドを使うと、以前の catch コマンドの効果が無効になります。
注: ignore コマンドでは、デバッグされる VM は例外を無視せず、デバッガだけが例外を無視します。
コマンド行オプション
コマンド行で Java アプリケーション起動ツールの代わりに jdb を使用する場合、jdb は、-D、-classpath、-X<option> など、java コマンドと同じ数のオプションを受け入れます。jdb は、そのほかに次のオプションを受け入れます。
デバッガとデバッグを行う VM を接続するための代替機構に対して、その他のオプションがサポートされています。 その他の接続オプションについては、Java Platform Debugger Architecture のドキュメントを参照してください。
- -sourcepath <dir1;dir2;...>
- 指定されたパスを使用して、ソースファイルを検索します。 このオプションが指定されていない場合は、デフォルトパスの「.」が使われます。
- -attach <address>
- デフォルトの接続機構を使用して、すでに実行中の VM にデバッガを接続します。
- -tclassic
- デバッグするアプリケーションを従来の VM 環境で起動します。
- -launch
- デバッグするアプリケーションを jdb の起動後ただちに起動します。 このオプションによって、run コマンドを使用する必要がなくなります。 デバッグするアプリケーションは、起動後、初期アプリケーションクラスがロードされる直前に停止します。 その時点で、必要なブレークポイントを設定し、cont を使用して実行を継続できます。
関連項目