リモートDebug Javaプロセスの方法
テキストアドレス
リモートdebugとは、Javaプロセスを起動し、debuggerプロセスを起動し、両者を接続し、debuggerを利用してdebug Javaプロセスを起動することを意味します.
実際、現在のIDEのdebug機能はすべてリモートdebug方式で実現されており、JDPA(Java Platform Debugger Architecture)という技術を利用しています.
JDPAではIDE開発時にdebugを行うほか、IDE attachを本番環境で実行中のJavaプロセスにdebugを行うこともできます(実際にはこの2つのシーンは本質的に同じです).
次に、Intellij IDEAを使用してJavaプロセスをデバッグする方法を2つの例で説明します.
Debug簡単なJavaアプリケーション
起動後2秒おきに増加する数字を印刷する簡単なJavaアプリケーションを作りました.
ソースコードはGithub debug-simple-app:実行 実行 IDEAリモートデバッグを使用します.私たちはまず
1)IDEAにプロジェクトを導入します.ソースコードがないと中断できませんから.
2)次の手順でRemote Run/Debug Configurationを新規作成します. 選択Remote 名前を変更したり、Usemodule classpathを設定したりする以外、残りのオプションは変更する必要はありません.デフォルトの行でいろいろなパラメータを説明します.Debugger mode:debuggerのモードで、attachとlistenの2種類があります. attachはdebuggerがdebugされたJavaプロセスに接続することを意味し、アクティブである. listenはdebuggerがJavaプロセスから送信された通信を傍受することを意味し、受動的である.
HostとPortはdebugされたJavaプロセスのHostとPortが設定されていますが、実際にはリモートDebugがネットワークを通じて行われていることも教えてくれます.
JDKオプションは、異なるJDKバージョンに基づいて異なるCommand line arguments for remote JVMを構築できます.
Command line arguments for remote JVMこのテキストボックスは変更できません.このJavaプロセスがリモートデバッグされるようにするには、これらのパラメータを追加する必要があることを示しています.ここのパラメータをコピーして、後で使えます.
Usemodule classpath、このオプションはそのmoduleのソースコードを使用してdebugを設定します.
3)先のCommand line arguments for remote JVMを先の実行コマンドに追加します.
このように:
Consoleに
5)debug-simple-appのコードにブレークポイントを打って効果を見る.
debug tomcatアプリケーション
実際にdebugのtomcatアプリケーションは前の例と大きな違いはありません.
ソースコードはGithub debug-tomcat-app:実行 に捨てるにアクセスhttp://localhost:8080/debug-tomcat-app/hello結果 今、IDEAでdebugをします.では、tomcatを止めてください.
1)同様にIDEAにプロジェクトを導入する必要がある
2)tomcatの
3)
上の
4)前の例と同様に、Remote Run/Debug Configurationを新規作成し、ポートを8000に設定して起動する
5)そしてブレークポイントを打ってみる
Tomcatのポートを変更したい場合はどうすればいいですか? Debug your Java code with ease using JPDA JPDA Connection and Invocation Oracle VM Invocation Options
リモートdebugとは、Javaプロセスを起動し、debuggerプロセスを起動し、両者を接続し、debuggerを利用してdebug Javaプロセスを起動することを意味します.
実際、現在のIDEのdebug機能はすべてリモートdebug方式で実現されており、JDPA(Java Platform Debugger Architecture)という技術を利用しています.
JDPAではIDE開発時にdebugを行うほか、IDE attachを本番環境で実行中のJavaプロセスにdebugを行うこともできます(実際にはこの2つのシーンは本質的に同じです).
次に、Intellij IDEAを使用してJavaプロセスをデバッグする方法を2つの例で説明します.
Debug簡単なJavaアプリケーション
起動後2秒おきに増加する数字を印刷する簡単なJavaアプリケーションを作りました.
ソースコードはGithub debug-simple-app:
mvn clean package
パッケージjava -jar target/debug-simple-app.jar
実行ctrl+c
でプロセスを停止します.1)IDEAにプロジェクトを導入します.ソースコードがないと中断できませんから.
2)次の手順でRemote Run/Debug Configurationを新規作成します.
HostとPortはdebugされたJavaプロセスのHostとPortが設定されていますが、実際にはリモートDebugがネットワークを通じて行われていることも教えてくれます.
JDKオプションは、異なるJDKバージョンに基づいて異なるCommand line arguments for remote JVMを構築できます.
Command line arguments for remote JVMこのテキストボックスは変更できません.このJavaプロセスがリモートデバッグされるようにするには、これらのパラメータを追加する必要があることを示しています.ここのパラメータをコピーして、後で使えます.
Usemodule classpath、このオプションはそのmoduleのソースコードを使用してdebugを設定します.
3)先のCommand line arguments for remote JVMを先の実行コマンドに追加します.
このように:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar target/debug-simple-app.jar
4)下図のデバッグボタンをクリックしてデバッグを開始Consoleに
Connected to the target VM, address: 'localhost:5005', transport: 'socket'
という言葉が出ていることに気づきます.これはdebuggerがattachに成功したことを示しています.5)debug-simple-appのコードにブレークポイントを打って効果を見る.
debug tomcatアプリケーション
実際にdebugのtomcatアプリケーションは前の例と大きな違いはありません.
Hello World
とアクセスされた回数を返す簡単なサーブレットを書きました.ソースコードはGithub debug-tomcat-app:
mvn clean package
パッケージtarget/debug-tomcat-app.war
をtomcat 1)同様にIDEAにプロジェクトを導入する必要がある
2)tomcatの
bin/catalina.sh jpda start
を実行し、tomcatをdebugできるようにする3)
jps -v | grep Bootstrap
Tomcatを見つけるプロセスを実行する:76905 Bootstrap -Djava.util.logging.config.file=...
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djdk.tls.ephemeralDHKeySize=2048
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-agentlib:jdwp=transport=dt_socket,address=localhost:8000,server=y,suspend=n
-Dcatalina.base=...
-Dcatalina.home=...
-Djava.io.tmpdir=...
上の
-agentlib...address=localhost:8000
パラメータに注意して、このポートを覚えてください.4)前の例と同様に、Remote Run/Debug Configurationを新規作成し、ポートを8000に設定して起動する
5)そしてブレークポイントを打ってみる
Tomcatのポートを変更したい場合はどうすればいいですか?
bin/catalina.sh
を見てみるとJPDA_TRANSPORT (Optional) JPDA transport used when the "jpda start"
command is executed. The default is "dt_socket".
JPDA_ADDRESS (Optional) Java runtime options used when the "jpda start"
command is executed. The default is localhost:8000.
JPDA_SUSPEND (Optional) Java runtime options used when the "jpda start"
command is executed. Specifies whether JVM should suspend
execution immediately after startup. Default is "n".
JPDA_OPTS (Optional) Java runtime options used when the "jpda start"
command is executed. If used, JPDA_TRANSPORT, JPDA_ADDRESS,
and JPDA_SUSPEND are ignored. Thus, all required jpda
options MUST be specified. The default is:
-agentlib:jdwp=transport=$JPDA_TRANSPORT,
address=$JPDA_ADDRESS,server=y,suspend=$JPDA_SUSPEND
JPDA_ADDRESS
環境変数パラメータを指定するだけでいいです.例えばJPDA_ADDRESS=5005 bin/catalina.sh jpda start
リファレンスドキュメント