jdb - Java デバッガ

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

形式

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

説明

Java デバッガ jdb は、Java クラス用の簡単なコマンド行デバッガです。Java Platform Debugger Architecture を視覚的に実行し、ローカルまたはリモートの Java Virtual Machine の検査とデバッグを行うことができます。

jdb セッションの開始

jdb セッションを開始するにはさまざまな方法があります。もっとも頻繁に使われるのは、デバッグするアプリケーションのメインクラスを使用して、jdb から新しい Java 仮想マシン (VM) を起動する方法です。コマンド行で、 java の代わりに jdb コマンドを入力します。たとえば、アプリケーションのメインクラスが MyClass の場合は、JDB 環境でデバッグするときに次のコマンドを使用します。
C:\> jdb MyClass 
この方法で起動すると、jdb は、指定されたパラメータを使って 2 つ目の Java VM を呼び出します。 次に、指定されたクラスをロードして、クラスの最初の命令を実行する前に VM を停止させます。

jdb のもう 1 つの使用方法は、すでに起動している Java VM に jdb を接続することです。jdb を使用してデバッグする VM は、次のオプションを使用して起動しなければなりません。

オプション 目的
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n インプロセスデバッグ用ライブラリをロードし、接続の種類を指定する

たとえば、次のコマンドは、MyClass アプリケーションを実行して、jdb があとでそのアプリケーションに接続できるようにします。

C:\> java -agentlib:jdwp=transport=dt_shmem,address=jdbconn,server=y,suspend=n MyClass
次のコマンドを使用して、jdb を VM に接続できます。
C:\> jdb -attach jdbconn 
この場合、jdb は新しい VM を起動する代わりに既存の VM に接続されるため、jdb コマンド行には「MyClass」は指定しません。

デバッガを VM に接続するにはほかにもさまざまな方法があり、すべて jdb でサポートされています。接続オプションについては、Java Platform Debugger Architecture のドキュメントを参照してください。jdb で使用するために J2SE 1.4.2 以前の VM を起動する方法については、1.4.2 のドキュメントを参照してください。

基本 jdb コマンド

基本的な jdb コマンドの一覧を示します。Java デバッガがサポートするコマンドはこれ以外にもあり、それらは jdbhelp コマンドを使用して表示できます。
help または ?
もっとも重要な jdb コマンド help は、認識されたコマンドのリストに簡潔な説明を付けて表示します。
run
jdb を起動して必要なブレークポイントを設定したあとに、このコマンドを使用して、デバッグするアプリケーションの実行を開始できます。このコマンドは、既存の VM に接続している場合とは異なり、デバッグするアプリケーションが jdb から起動したときにだけ使用できます。
cont
ブレークポイント、例外、またはステップ実行のあとで、デバッグするアプリケーションの実行を継続します。
print
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)0x1 main      running
この例では、スレッドインデックスは 4 であり、スレッドは java.lang.Thread のインスタンスです。 スレッドの名前は「main」であり、現在実行中です。
thread
現在のスレッドにするスレッドを選択します。多くの jdb コマンドは、現在のスレッドの設定に基づいて実行されます。スレッドは、threads コマンドで説明したスレッドインデックスとともに指定します。
この例では、
引数を指定しないで 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 コマンドは、現在のスタックフレームの次の行を実行します。

Exceptions

スローしているスレッドの呼び出しスタック上のどこにも 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 は、そのほかに次のオプションを受け入れます。

-help
ヘルプメッセージを表示します。
-sourcepath <dir1:dir2:...>
指定されたパスを使用して、ソースファイルを検索します。このオプションが指定されていない場合は、デフォルトパスの「.」が使われます。
-attach <address>
デフォルトの接続機構を使用して、すでに実行中の VM にデバッガを接続します。
-listen <address>
実行中の VM が標準のコネクタを使って指定されたアドレスに接続するのを待機します。
-listenany
実行中の VM が標準のコネクタを使って利用可能な任意のアドレスに接続するのを待機します。
-launch
デバッグするアプリケーションを jdb の起動後ただちに起動します。このオプションによって、run コマンドを使用する必要がなくなります。デバッグするアプリケーションは、起動後、初期アプリケーションクラスがロードされる直前に停止します。その時点で、必要なブレークポイントを設定し、cont を使用して実行を継続できます。
-listconnectors
この VM で利用できるコネクタを一覧表示します。
-connect <connector-name>:<name1>=<value1>,...
一覧表示された引数の値と指定のコネクタを使ってターゲット VM に接続します。
-dbgtrace [flags]
jdb のデバッグ情報を出力します。
-tclient
Java HotSpot(tm) VM (クライアント) 内でアプリケーションを実行します。
-tserver
Java HotSpot(tm) VM (サーバー) 内でアプリケーションを実行します。
-Joption
jdb の実行に使用される Java 仮想マシンに option を渡します。(アプリケーション Java 仮想マシンに対するオプションは、run コマンドに渡される)。たとえば、-J-Xms48m と指定すると、スタートアップメモリーは 48M バイトに設定されます。

デバッガとデバッグを行う VM を接続するための代替機構に対して、その他のオプションがサポートされています。その他の接続オプションについては、Java Platform Debugger Architecture のドキュメントを参照してください。

デバッグ対象のプロセスに転送されるオプション

-v -verbose[:class|gc|jni]
冗長モードにします。
-D<name>=<value>
システムプロパティーを設定します。
-classpath <directories separated by ":">
クラスを検索するディレクトリを一覧表示します。
-X<option>
非標準ターゲット VM オプションです。

関連項目

javacjavajavahjavapjavadoc


Copyright © 2002-2006 Sun Microsystems, Inc. All Rights Reserved.

Sun
Java Software