jdb(1)

名前
jdb - Javaプラットフォーム・プログラムのbugを検出および修正します。

概要

    jdb [options] [classname] [arguments]

options
    コマンド行オプション。オプションを参照してください。

classname
    デバッグするメイン・クラスの名前。

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

説明

Javaデバッガ(JDB)は、Javaクラス用の簡単なコマンド行デバッガです。jdbコマンドとそのオプションはJDBを呼び出します。jdbコマンドは、JDBA (Java Platform Debugger Architecture)を視覚的に実行し、ローカルまたはリモートのJava Virtual Machine (JVM)の検査とデバッグを行うことができます。Java Platform Debugger Architecture (JDBA) (http://docs.oracle.com/javase/8/docs/technotes/guides/jpda/index.html)を参照してください。

  JDBセッションの開始

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

    jdb MyClass

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

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

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

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

    jdb -attach 8000

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

デバッガをJVMに接続するには他にも様々な方法があり、すべてjdbコマンドでサポートされています。接続オプションについては、Java Platform Debugger Architectureのドキュメントを参照してください。

  基本jdbコマンド

基本的なjdbコマンドの一覧を示します。JDBがサポートするコマンドはこれ以外にもあり、それらは-helpオプションを使用して表示できます。

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

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

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

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

    注意: ローカル変数を表示するには、含んでいるクラスがjavac -gオプションを使用してコンパイルされている必要があります。

    printコマンドは、次に示すような、メソッド呼出しを使用したものなど、多くの簡単なJava式をサポートします。

        print MyClass.myStaticField
        print myObj.myInstanceField
        print i + j + k (i, j, k are primities and either fields or local variables)
        print myObj.myMethod() (if myMethod returns a non-null)
        print new java.lang.String("Hello").length()

dump
    プリミティブ値の場合、dumpコマンドはprintコマンドと同一です。オブジェクトの場合、dumpコマンドでは、オブジェクト内に定義されている各フィールドの現在の値が出力されます。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.<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は特定の例外を無視せず、デバッガのみを無視します。

オプション

コマンド行でjavaコマンドのかわりにjdbコマンドを使用する場合、jdbコマンドは、-D、-classpath、-Xなど、javaコマンドと同じ数のオプションを受け入れます。jdbコマンドは、その他に次のリストにあるオプションを受け入れます。

デバッグを行うJVMにデバッガを接続するための代替機構を提供するために、その他のオプションがサポートされています。これらの接続の代替に関する詳細なドキュメントは、Java Platform Debugger Architecture (JPDA) (http://docs.oracle.com/javase/8/docs/technotes/guides/jpda/index.html)を参照してください

-help
    ヘルプ・メッセージを表示します。

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

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

-listen address
    実行中のJVMが標準のコネクタを使用して指定されたアドレスに接続するのを待機します。

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

-listconnectors
    このJVMで利用できるコネクタを一覧表示します。

-connect connector-name:name1=value1
    一覧表示された引数の値と指定のコネクタを使用してターゲットJVMに接続します。

-dbgtrace [flags]
    jdbコマンドのデバッグの情報を出力します。

-tclient
    Java HotSpot VMクライアント内でアプリケーションを実行します。

-tserver
    Java HotSpot VMサーバー内でアプリケーションを実行します。

-Joption
    JVMにoptionを渡します。optionには、Javaアプリケーション起動ツールのリファレンス・ページに記載されているオプションを1つ指定します。たとえば、-J-Xms48mと指定すると、スタートアップ・メモリーは48MBに設定されます。java(1)を参照してください。

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

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

-Dname=value
    システム・プロパティを設定します。

-classpath dir
    クラスを検索するための、コロンで区切って指定されたディレクトリのリスト。

-Xoption
    非標準ターゲットJVMオプションです。

関連項目

    • javac(1)

    • java(1)

    • javah(1)

    • javap(1)