Java デバッグオプション (JDWP)


f:id:Naotsugu:20190925225902p:plain

JVMデバッグを有効にするには Javaデバッグワイヤプロトコル(JDWP)エージェントを有効にします。

デバッグを有効にした場合、オーバーヘッドが生じることに加え、セキュリティ上の問題となる場合がありますので、本番環境では使用してはなりません。



Java5 以降の場合 -agentlib:jdwp オプションを使います。

-agentlib:jdwp=<name1>[=<value1>],<name2>[=<value2>]...


Java5 より前の場合 -Xdebug および -Xrunjdwp オプションを使います。

-Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...



大抵は以下のような感じになります。

$ java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar hello.jar



JDWP オプション

オプションには以下のものがあります。

名前 説明
transport dt_socketdt_shmem でトランスポートの名前を指定する
server 「y」の場合はデバッガアプリケーションの接続を待機、「n」の場合はaddress で指定されたデバッガアプリケーションに接続する
suspend y にするとアタッチされるまでアプリケーションが停止する
address 接続用のトランスポートアドレス
timeout ミリ秒単位で接続タイムアウトを指定する
launch JDWP の初期化が完了したときに、この文字列に指定されたプロセスを起動する
onthrow 特定のクラスの例外がスローされるまで JDWP ライブラリの初期化を遅延する
onuncaught 「y」の場合は、uncaught 例外がこの VM にスローされるまで JDWP ライブラリの初期化を遅延する



Spring Boot

Gradle で Spring Boot の bootRun するには以下のように指定します。

bootRun {
    jvmArgs "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
}

gradlew bootRun するとデバッグモードで起動します。


以下のようにコマンドラインで指定する場合、

$ gradlew bootRun -Dagentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

build.gradle には以下のように指定します。

bootRun {
   systemProperties = System.properties
}



その他のアプリケーションサーバ

Tomcat

起動スクリプトで jpda を指定します。

$ catalina.sh jpda start

8000 ポートでリスンします。


Wildfly

起動スクリプト standalone.sh–-debug を指定します。

$ $WFLY_HOME/bin/standalone.sh --debug

デフォルトで 8787 ポートでリスンします。

--debug 5005 のようにポートを指定できます。


Glassfish

起動スクリプトasadmin--debug を指定します。

$ asadmin start-domain --debug

デフォルトで9009 ポートでリスンします。