使用 IDEA 远程 Debug 调试

article/2025/10/11 6:49:49

背景

有时候我们需要进行远程的debug,本文研究如何进行远程debug,以及使用 IDEA 远程debug的过程中的细节。看完可以解决你的一些疑惑。

配置

远程debug的服务,以springboot微服务为例。首先,启动springboot需要加上特定的参数。

启动脚本改造

准备好一个springboot的web测试项目,打包成jar文件,上传远程服务器,修改原来启动脚本。

使用第一步得到的 Command line arguments for remote JVM 即可,即-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055

改造后的启动脚本如下

nohup java \
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055 \
-jar demo.jar &

注意在windows中用 ^ 来进行换行,例如

java ^
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055 ^
-jar demo.jar

说明:

1、端口可随意自己定,未被占用的都行,但是要和IDEA里的remote中设置的端口一致!其他参数照抄。详细的参数解释可以参照附录或自己搜

2、demo.jar 改成给你自己的 jar 包名字

3、脚本是后台运行的,如不需要后台运行,自行去掉 nohup 和 &

3、启动远程服务器中的springboot项目

IDEA配置

高低版本的 IDEA 的设置可能界面有点不一样,我用2021.2.1的。大致上差不多,自行摸索。

IDEA打开远程启动的springboot应用程序所对应的

1.选择 Edit Configuration

2.如图,点击加号,选择Remote

3.配置,详细步骤见图 

注意:注意端口别被占用。后续这个端口是用来跟远程的java进程通信的。

可以注意到:切换不同的jdk版本,生成的脚本不一样

选择 jdk1.4,则为

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=50055

这就是为什么搜其他博客,会有这种配置的原因,其实这个配置也是可行的。但更准确应该按照下面jdk5-8的配置

选择 jdk 5-8,则为

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055

选择 jdk9以上,则为

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:50055

据说因为jdk9变得安全了,远程调试只允许本地,如果要远程,则需要在端口前配置*

IDEA远程调解的细节

1、细节1:停在本地断点,关闭程序后会继续执行吗

如果远程调试在自己的断点处停下来了,此时关闭IDEA中的项目停止运行,则还会继续运行执行完剩下的逻辑吗?会的,这点比较不容易记住

以下面的代码为例,在第一行停住了。然后IDEA中停掉,发现停掉之后控制台还是打印了剩下的日志。

2、细节2:jar包代码和本地不一致会怎么样?

IDEA 里的代码如果不和jar包的一致,会怎么样。

结论:要保证和远程启动的代码一致。

否则你debug的时候的行数会对不上。报错抛异常倒是不会。像这种还是能对得上行数的

比如你调试test1方法,test2方法在test1下面,在test2里加代码,这样并不影响test1中的行号,这种是可以在调试的时候准确反应行号的

3、细节3:日志打印在哪里?

日志不会打印在IDEA的控制台上。即System.out 以及 log.info 还是打印在远程的。

@GetMapping("/test1")
public String test1() {System.out.println("第一行");System.out.println("第二行");log.info("log 第一行");log.info("log 第二行");return "ok";
}

4、细节4:调试时其他人会不会卡住?

远程调试的时候,打了断点,停住后会不会导致页面的请求卡住。

比如你使用远程调试,别的QA在测试这个页面,结果他们看到的结果是怎么样的?会卡住吗?会的,已经实际遇到过这种情况了。

5、细节5:本地代码修复bug远程调用的时候

如果在远程调试过程自己发现了bug,本地改好后重新启动IDEA里的项目,再到页面调用一次,能修复吗?不能,运行的还是远程部署的jar中的代码

这个直接击碎了远程页面点一点触发本地代码进行debug的梦想。如果可以的话那调试代码就方便太多。

6、细节6:这个不算远程调试的问题,是dropframe的问题,放在这里一起讲了

关于drop frame的问题,如果drop frame了重新进行调试,会不会插入2条记录?

如图 userMapper.insert(eo) ,本方法没有使用 @Transactional 修饰,mapper方法执行过后事务会被立即提交,则库表里多了一行记录,如果drop frame后,再次进行调试,再次执行这代码,于是又插入了一条记录。

如果加上 @Transational 就不会有两条记录了,dropframe的时候事务没被提交,再次执行该插入代码也不会插入2条。

关于什么是drop frame

7、细节7:跟上面一样,是dropframe问题

如果把上述插入数据库的逻辑,换成调用远程的接口,在dropframe后,再次执行相同的代码,会不会导致远程接口被执行了2次?会的。

总结

好像感觉远程调试的用处也不是那么大,不能作为长期使用的调试工具。只能作为临时调试的手段。

难点有几个:

  • 难保证本地代码和远程一致,而且你也很难判断是否一致

  • 通过远程调试发现了bug,但是又不能立即修复后继续调试,只能修复后部署后继续远程调试

 

 


http://chatgpt.dhexx.cn/article/t7I2l7wf.shtml

相关文章

利用IDEA的远程debug进行远程代码调试。

经常开发的同学肯定会遇到一个恶心的问题。 MD!明明老子本地是正常的,怎么一上测试环境or生产环境就炸崩崩了。 现在我们来配置远程debug,配完以后我甚至再也不喜欢在本地调试了(手动斜眼) 首先第一步请在linux服务…

Idea进行远程Debug

问题定位,数据追踪?离不开远程Debug,下面让我们来看看那怎么实现远程Debug 第一步、在Idea中创建Remote 点击Edit Configurations--创建Remote 第二步、在服务器中启动项目 原先启动命令: $ java -jar api-gateway-exec.jar …

