前言

  • 在部署线上项目时,相信大家都会遇到一个问题,线上的 Bug 但是在本地不会复现,多么无奈。

  • 此时最常用的就是取到前端传递的数据用接口测试工具测试,比如 POSTMAN,复杂不,难受不?

  • 今天陈某教你一招,让你轻松调试线上的 Bug。文章目录如下:

什么是 JPDA?

  • JPDA(Java Platform Debugger Architecture),即 Java 平台调试体系,具体结构图如下图所示。

  • 其中实现调试功能的主要协议是JDWP协议,在 Java SE 5 以前版本,JVM 端的实现接口是 JVMPI(Java Virtual Machine Profiler Interface),而在 Java SE 5 及以后版本,使用 JVMTI(Java Virtual Machine Tool Interface) 来替代 JVMPI。

  • 因此,如果使用 Java SE 5 之前版本,使用调试功能的命令为:

java -Xdebug -Xrunjdwp:...
  • Java SE 5 及之后版本,使用调试功能的命令为:

java -agentlib:jdwp=...

调试命令

  • 现在开发中最常见的一条远程调试的的命令如下:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9091 -jar xxx.jar

参数说明

  • 基于前面的调试命令,我们来分析一下基本的参数代表什么意思。

transport

  • 指定运行的被调试应用和调试者之间的通信协议,它由几个可选值:

  1. dt_socket:主要的方式,采用socket方式连接。

  2. dt_shmem:采用共享内存方式连接,仅支持 Windows 平台。

server

  • 指定当前应用作为调试服务端还是客户端,默认为n

  • 如果你想将当前应用作为被调试应用,设置该值为 y,如果你想将当前应用作为客户端,作为调试的发起者,设置该值为n

suspend

  • 当前应用启动后,是否阻塞应用直到被连接,默认值为 y

  • 在大部分的应用场景,这个值为 n,即不需要应用阻塞等待连接。一个可能为 y的应用场景是,你的程序在启动时出现了一个故障,为了调试,必须等到调试方连接上来后程序再启动。

address

  • 暴露的调试连接端口,默认值为 8000

  • 此端口一定不能与项目端口重复,且必须是服务器开放的端口。

onthrow

  • 当程序抛出设定异常时,中断调试。

onuncaught

  • 当程序抛出未捕获异常时,是否中断调试,默认值为 n。

launch

  • 当调试中断时,执行的程序。

timeout

  • 该参数限定为java -agentlib:jdwp=…可用,单位为毫秒ms

  • suspend = y 时,该值表示等待连接的超时;当 suspend = n 时,该值表示连接后的使用超时。

参考命令

  1. -agentlib:jdwp=transport=dt_socket,server=y,address=8000:以 Socket 方式监听 8000 端口,程序启动阻塞(suspend 的默认值为 y)直到被连接。

  2. -agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000:以 Socket 方式监听 8000 端口,当程序启动后 5 秒无调试者连接的话终止,程序启动阻塞(suspend 的默认值为 y)直到被连接。

  3. -agentlib:jdwp=transport=dt_shmem,server=y,suspend=n:选择可用的共享内存连接地址并使用 stdout 打印,程序启动不阻塞。

  4. -agentlib:jdwp=transport=dt_socket,address=myhost:8000:以 socket 方式连接到 myhost:8000上的调试程序,在连接成功前启动阻塞。

  5. -agentlib:jdwp=transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub:以 Socket 方式监听 8000 端口,程序启动阻塞(suspend 的默认值为 y)直到被连接。当抛出 IOException 时中断调试,转而执行 usr/local/bin/debugstub程序。

IDEA 远程调试示例

  • 首先打包 SpringBoot 项目,在服务器上运行,执行以下命令:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9190 -jar debug-demo.jar
  • 出现下图的界面,表示运行成功:

  • 然后在 IDEA 中,点击 Edit Configurations,在弹框中点击 + 号,然后选择Remote

  • 填写服务器的地址及端口,点击 OK 即可。

  • 配置完毕后,DEBUG 调试运行即可。

  • 配置完毕后点击保存即可,因为我配置的 suspend=n,因此服务端程序无需阻塞等待我们的连接。我们点击 IDEA 调试按钮,当我访问某一接口时,能够正常调试。

最后,再附上我历时三个月总结的 Java 面试 + Java 后端技术学习指南,这是本人这几年及春招的总结,目前,已经拿到了腾讯等大厂offer,拿去不谢,github 地址:https://github.com/OUYANGSIHAI/JavaInterview

这么辛苦总结,给个star好不好。 点击阅读原文,直达

