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

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 线上Bug无法复现怎么办?老司机教你一招,SpringBoot远程调试不用愁!

前言

  • 在部署线上项目时,相信大家都会遇到一个问题,线上的 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`方式连接。1. `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)直到被连接。1. `-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000`:以 Socket 方式监听 8000 端口,当程序启动后 5 秒无调试者连接的话终止,程序启动阻塞(suspend 的默认值为 y)直到被连接。1. `-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n`:选择可用的共享内存连接地址并使用 stdout 打印,程序启动不阻塞。1. `-agentlib:jdwp=transport=dt_socket,address=myhost:8000`:以 socket 方式连接到 `myhost:8000`上的调试程序,在连接成功前启动阻塞。1. `-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好不好。 点击阅读原文,直达

原文地址:https://sihai.blog.csdn.net/article/details/109465471

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 线上Bug无法复现怎么办?老司机教你一招,SpringBoot远程调试不用愁!


 上一篇
为 hexo 博客添加本地搜索功能 为 hexo 博客添加本地搜索功能
  点击上方 **好好学java **,选择 **星标 **公众号 重磅资讯、干货,第一时间送达 今日推荐:我的大学到研究生自学 Java 之路,过程艰辛,不放弃,保持热情,最终发现我是这样拿到大厂 offer 的!个人原创+1博客:点击
2021-04-04
下一篇 
IDEA 真牛逼,900行 IDEA 真牛逼,900行 "又臭又长" 的类重构,几分钟搞定
  点击上方 **好好学java **,选择 **星标 **公众号 重磅资讯、干货,第一时间送达 今日推荐:网传互联网公司加班表个人原创+1博客:点击前往,查看更多 作者:橙味菌 链接:https://juejin.im/post/5e
2021-04-04