IntelliJ IDEA远程调试

远程服务DEBUG模式启动 远程服务以debug模式启动需要执行java命令时带上以下JVM参数 java -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:transportdt_socket,address5005,servery,suspendnaddress指定调试端口,可以按需更改。无论你的服务是普通的java进程&a…

IDEA如何进行远程Debug

1. 问题背景 项目的部署方式有主要有两种,第一种是以本地SpringBoot直接启动或是非SpringBoot的应用在本地应用服务器进行部署;第二种则是将项目在远程服务器部署。一般本地直接启动的项目可以直接进行DEBUG调试,但是在企业内部或是多人协同…

idea远程Debug,远程调试

如果需要进行测试直接跳到第三步进行设置就可以 idea远程Debug,远程调试 一.为什么使用远程Debug二.搭建项目1.项目配置2.打包项目 三.Debug测试1.创建链接2.启动项目3.测试接口 一.为什么使用远程Debug 由于部署环境和本地环境的差异性,在本地运行的好…

IDEA配置远程debug调试

当项目部署到远程服务器上的时候,很多时候会发现在远程服务器上执行的结果与我们在本地的执行结果不一致,因此,为了方便我们部署到远程服务器上和在本地debug调试一直,特需配置远程debug调试。 配置远程debug的条件: …

IDEA tomcat远程调试

最近研究tomcat内存马,但本地不具备代码运行条件,本地dns坏了,本地运行报错: 错误: 代理抛出异常错误: java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: ***-PC: ***-PC 遂尝试远程调…

IDEA如何远程断点调试jar包

1.问题 以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境下编译运行Spring Boot项目不报错,如何复现jar包运行时的错误呢?这就需要在IDEA下远程断点调试jar包代码。 2.步骤 将 springboot 项目打成jar包;在IDEA中&a…

Idea Intellij 远程开发调试

一、背景 在构建MiniOB开发环境时需要Linux环境,另外结合分布式系统,利用较好的通信,萌发了远程开发的想法;实际上远程部署、开发在很久之前有过想法(大约刚开始学SpringBoot进行部署软件时,反复地本地开发…

IDEA远程debug调试设置

1写作目录 最近发现工作的项目竟然不能本地跑,只能在预发环境测试,那只能远程debug了,所以写个博客记录一下。 2实操 2.1项目启动添加参数 如下所示,配置了一个debug端口8000 java -Djavax.net.debugssl -Xdebug -Xnoagent -…

IDEA远程调试Java代码

文章目录 1 前言2 远程 Debug 调试原理2.1 理论基础2.2 远程调试分类 3 主动连接调试3.1 远程服务中开启 Debug 服务3.1.1 对于 SpringBoot3.1.2 对于 Tomcat 3.2 IDEA 中指定 Debug 服务器3.3 远程服务器防火墙端口放行 4 被动连接调试4.1 对于 Tomcat4.2 对于 SpringBoot 5 开…

IDEA如何开启远程调试

要进行远程调试,首先被调试的服务必须支持远程调试,先要开一个远程调试接口,在启动参数里面增加下面的语句: -agentlib:jdwptransportdt_socket,servery,suspendn,address6001 这主要是指定远程调试的端口,为6001。一…

IDEA 远程调试

IDEA 远程调试,像运行本地代码一样调试远程主机上的程序,以排查远程程序的BUG或代码执行流程。 作者:王克锋 出处:https://kefeng.wang/2018/03/06/idea-remote-debug/ 版权:自由转载-非商用-非衍生-保持署名&#…

IDEA 远程断点调试

IDEA 远程断点调试 有时候,有些bug无法在本地环境复现,此时就需要我们去线上的机器远程debug,可以采用idea Remove JVM Debug模式. 首先,点击Edit Configurations 然后点击左上角的Add New Configuration,选择Remove…

idea实现远程调试

1.项目开启远程调试 在-jar 后面配置 -agentlib:jdwptransportdt_socket,servery,suspendn,address8327 (8327是远程调试的端口号,注意不要和项目端口号冲突) nohup java -jar -agentlib:jdwptransportdt_socket,servery,suspendn,address8…

IDEA进行远程调试

前言 对于分布式系统的调试不知道大家有什么好的方法。对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时,有什么更好的办法呢? 有时候&…

idea 远程debug调试

1,远程DEBUG的必要性 由于部署环境的差异性,相信很多朋友都碰到过开发环境正常测试过的功能在测试环境甚至生产环境下出现bug的情况。一般情况下,生产环境可以采取的手段比较单一,即通过日志的方式获取运行中的环境上下文&…

使用IDEA远程debug调试(一篇懂所有)

使用IDEA远程调试(一篇懂所有) 背景 有时候我们需要进行远程的debug,本文研究如何进行远程debug,以及使用 IDEA 远程debug的过程中的细节。看完可以解决你的一些疑惑。 配置 远程debug的服务,以springboot微服务为例(springcloud的应该差…

SpringBoot 远程DEBUG调试

我们在测试代码的时候,我们本地代码展示的效果可能和测试环境不一样,明明代码一样,但是效果不一样,代码已经部署到服务器端,因此远程连接服务器端远程调试很重要,实际开发较为常用. 一,调试命令 最为常见的远程调试命令 java -jar -Dserver.port8092 -Dspring.pr…

idea远程调试

一 业务:服务器与本地环境不一样 二 需求:如果服务器报错,使用本地idea进行远程debug调试 三 解决方案:本地idea远程debug调试 四 具体操作 1 第一步:IDEA打开远程启动的springboot应用程序所对应的本地springboot…