😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
还在为线上BUG苦苦找寻?试试IntelliJ IDEA远程调试线上Java程序
- 前言
- 远程调试的原理
- JDWP(Java Debug Wire Protocol)
- 开始配置
- ❶ 构建项目并配置启动参数部署
- ❷ 配置 IntelliJ IDEA
- ❸ 测试远程调试
- 总结
前言
相信很多小伙伴开发项目中,本地开发环境运行好好的,但在生产环境就会出现某些BUG,而定位复现BUG又成了开发者最苦恼的事情,且这是一个非常耗费时间且低效的过程,需要解决这个问题,那么我就需要借助 Java
调试线协议(JDWP
)开启远程调试,可以直接将线上项目在本地代码上Debug
。
远程调试是我们开发者日常工作中的重要技能之一,它可以帮助我们在生产环境中直接调试运行中的应用程序,快速发现并解决问题。博主将给大家将详细介绍在 IntelliJ IDEA
中如何进行远程调试 Java
程序。
远程调试的原理
远程调试是指通过开发工具(如 IntelliJ IDEA
)连接到远程运行的 Java
应用程序,从而在本地进行断点设置、变量查看和执行流程控制等调试操作。Java
提供了一套标准的调试协议(JDWP - Java Debug Wire Protocol
),允许调试器(IDE)与被调试程序(应用)之间进行通信。
JDWP(Java Debug Wire Protocol)
JDWP
是 Java 平台调试架构(JPDA
)的一部分,它定义了调试器与 Java 虚拟机(JVM
)之间通信的标准协议。JPDA
包括三部分:
- Java 虚拟机工具接口(JVMTI):JVM 级别的接口,用于监视和控制 Java 程序的执行
- Java 调试接口(JDI):高级Java API,供调试器使用,提供用户友好的调试功能
- Java 调试线协议(JDWP):调试器和 JVM 之间的通信协议
JDWP
负责在调试器和 JVM
之间传递调试命令和事件通知,包括设置断点
、单步执行
、查看变量
等操作。
- 调试器启动:IDE 启动调试器,并配置要连接的远程主机和端口
- 应用启动:Java 应用以调试模式启动,并监听指定的端口
- 建立连接:调试器与远程 JVM 通过套接字(Socket)建立连接
- 协议通信:调试器通过 JDWP 向 JVM 发送调试命令,JVM 处理命令并返回结果
工作中我们的调试流程可能如下图:
开始配置
❶ 构建项目并配置启动参数部署
首先构建我们的 Spring Boot 项目,简单创建一个接口
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class JDWPController {
@GetMapping("/jvm")
public String testJvm(){
System.out.println("调试进入");
System.out.println("使用循环为了测试进行远程调试时远程程序依然是运行的状态");
int count = 0;
for (int i = 0; i < 10; i++) {
try {
count++;
System.out.println("count:" + count);
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "success";
}
}
maven
打包构建项目,将 jar
文件在另外一台虚拟机上启动运行,命令如下
your-application.jar 替换你的 jar 包名称
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar your-application.jar
参数解释
- -agentlib:jdwp:启用 JDWP 调试代理
- transport=dt_socket:使用套接字进行通信
- tserver=y:开启调试服务器模式
- suspend=n:应用启动后不暂停,立即运行
- address=*:5005:调试服务器监听在 5005 端口上(自行修改自己需要端口)
出现上图端口监提示,表示开启远程调试并且远程端口是5005
❷ 配置 IntelliJ IDEA
在项目中进行以下配置 Edit Configurations
弹出窗口 点击左上角的 +
号,选择 Remote JVM Debug
,创建一个新的远程调试配置
主要简单配置几个参数 ,配置如下:
设置我们需要测试的接口断点,开启远程调试
温馨提示
如果出现 Unable to open debugger port
错误,是因为我们的远程服务器端口未开放
开放端口,博主以本地虚拟机 centos
为例:
# 开放5005端口
firewall-cmd --zone=public --add-port=5005/tcp --permanent
#重启firewall
systemctl restart firewalld
#查看开放端口
firewall-cmd --zone=public --list-ports
❸ 测试远程调试
上述步骤都完成且通过后,访问我们的测试接口 http://192.168.1.22:9090/api/jvm
,可以看到已经进入了我们本地代码的DEBUG
总结
通过本文的介绍,相信小伙伴们应该已经了解了在 IntelliJ IDEA
中进行远程调试 Java
程序的基本原理和具体步骤。
本文的代码主要是演示使用,小伙伴们可以根据自己业务需求进行修改升级。如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论。