リモートDebug Javaプロセスの方法

4245 ワード

テキストアドレス
リモート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実行
  • IDEAリモートデバッグを使用します.私たちはまずctrl+cでプロセスを停止します.
    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を先の実行コマンドに追加します.
    このように:java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar target/debug-simple-app.jar4)下図のデバッグボタンをクリックしてデバッグを開始
    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
  • に捨てる
  • にアクセスhttp://localhost:8080/debug-tomcat-app/hello結果
  • 今、IDEAでdebugをします.では、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リファレンスドキュメント
  • Debug your Java code with ease using JPDA
  • JPDA Connection and Invocation
  • Oracle VM Invocation Options