IDEA实现远程DEBUG调试 “来了老弟~~“

说明:这里主要描述,如何通过IDEA开发工具实现远程DEBUG调试。
开发环境:JDK 8
开发工具:IDEA 2019

一、什么是远程DEBUG调试?

通俗的说,远程DEBUG就是断点打在本地环境, 但是代码是跑在远端的。

二、为什么使用远程DEBUG?

一般我们写完代码都会先在本地进行接口自测。如果发现问题,可以直接开启DEBUG模式,进行问题的定位、排查和解决。但往往有些时候,本地自测是没问题的,可是测试环境、生产环境却出了问题。
IDEA实现远程DEBUG调试 “来了老弟~~“_第1张图片

“这.......我本地测试确实没问题..........”
“还敢狡辩,给我查,查不出来的话.........”

既然问题出现了,那就想办法解决白。可是问题出现在线上,本地又复现不了.....有时候日志也排查不出来......这可咋整?

别急别急!这不,远程DEBUG他来了,他来了!!!
IDEA实现远程DEBUG调试 “来了老弟~~“_第2张图片

三、实现远程DEBUG的原理

实现原理:
IDEA实现远程DEBUG调试 “来了老弟~~“_第3张图片

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
   

IDEA实现远程DEBUG调试 “来了老弟~~“_第4张图片

具体参数详解:

【-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包

IDEA实现远程DEBUG调试 “来了老弟~~“_第5张图片
jar包在target目录下:
IDEA实现远程DEBUG调试 “来了老弟~~“_第6张图片

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

IDEA实现远程DEBUG调试 “来了老弟~~“_第7张图片

可以看到默认的配置,如下图。

IDEA实现远程DEBUG调试 “来了老弟~~“_第8张图片

我们进行自定义配置,填写服务器IP和调试用的端口号。

IDEA实现远程DEBUG调试 “来了老弟~~“_第9张图片

运行IDEA进行远程调试。

IDEA实现远程DEBUG调试 “来了老弟~~“_第10张图片

验证远程DEBUG调试是否可行。(尝试打上断点,请求服务器端接口)

IDEA实现远程DEBUG调试 “来了老弟~~“_第11张图片

如下图所示,可以看到跳进了断点。

IDEA实现远程DEBUG调试 “来了老弟~~“_第12张图片

OK,这个时候我们就可以开始DEBUG了,是不是方便找问题了!

五、远程DEBUG调试的优、缺点?

优点:把断点打在本地,直接访问线上程序即可,方便调试。(线上程序出了问题,无法根据log进行排查时)。

缺点:可能会造成“阻塞”。(同一程序中,本地断点没走完之前,别的接口请求可能会“阻塞”)。

总结:使用这种方式,有利有弊,根据不同场景判断是否使用。

你可能感兴趣的:(java)