什么是JDWP?
JDWP(Java Debug Wire Protocol)是一个为 Java 调试而设计的一个通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。在 JPDA 体系中,作为前端(front-end)的调试者(debugger)进程和后端(back-end)的被调试程序(debuggee)进程之间的交互数据的格式就是由 JDWP 来描述的,它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的 JVMTI 和 JDI 的通信通畅。比如在 Sun 公司提供的实现中,它提供了一个名为 jdwp.dll(jdwp.so)的动态链接库文件,这个动态库文件实现了一个 Agent,它会负责解析前端发出的请求或者命令,并将其转化为 JVMTI 调用,然后将 JVMTI 函数的返回值封装成 JDWP 数据发还给后端。
环境配置
前提
- 远程调试的Java项目要和本地的代码一致;
- 如果是War需要对服务器Tomcat的启动配置进行修改;
- 如果是Docker中使用Tomcat运行War则需要对容器添加一个新端口;
配置
远程Tomcat添加启动参数并重启使之生效。
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
参数 | 必须 | 可选值 | 说明 |
---|---|---|---|
-Xdebug | y | jvm在调试模式下启动 | |
-Xnoagent | n | 禁用默认sun.tools.debug调试器 | |
-Djava.compiler | n | NONE | 因为是调试场景,故而不需要编译耗时比较久的JIT,此参数用来禁用JIT编译,只使用解释器转译 |
-Xrunjdwp | y | 使用jdwp进行通讯 | |
transport | y | dt_socket dt_shmem | dt_socket基于套接字传输,dt_shmem基于共享内存 |
server | n | y/n | jvm是否以server模式运行 |
address | y | 5005 | 服务器暴露的端口号,客户端可通过此端口连接 |
suspend | n | y/n | 服务端jvm是否在客户端启动之后启动 |
onthrow | n | 产生指定类型的异常时jvm会被中断并进行调试 | |
launch | n | 当jvm被中断时执行的可执行程序 |
以DockerFile为例
调试
首先需要确保远程调试服务已经正常运行,若存在防火墙则需要将其放行。
创建一个新的调试配置
完!
文章评论