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_socket や dt_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
ポートでリスンします。