手把手教你IDEA进行远程Debug调试的来龙去脉
创始人
2025-07-08 18:51:34
0

一、前言

我们在测试环境时,遇到一些bug,看上下文的日志,还是无法判断出问题所在时,此时需要Debug来解决。

为了更方便、更高效地定位和解决问题,远程调试成为一种常见的实践方式。

这个还是不建议在生产中使用,可以在测试环境走和生产一样的单据来Debug。要是生产环境忘记去掉断点,直接炸了!

「还是不到万不得已不要在生产使用,使用完也要把本地的断点全部取消掉!」

二、JPDA

在实战之前,我们可以了解一下JPDA!能够远程Debug就是使用这个技术实现的!

1、概念

JPDA(Java Platform Debugger Architecture)是 Java 平台调试体系结构的缩写,它是 Java 开发工具包(JDK)中提供的一组 API 和协议,用于支持 Java 程序的调试。

2、核心组件

Java 虚拟机工具接口(JVMTI): JVMTI 提供了在 Java 虚拟机 (JVM) 中运行时监视和检测的一组 API。它允许调试器在运行时获取有关类、对象、线程等信息,并在程序执行时进行干预。

Java 调试器接口(JDI): JDI 是在 JPDA 中用于编写调试器的 Java API。它允许开发者通过 Java 语言编写调试器,实现与 JVM 的通信和控制。

Java 虚拟机调试协议(JDWP): JDWP 是 JVM 与调试器之间通信的协议。它定义了调试器如何与 JVM 进行通信,包括断点设置、变量检查、执行控制等。

3、调试功能

断点设置: 在代码中设置断点,以便在执行到特定代码行时暂停程序的执行。

变量检查: 查看和修改程序中的变量值。 

单步执行: 逐步执行程序,以便更详细地检查代码的执行过程。 

异常处理: 在程序抛出异常时停止执行,以进行异常处理。

三、Idea实战

非常的简单就是运行Jar包的时候加上命令,在Idea配置上远程调试就行了!

1、Jar包准备

新建一个项目或者使用公司的项目,打成Jar包。为了模拟真实性,我们在windows里运行Jar包一次,然后上传到虚拟机里运行一次!

自己写一个Controller,接收请求,多写几行方便打断点:

/**
 * @author wangzhenjun
 * @date 2023/11/28 15:54
 */
@RequestMapping("/test")
@RestController
public class TestController {

    @GetMapping("/list")
    public String list (){
        System.out.println("======1======");
        System.out.println("======2======");
        System.out.println("======3======");
        System.out.println("======4======");
        return "成功";
    }
}

2、Idea配置远程监听

此时Idea已经把运行Jar包的命令给我们了!

3、运行Jar包

找到jar所在位置,执行命令:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8088 -jar demo-0.0.1-SNAPSHOT.jar

我们来解释一下命令的意义:

-agentlib:jdwp:启用 JDWP 调试支持。

transport=dt_socket:指定 JDWP 调试器和 JVM 之间的通信方式为 socket 传输。

transport 参数有两种常见的模式,分别是 dt_socket 和 dt_shmem。

「dt_socket:使用 socket 传输模式,一般用于调试服务器运行 dt_shmem:使用共享内存传输模式,一般用于本地调试,因为共享内存需要在同一台物理机器上才能正常工作。」

server=y:表示 JVM 将作为调试服务器运行,等待调试器连接。

suspend=n:指定 JVM 在启动后是否暂停等待调试器连接。n 表示不暂停,即 JVM 在启动后立即执行应用程序。如果设置为 y,则 JVM 启动后会等待调试器连接,直到调试器连接上为止。

address=8088: 指定调试器连接的端口号,和Idea监听的端口一致。

我们先访问一下,控制台是可以打印我们的日志!

4、测试

我们启动Idea配置好的监听,然后再打上断点!

访问接口,成功拦截到请求!

放行后,查看控制台正常输出:

此时我们使用虚拟机里的Jar包启动!

「需要我们把Idea中的本地IP换成虚拟机的IP」

重新访问,没有问题,我们放行后正常打印!

四、总结

是不是非常的简单,大家可以自己试一下,这里还是在测试环境玩玩就行。

这种方式还有弊端,现在一般都是容器化部署,这种命令就不太好使了,感兴趣的可以试试使用docker容器来发布!

是不是发布完之后,把Jar包挂载出来,然后再运行一遍专门来Debug的!

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...