背景

有时候我们需要进行远程的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,但是又不能立即修复后继续调试,只能修复后部署后继续远程调试

使用 IDEA 远程 Debug 调试相关推荐

  1. openstack windows下远程debug调试(komodo)

    2019独角兽企业重金招聘Python工程师标准>>> 感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正! 如有转载,请保留源作者博客信息. Be ...

  2. IntelliJ IDEA远程debug调试

    IntelliJ IDEA远程debug调试 IntelliJ IDEA远程debug调试 解决痛点: 排查线上bug log日志埋点不准确,告别屡次打包部署cycle 前提: 本地代码必须与远程代码 ...

  3. IDEA配置远程debug调试

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

  4. 如何使用idea远程debug调试代码详解

    目录 一.idea远程debug原理 二.创建一个springboot工程 三.IDEA远程调试配置 四.服务端开始debug模式 五.idea启动远程调用 六.启动远程调试参数解释 一.idea远程 ...

  5. pycharm连接云端服务器后实现远程debug调试

    目录 1. 情况说明 2.具体实现措施,举例说明 (1) 准备工作 (2)具体实施 3. debug 调试 1. 情况说明 我的情况是通过pycharm连接云端服务器,然后实现代码的pytorch分布 ...

  6. idea 远程debug调试

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

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

    使用IDEA远程调试(一篇懂所有) 背景 有时候我们需要进行远程的debug,本文研究如何进行远程debug,以及使用 IDEA 远程debug的过程中的细节.看完可以解决你的一些疑惑. 配置 远程d ...

  8. postman测试远程服务器,远程debug调试入门

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

  9. Java远程DEBUG调试教程

    背景 在日常的开发工程中可能需要排查线上Bug,此时远程DEBUG就发挥用处了,前提是保持远程和本地的代码版本是一致的. 原理 Java程序经过编译后的字节码是运行在JVM上的,通过JDWP将其和代码 ...

最新文章

  1. 基于OpenCV的透视图转化为不同平面
  2. 省技术市场举办中小企业专利法律风险防范及专利战略制定讲座
  3. python小游戏编程实例-10分钟教你用Python写一个贪吃蛇小游戏,适合练手项目
  4. Ubuntu 10.04 的源服务器和PXE安装环境搭建。
  5. 数据可视化 信息可视化_可视化哲学的黎明
  6. 为脚本语言平反-JavaScript篇(3)
  7. 人大金仓数据库的安装的使用
  8. ios8正式版固件开放下载 有哪些亮点?
  9. python共享单车数据分析_共享单车数据可视化分析(Python/Seaborn)
  10. win10装debian 双系统_超详细小白部署win10和debian10双系统教程
  11. LoRa SX1278通信代码开发学习
  12. linux备份压缩tgz,linux关于解压和压缩命令 zip rar tar.gz tgz
  13. miui11升级鸿蒙,MIUI11新版本推送 GPU驱动更新 小米10 Pro跑分轻松突破60万
  14. jquery给lable赋值
  15. python 发送get 请求
  16. STM32——stm32 I2C通信代码配置(2)(学习笔记)
  17. linux的常用命令行
  18. 144基于springboot的易卖网商城源码下载
  19. 淘宝用户行为---用户价值分析
  20. 迭代上线前后,产品经理一定不能忘记的10件事儿

热门文章

  1. Centos7 双网卡配置
  2. 严重性 代码 说明 项目 文件 行 禁止显示状态 警告 CS8032 无法从...创建分析器...的实例: 未能加载文件或程序集...或它的某一个依赖项。系统找不到指定的文件
  3. sql查询每科成绩的最高分_编写SQL语句查询出每个各科班分数最高的同学的名字,班级名称,课程名称,分数...
  4. 防范映像劫持(IFEO HIJACK)
  5. ProGet 22.0 Enterprise Crack by Xacker
  6. 2022年计算机四级考试冲刺试题及答案(多选题)
  7. File.separator用法
  8. js callee与caller 区别
  9. 新式单片机视频教程下载
  10. SQL Server密码破解工具