jdb(1)

名前
jdb - Javaデバッガ

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

形式

jdb [ options ] [ class ] [ arguments ]

    options
        次に示すコマンドライン・オプション

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

    arguments
        classのmain()メソッドに渡す引数

説明

Javaデバッガjdbは、Javaクラス用の簡単なコマンドライン・デバッガです。 Java Platform Debugger Architecture @
http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/index.htmlを視覚的に実行し、ローカルまたはリモートのJava Virtual Machineの検査とデバッグを行うことができます。

  jdbセッションの開始

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

 % jdb MyClass

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

jdbのもう1つの使用方法は、すでに実行中のJava VMにjdbを接続することです。jdbが接続するVMを、その実行中に起動するための構文を次に示します。これは、インプロセス・デバッグ用ライブラリをロードし、接続の種類を指定します。

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n

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

 % java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n MyClass

次のコマンドを使用して、jdbをVMに接続できます。

 % jdb -attach 8000

この場合、jdbは新しいVMを起動するかわりに既存のVMに接続されるため、jdbコマンドラインには「MyClass」は指定しません。

デバッガをVMに接続するには他にも様々な方法があり、すべてjdbでサポートされています。接続オプションについては、Java Platform Debugger Architectureの ドキュメント @
http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/conninv.htmlを参照してください。jdbで使用するためにJ2SE 1.4.2以前のVMを起動する方法については、 1.4.2のドキュメント @
http://docs.oracle.com/javase/1.4.2/docs/guide/jpda/conninv.htmlを参照してください。

  基本jdbコマンド

基本的なjdbコマンドの一覧を示します。Javaデバッガがサポートするコマンドはこれ以外にもあり、それらはjdbのhelpコマンドを使用して表示できます。

    helpまたは?
        最も重要なjdbコマンドhelpは、認識されたコマンドのリストに簡潔な説明を付けて表示します。

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

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

    print
        Javaオブジェクトおよびプリミティブ値を表示します。プリミティブ型の変数またはフィールドの場合には、実際の値が出力されます。オブジェクトの場合には、短い説明が出力されます。オブジェクトについては、以降のdumpコマンドの説明を参照してください。
        注意: ローカル変数を表示するには、その変数を含むクラスがjavac(1) -gオプションでコンパイルされている必要があります。
        printでは、メソッドの呼出しを含む多数の簡単なJava式がサポートされています。次に例を示します。

        o   print MyClass.myStaticField

        o   print myObj.myInstanceField

        o   print i+j+k (i、j、およびkはプリミティブであり、フィールドまたはローカル変数のいずれか)

        o   print myObj.myMethod() (myMethodがnull以外を返す場合)

        o   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を実行すると、現在のスレッドのスタックがダンプされます。where allコマンドは、現在のスレッド・グループにあるスレッドのスタックをすべてダンプします。where threadindexは、指定されたスレッドのスタックをダンプします。
        現在のスレッドが(ブレークポイントかsuspendコマンドによって)中断している場合は、ローカル変数とフィールドはprintコマンドとdumpコマンドで表示できます。upコマンドとdownコマンドで、どのスタック・フレームをカレントにするかを選ぶことができます。

  ブレークポイント

ブレークポイントは、行番号またはメソッドの最初の命令でjdbに設定できます。次に例を示します。

    o   stop at MyClass:22 (MyClassが含まれるソース・ファイルの22行目の最初の命令にブレークポイントを設定)

    o   stop in java.lang.String.length (java.lang.String.lengthメソッドの最初にブレークポイントを設定)

    o   stop in MyClass.<init> (<init>はMyClassコンストラクタを識別)

    o   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 java.io.FileNotFoundException」または「catch mypackage.BigTroubleException」のようにcatchコマンドを使用すると、デバッグされたアプリケーションは、他の例外がスローされたときに停止します。例外が特定のクラス(またはサブクラス)のインスタンスの場合は、アプリケーションは例外がスローされた場所で停止します。

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の ドキュメント @
http://docs.oracle.com/javase/7/docs/technotes/guides/jpda/conninv.htmlを参照してください。

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

    -v -verbose[:class|gc|jni]
        冗長モードにします。

    -D<name>=<value>
        システム・プロパティを設定します。

    -classpath <directories separated by ":">
        クラスを検索するディレクトリを一覧表示します。

    -X<option>
        非標準ターゲットVMオプションです。

関連項目

javac(1)、java(1)、javah(1)、javap(1)、javadoc(1)