还在为线上BUG苦苦找寻?试试IntelliJ IDEA远程调试线上Java程序

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

前言

相信很多小伙伴开发项目中,本地开发环境运行好好的,但在生产环境就会出现某些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 程序的基本原理和具体步骤。

本文的代码主要是演示使用,小伙伴们可以根据自己业务需求进行修改升级。如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论。


在这里插入图片描述

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Micro麦可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值