Java远程调试的原理
JDWP(Java Debug Wire Protocol)
两个VM之间通过debug协议进行通信,然后以达到远程调试的目的。两者之间可以通过socket进行通信。
其中,调试的程序常常被称为debugger, 而被调试的程序称为 debuggee。
应用场景
当你的开发环境在Window,又在远端linux Server或者移动平台上运行Java应用程序,Java提供了一系列的接口和协议让本地Java文件于远端JVM建立联系和通信。
Java 调试器架构
从下往上读架构,大致可以解读为: 用于调试的程序使用UI,通过Protocol,调用远端JVM进程。
实质还是JVM,只要确保本地Java 源代码与目标应用程序一致,本地的Java源码就可以用socket连接到远端的JVM,进而执行调试。
在Socket Attach模式下,本地只需要有源码,Java应用程序根本不用启动。
Socket Attach方式:
实际操作
首先被debug程序的虚拟机在启动时要开启debug模式,启动debug监听程序。
在启动程序时,将以下参数选项添加到自定义的命令行中,程序就会以支持RemoteDeubg的方式启动。
wrapper.java.additional.1=-Xdebug
wrapper.java.additional.2=-Xrunjdwp:transport=dt_socket,server=y,address=7899,suspend=n
DEBUG选项参数的意思
-XDebug 启用调试;
-Xrunjdwp 加载JDWP的JPDA参考执行实例;
transport 用于在调试程序和VM使用的进程之间通讯;
dt_socket 套接字传输;
server=y/n VM是否需要作为调试服务器执行;
address=7899 调试服务器监听的端口号;
suspend=y/n 是否在调试客户端建立连接之后启动 VM 。
然后用一个debug客户端去debug远程的程序,如:用Eclipse自带的debug客户端,填写运行被debug程序的虚拟机监听的端口号和地址,选择connect方式为attach。
在程序中打好断点,打开Eclipse配置
Run-->Debug Configurations…-->Remote java Application-->右键New-->填写Host和Port(例如,Host:10.75.0.103,Port:7899)-->Debug
注意,如果 Java 源代码与目标应用程序不匹配,调试特性将不能正常工作。
选择 Allow termination of remote VM 选项 可以在应用程序调试期间终止连接
这样远程调试连接上之后,就可以像在本地调试Java程序一样来调试远端的Java应用程序。
IDE快捷键
Eclipse debug快捷键
F5 Step into
F6 Step over
F7 Step out
F8 continue to the next breakpoint
Intellij debug的快捷键
F7,Step into
F8,Step over
Shift+F8, Step out
Alt+F9,运行至光标处
F9,恢复程序