Java远程调试

Java远程调试需要修改命令行参数调用JDWP agent。

Java 5.0后续版本采用-agentlib:jdwp,参数使用方式:
-agentlib:jdwp=
加载JDWP实现

Java 5.0的版本之前的可以使用-Xdebug -Xrunjdwp进行代替。考虑到现阶段低版本JVM极少使用,不推荐此方式:
-Xdebug
开启调试模式
-Xrunjdwp:
加载JDWP实现

-agentlib:jdwp 和 -Xrunjdwp 可以通过sub-options指定参数,参数格式如下:

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

-agentlib:jdwp参数列表

参数名 必需 默认值 描述
help N/A 打印帮助信息并退出JVM
transport 连接调试器的传输协议
server “n” y表示监听并等待调试器,n表示直接绑定到address指定的调试器
adddress 若server=n则必需 “” 调试程序的地址
timeout “” 以ms为单位,超时时间,可以被具体实现忽略
launch 和onthrow、onuncaught共同提供实时调试。lanuch参数为JDWP初始化完成时调用的程序。
onthrow 仅在参数指定异常抛出后初始化JDWP
onuncaught “n” y表示在未捕获异常抛出时启动JDWP
suspend “y” y表示VMStartEvent的suspendPolicy为SUSPEND_ALL,n表示SUSPEND_NONE

示例:

-agentlib:jdwp=transport=dt_socket,server=y,address=8000
监听8000端口的连接,在main类加载之前暂停虚拟机(suspend默认为y)。在调试器连接后,可以发送JDWP指令到虚拟机。

-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000
仅监听本地8000的端口连接,若5秒之内调试器未绑定则停止JVM。在main类加载之前暂停虚拟机(suspend默认为y)。在调试器连接后,可以发送JDWP指令到虚拟机。

-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
监听共享的内存地址。运行JVM在调试器绑定之前执行。

-agentlib:jdwp=transport=dt_socket,address=myhost:8000
监听myhost的8000端口连接,在main类加载之前暂停虚拟机(suspend默认为y)。

-agentlib:jdwp=transport=dt_shmem,address=mysharedmemory
监听mysharedmemory地址的共享内存连接,在main类加载之前暂停虚拟机(suspend默认为y)。

-agentlib:jdwp=transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
监听8000端口的连接,在main类加载之前暂停虚拟机(suspend默认为y)。初始化后调用"/usr/local/bin/debugstub myHost:8000",等待异常java.io.IOException抛出。