线上Bug无法复现怎么办?老司机教你一招,SpringBoot远程调试不用愁!相关推荐

  1. springboot设置默认值_线上Bug无法复现?老司机教你一招,SpringBoot远程调试不用愁!...

    前言 在部署线上项目时,相信大家都会遇到一个问题,线上的 Bug 但是在本地不会复现,多么无奈. 此时最常用的就是取到前端传递的数据用接口测试工具测试,比如 POSTMAN,复杂不,难受不? 今天陈某 ...

  2. 山西计算机等级考试科目一模拟试题,考驾照科目一试题100题,老司机教你两招,让你轻松考过!...

    原标题:考驾照科目一试题100题,老司机教你两招,让你轻松考过! 很多学员都在问考驾照科目一试题100题,那么小编就分享一下考驾照科目一试题100题吧,这些考驾照科目一试题100题,考驾照的你值得拥有 ...

  3. 怎么判断前轮左右的位置_如何判断左右车轮位置?老司机教你一招,学会后再也不会压线!...

    "实线就是一堵墙,千万不能压!"当年在驾校的时候,你的教练有没有说过这句话?道理大家都懂,但还是偶尔有些粗心大意的司机因为"压线"行驶而被扣分罚款.下面小编就给 ...

  4. 蓝底换白底边缘不干净_雨刮器刮不干净别急着换,老司机教你一招,让雨刮器恢复如新!...

    现在开车的人越来越多了,下雨天我们使用汽车雨刮器的时候,发现雨刮器刮不干净,刮完之后不仅模糊,而且还有咯吱咯吱的响声.说明雨刮器的胶条已经凹凸不平了,长时间使用的过程中雨刮器磨损的很厉害了,出现这种情 ...

  5. weinview触摸屏编程软件_新手学习plc编程应该怎么做,老司机教你六招,轻松入门...

      作为初学者应该怎么去学习plc编程,从哪些方面下手比较好,这里个大家一点建议. 一.多收集程序范例.增加编程经验         收集一些别人做好的范例程序,用心去学习理解,想想别人为什么这么写, ...

  6. 听说”双11”是这么解决线上bug的

    听说"双11"是这么解决线上bug的 --Android线上热修复的使用与原理 预备知识和开发环境 Android NDK编程 AndFix浅析 Android线上热修复的原理大同 ...

  7. 走完线上 BUG 定位最后一公里

    简介:因为线上线下环境隔离的问题,线上的输入很多时候难以在日常环境中构造,定位 bug 效率低下.是否有简单快捷的办法呢? 一个小故事 周末12点的闹钟在回龙观均价3000的出租屋急促的响起,程序员小 ...

  8. 线上BUG 处理并分析原因

    昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户的 ...

  9. java复制屏幕文本内容_网页上的文字内容不给复制?电脑老司机教你输入一串代码,轻松复制...

    原标题:网页上的文字内容不给复制?电脑老司机教你输入一串代码,轻松复制 我们有时候需要一些资料就会去网上查资料,有的时候我们需要把这些资料的文字给复制下来.但并不是所有的资料都能直接复制的,不是登陆账 ...

最新文章

  1. Java基础(十一) Stream I/O and Files
  2. 《最受欢迎的女友职业排行榜Top10》
  3. 各种神经网络优化算法:从梯度下降到Adam方法
  4. vue实现接受后端传过来的zip数据,axios实现
  5. c 语言 string类型转换,用标准c++实现string与各种类型之间的转换
  6. 如何获取组SPGroup的描述Description信息
  7. 使用C#調用外部程式或是執行DOS命令
  8. spark 用户画像挖掘分析_如何基于Spark进行用户画像?
  9. DevExpress控件学习总结(转)
  10. java outofmerroy_Tomcat中的Out Of Memory错误
  11. mysql 未发现数据源名称并且未指定默认驱动程序_SQLSERVER 链接 MYSQL 的 两种方法 及 未发现数据源名称并且未指定默认驱动程序 处理办法...
  12. Python sys.argv[]详解
  13. 叉姐训练目录,好好搞搞,两个月要搞定哦
  14. 关于阿里云服务器的问题及答案(详细汇总)
  15. 世界上最简单的会计书(现金流量表)
  16. python向excel写数据_Python 往Excel写数据
  17. 计算机认识新朋友教案,认识新朋友教案
  18. 拿到别人提供的虚拟机需要做的几件事情
  19. 让32位Eclipse和64位Eclipse同时在64的Windows7上运行
  20. linux如何查看服务器的型号和常用信息

热门文章

  1. 围观窗体与组件03 - 零基础入门学习Delphi25
  2. 操作系统实验——简易FAT16文件系统的实现
  3. 设计模式--桥(Bridge)模式
  4. 关于AttributeError: type object ‘XXX‘ has no attribute ‘XXX‘的问题
  5. [architecture]-DBG、DMB、DSB 和 ISB指令介绍
  6. optee中utee syscall的实现(系统调用实现)
  7. [gic]-ARM gicv2和gicv3的中断模型总结
  8. 2022-01-06
  9. IPFS(星际文件系统)的安装与使用
  10. java查看虚拟机信息_java分析工具系列4:jinfo(实时的调整和查看虚拟机信息)...