Java 远程调试

2023-05-24 1688点热度 0条评论

什么是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 数据发还给后端。

环境配置

前提

  1. 远程调试的Java项目要和本地的代码一致;
  2. 如果是War需要对服务器Tomcat的启动配置进行修改;
  3. 如果是Docker中使用Tomcat运行War则需要对容器添加一个新端口;

配置

远程Tomcat添加启动参数并重启使之生效。

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
参数必须可选值说明
-Xdebugyjvm在调试模式下启动
-Xnoagentn禁用默认sun.tools.debug调试器
-Djava.compilernNONE因为是调试场景,故而不需要编译耗时比较久的JIT,此参数用来禁用JIT编译,只使用解释器转译
-Xrunjdwpy使用jdwp进行通讯
transportydt_socket
dt_shmem
dt_socket基于套接字传输,dt_shmem基于共享内存
serverny/njvm是否以server模式运行
addressy5005服务器暴露的端口号,客户端可通过此端口连接
suspendny/n服务端jvm是否在客户端启动之后启动
onthrown产生指定类型的异常时jvm会被中断并进行调试
launchn当jvm被中断时执行的可执行程序
参数

以DockerFile为例

调试

首先需要确保远程调试服务已经正常运行,若存在防火墙则需要将其放行。

创建一个新的调试配置

完!

Jalena

原创内容,转载请注明出处! 部分内容来自网络,请遵守法律适用!

文章评论