jdb(1) 基本ツール jdb(1)

# 名前

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

# 概要

```
jdb [options] [classname] [arguments]
```

*options*

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

*class*name

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

*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セッションを開始するには様々な方法があります。最も頻繁に使用されるのは、デバッグするアプリケーションのメイン・クラスを使用して、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.&lt;clinit&gt;**は、**&lt;clinit&gt;**を使用して、**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サーバー内でアプリケーションを実行します。

-J*option*

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

# デバッガ・プロセスに転送されるオプション

-v -verbose\[:*class*|gc|jni]

冗長モードにします。

-D*name*=*value*

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

-classpath *dir*

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

-X*option*

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

# 関連項目

•[javac(1)](/man/os/openjdk-11/javac.1)

•[java(1)](/man/os/openjdk-11/java.1)

•[javap(1)](/man/os/openjdk-11/javap.1)

2013年11月21日 JDK 8

---

Document: jdb(1) from openjdk-11 11.0.32.1-r5 (Chainguard OS)
Source: https://github.com/openjdk/jdk11u.git
