说明:这里主要描述,如何通过IDEA开发工具实现远程DEBUG调试。
开发环境:JDK 8
开发工具:IDEA 2019
一、什么是远程DEBUG调试?
通俗的说,远程DEBUG就是断点打在本地环境, 但是代码是跑在远端的。
二、为什么使用远程DEBUG?
一般我们写完代码都会先在本地进行接口自测。如果发现问题,可以直接开启DEBUG模式,进行问题的定位、排查和解决。但往往有些时候,本地自测是没问题的,可是测试环境、生产环境却出了问题。
“这.......我本地测试确实没问题..........”
“还敢狡辩,给我查,查不出来的话.........”
既然问题出现了,那就想办法解决白。可是问题出现在线上,本地又复现不了.....有时候日志也排查不出来......这可咋整?
三、实现远程DEBUG的原理
Debugger 和 Target VM分别在各自的进程中运行,他们之间的通信协议就是 JDWP。
JDWP(Java DEbugger Wire Protocol):即Java调试线协议,是一个为Java调试而设计的通讯交互协议,它定义了调试器(如:IDEA工具)和被调试程序(服务器虚拟机中运行的程序)之间传递的信息的格式。通过该协议,Debugger 端(本地)可以和 target VM(服务器上运行的程序) 进行通信,可以获取目标 VM的类、对象、线程等信息。
JVM本身提供了一个调试工具JDB,支持设置断点及线程级的调试,不同的JVM通过接口的协议进行联系,使得本地的环境可以远程JVM建立联系和通信。像IDEA、Eclipse只是做了这一层的支持。
四、IDEA中如何实现远程DEBUG?
4.1、POM依赖中配置jvmArguments
pom依赖中需添加【jvmArguments】配置。添加完此配置,打包后的项目发布到服务器上,可支持远程DEBUG。具体操作如下:
org.springframework.boot
spring-boot-maven-plugin
-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
具体参数详解:
【-Xdebug】:通知JVM工作在DEBUG模式下。
【-Xrunjdwp】:通知JVM使用(Java debug wire protocol)运行调试环境。
【transport】:指定调试数据的传送方式,dt_socket是指用SOCKET模式,另有dt_shmem指用共享内存方式。据说:dt_shmem只适用于Windows平台。
【address】:调试服务器的端口号,客户端用来连接服务器的端口号(一般工具中默认5005端口)。
【server=y/n】:VM 是否需要作为调试服务器执行(选择y)。
【suspend=y/n】:是否在调试客户端建立连接之后启动 VM。
4.2、打JAR包
4.3、部署JAR运行时配置参数
jar文件上传到服务器之后,运行jar文件需要配置参数。
执行以下命令:
nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar test-0.0.1-SNAPSHOT.jar &
JDK版本不同,JVM参数也是不同的(感兴趣的话可以自行了解下),这里以jdk8版本为例进行远程调试。
关于-agentlib:
Java Agent (Java 探针 ),在 JDK1.5 引入的,是一种可以动态修改 Java 字节码的技术。Java 类编译之后形成字节码被 JVM 执行,在 JVM 执行这些字节码之前获取到该字节码信息,通过字节码转换器对这些字节码进行修改,可以指定一些功能。
比如常见的java代码做调试,其实就利用了jre自带的jdwp agent来实现的,其中agentlib参数就是用来跟要加载的agent的名字,比如这里的jdwp。(更多了解,认准官网)
可通过 ps -ef | grep java 命令查看运行中的jar。
4.4、IDEA中配置RemotDebug
1、点击Edit Configurations---->点击新增---->选择Remote
可以看到默认的配置,如下图。
我们进行自定义配置,填写服务器IP和调试用的端口号。
运行IDEA进行远程调试。
验证远程DEBUG调试是否可行。(尝试打上断点,请求服务器端接口)
如下图所示,可以看到跳进了断点。
OK,这个时候我们就可以开始DEBUG了,是不是方便找问题了!
五、远程DEBUG调试的优、缺点?
优点:把断点打在本地,直接访问线上程序即可,方便调试。(线上程序出了问题,无法根据log进行排查时)。
缺点:可能会造成“阻塞”。(同一程序中,本地断点没走完之前,别的接口请求可能会“阻塞”)。
总结:使用这种方式,有利有弊,根据不同场景判断是否使用。