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

背景

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

配置

远程debug的服务,以springboot微服务为例(springcloud的应该差不多,我没研究过)。
首先,启动springboot需要加上特定的参数。

1、IDEA设置

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

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

  1. 选择 Edit Configuration

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

  1. 配置,详细步骤见图

    注意:注意端口别被占用。后续这个端口是用来跟远程的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变得安全了,远程调试只允许本地,如果要远程,则需要在端口前配置*

2、启动脚本改造

使用第一步得到的 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 remote-debug-0.0.1-SNAPSHOT.jar &

注意在windows中用 ^ 来进行换行,例如
java ^
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=50055 ^
-jar remote-debug-0.0.1-SNAPSHOT.jar

说明:

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

2、remote-debug-0.0.1-SNAPSHOT.jar 改成给你自己的 jar 包名字

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

3、启动springboot,启动IDEA里的

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次?会的

总结

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

难点有几个:
1、难保证本地代码和远程一致,而且你也很难判断是否一致
2、通过远程调试发现了bug,但是又不能立即修复后继续调试,只能修复后部署后继续远程调试

附录

参考资料:
https://chenxq.xyz/post/java-remote-debug/

使用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 调试

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

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

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

  9. Java远程DEBUG调试教程

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

最新文章

  1. taro 在components文件夹中 新建组件时,组件支持自定义命名,但是不能大写开头...
  2. Manacher算法 , 实例 详解 . NYOJ 最长回文
  3. python orm框架sqlalchemy_python ORM框架:SqlAlchemy
  4. 洛谷P1482 Cantor表(升级版) 题解
  5. Elasticsearch】es memory locking requested for process but memory is not locked
  6. 遍历进程并获取进程路径 - 回复 编程少年 的问题
  7. 大工17春计算机文化基础在线测试3,大工17春《计算机文化基础》在线测试3满分答案...
  8. Golang读取目录文件
  9. solr相关配置(搜索novel案例)
  10. ​​​​iPhone 或 Mac 忘记登录密码,怎么快速找回
  11. java multibox_月光软件站 - 编程文档 - Java - Struts 中 Multibox 的用法
  12. sql语句优化的几种方法
  13. 【主动轮廓模型(二)】《GVF Snake》算法原理与OpenCV实现
  14. java移库数据同步,洗车管理系统会员管理+门店店务同步管理
  15. 数据集成-2-xml
  16. JS中同时支持切割中英文符号,例如分号,冒号
  17. 创建XTP图表的方法
  18. C++算法 | 比较大小
  19. QQ邮箱邮件被拦截该怎么办?邮件被拦截的三种解决办法
  20. 两种方法设置Word文档的“只读模式”

热门文章

  1. react 逆地理 高德地图_高德官宣!海外地图服务年内上线:首批覆盖亚洲多个国家...
  2. day fit into much one too_励志人生的一句英文
  3. 餐厅无线AP覆盖具有哪些特点
  4. 渗透测试之社交工程攻击
  5. 【STM32H7教程】第94章 STM32H7的SPI总线应用之双机通信(DMA方式)
  6. 系列学习 docker 之第 5 篇 —— Docker 常用命令
  7. troublemaker中文谐音_张贤胜 金泫雅-Trouble Maker中文谐音的歌词
  8. 狭窄及隐蔽地下空洞三维探测系统的研制
  9. 基因数据处理82之cs-bwamem处理SRR003161(参考基因组为GRCH38chr1)
  10. 搜索引擎优化高级编程(php版),搜索引擎优化高级编程PHP版(含源码)