jdb(1)

名前
jdb - Java デバッガ

形式
jdb [ options ] [ class ] [ arguments ]

パラメータ

options
    コマンド行オプション

class
    デバッグを開始するクラス名

arguments
    クラスの main() メソッドに渡される引数

機能説明
Java デバッガの jdb は、 Java クラス用の単純なコマンド行デバッガです。 Java Platform Debugger Architecture を画面に表示しながら実行し、ローカルまたはリモートの Java Virtual Machine の検査とデバッグを行うことができます。

  jdb セッションの開始
jdb セッションを開始するにはさまざまな方法があります。 もっとも頻繁に使 われるのは、アプリケーションのメインクラスをデバッグして、 jdb から新しく Java Virtual Machine (VM) を起動する方法です。 コマンド行で、 java(1) の代わりに jdb コマンドを入力します。たとえば、アプリケーションのメインクラスが MyClass の場合は、次のコマンドを使用して jdb 環境でデバッグします。

    example% jdb MyClass

このようにして起動すると、 jdb は 2 つ目の Java VM を呼び出し、指定されたパラメータを渡し、 指定されたクラスをロードします。そのあと、 クラスの最初の命令を実行する前に VM を停止させます。

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

オプション | 目的
-Xdebug | VM 内でのデバッグのサポートを有効にする
-Xrunjdwp:transport=dt_socket, server=y,suspend=n | プロセス内デバッグライブラリをロードし、作成する接続の種類を指定する

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

    example% jdb -Xdebug \
       -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
    Class

次のコマンドで jdb を VM に接続できます。

    example% jdb -attach 8000

このとき、 jdb は新しい VM を起動するのではなく、既存の VM に接続するので、 jdb コマンド行で MyClass を指定しないことに注意してください。

これ以外にもデバッガ (jdb) を VM に接続する方法はたくさんあり、 jdb はそのすべての方法をサポートしています。 このような接続オプションについては、 Java Platform Debugger Architecture のマニュアルを参照してください。

  jdb 基本コマンド
以下に jdb 基本コマンドの一覧を示します。 Java デバッガで使用可能なその他のコマンドは、 help コマンドで表示できます。

なお局所 (スタック) 変数をブラウズするには、そのクラスが javac -g オプションでコンパイルされている必要があります。

cont
    ブレークポイント、例外、またはステップ実行のあとで、デバッグ中の アプリケーションの実行を継続します。

dump
    プリミティブ値の場合には、このコマンドは print と同じです。オブジェクトの場合には、オブジェクト内に定義されている 各フィールドの現在の値を出力します。 static フィールドと instance フィールドを出力します。

    dump コマンドは、 print コマンドと同じ式をサポートします。

help または ?
    jdb のコマンドの中でもっとも重要なのが、この help コマンドです。利用可能なコマンドの一覧を、 各コマンドの簡単な説明つきで表示します。

print
    Java オブジェクトおよびプリミティブ値を表示します。 プリミティブ型の変数 またはフィールドの場合には、実際の値を出力します。 オブジェクトの場合 には、短い説明を出力します。 オブジェクトについては、以降の dump コマンドの説明を参照してください。

    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()

thread
    現在のスレッドを選択します。 多くの jdb コマンドは、現在のスレッドの設定に基づいて実行されます。 スレッドは、 threads コマンドで説明するスレッドインデックスとともに指定します。

threads
    現在実行中のスレッドを一覧表示します。スレッドごとに、名前と現在の状態、 およびほかのコマンドに使用できるインデックスを出力します。次に例を 示します。

    4. (java.lang.Thread)0x1 main running

    この例では、スレッドインデックスは 4 であり、スレッドは java.lang.Thread のインスタンスです。スレッドの名前は「 main 」であり、現在実行中です。

run jdb を起動して必要なブレークポイントを設定したあとに、このコマンドを使用して、 デバッグするアプリケーションの実行を開始します。このコマンドは、 デバッグするアプリケーションを jdb から起動するときにだけ使用できます。 既存の VM に接続する場合とは異なります。

where
    引数のない where コマンドは、現在のスレッド ( thread コマンドで設定) のスタックをダンプします。 where all と指定すると、現在のスレッドグループにある全スレッドの スタックをダンプします。 where threadindex と指定すると、 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 コマンドは、「 clearMyClass:45 」のような構文を使用してブレークポイントを削除します。 引数を指定しないで clear コマンドを使用すると、現在設定されてい るすべてのブレークポイントが表示されます。 cont コマンドで実行が継続します。

  コマンドのステップ実行
step コマンドは、現在のスタックフレームまたは呼び出されたメソッド内で、 次の行を実行します。 next コマンドは、現在のスタックフレームの次の行を 実行します。

  例外処理用コマンド
スローしているスレッドの呼び出しスタック上のどこにも catch 文がないような 例外が発生すると、VM は通常、例外トレースを出力して終了します。 ただし、 jdb 環境で実行している場合は、このような例外が発生すると jdb に制御が戻ります。 次に、 jdb を使用して例外の原因を診断します。

catch
    デバッグ中のアプリケーションは他の例外がスローされたところで停止します。 次に例を示します。

    catch java.io.FileNotFoundException

    または

    catch mypackage.BigTroubleException

    例外が指定したクラス (または、サブクラス) のインスタンスである場合、 アプリケーションはスローされたところで停止します。

ignore
    以前の catch コマンドの効果を無効にします。なお、この指定によって例外を無視するのは デバッガだけであり、デバッグされた VM は無視しません。

オプション
コマンド行で Java アプリケーション起動ツールの代わりに jdb を使用する場合、 jdb
 は、 -D、 -classpath、 -Xoptionなど、 java(1) コマンドと同じオプションを多数使用できます。

jdb は、そのほかに次のオプションも使用できます。

-sourcepath dir1:dir2:...
    指定されたパスで、ソースファイルを検索します。 このオプションが 指定されていない場合は、デフォルトパスの「.」を検索します。

-attach address
    デフォルトの接続機構を使用して、すでに実行中の VM にデバッガを接続 します。

-launch
    デバッグするアプリケーションを jdb の起動後ただちに起動します。 このオプションを使用すると、 run コマンドを使用する必要はありません。 デバッグするアプリケーションは、 起動後、最初のアプリケーションクラスがロードされる直前に停止します。 その時点で、必要なブレークポイントを設定できます。 実行を継続するには cont コマンドを使用します。

-J option
    option を Java 仮想マシンに渡します。ここで、 option は、Java アプリケーション起動プログラム java(1) のマニュアルページで 説明されているオプションの 1 つです。たとえば、 -J-Xms48m は、起動時に使用するメモリを 48M バイトに設定します。 -J が基本にする仮想マシンにオプションを渡すことは、共通の規約です。

これ以外にも、デバッガをデバッグされる VM に接続するための代替機構 用のオプションがサポートされています。このような接続の代替機構については、 Java Platform Debugger Architecture のマニュアルを参照してください。

関連項目
java(1)、 javac(1)、 javadoc(1)、 javah(1)、 javap(1)