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

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

一、什么是远程DEBUG调试?

通俗的说,远程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。具体操作如下:

<plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
   <configuration>
      <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n</jvmArguments>
   </configuration>
</plugin>

在这里插入图片描述
具体参数详解:

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

图片: https://uploader.shimo.im/f/G2xhSwr4QmoXzViX.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJhY2Nlc3NfcmVzb3VyY2UiLCJleHAiOjE2MzEwOTM3NTAsImciOiJLODM4S0NncnlZM1BWSnJxIiwiaWF0IjoxNjMxMDkzNDUwLCJ1c2VySWQiOjY1NTk2MjQ5fQ.-jqTgz7HeyC58jrovVaD898H87djzJCNpJlqbUl9Wb8
jar包在target目录下:
图片: https://uploader.shimo.im/f/ae3va0ihaxLmpjwQ.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJhY2Nlc3NfcmVzb3VyY2UiLCJleHAiOjE2MzEwOTM3NTAsImciOiJLODM4S0NncnlZM1BWSnJxIiwiaWF0IjoxNjMxMDkzNDUwLCJ1c2VySWQiOjY1NTk2MjQ5fQ.-jqTgz7HeyC58jrovVaD898H87djzJCNpJlqbUl9Wb8

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进行排查时)。

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

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

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值