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抛出。