在配合 QA 进行代码测试,以及处理线上 BUG 时,代码往往已经被部署于服务器端,因此服务器端程序支持远程调试功能就尤为重要。

Java 原生支持调试功能,由于实际开发中使用 SpringBoot,因此本文探讨基于 jar 包的调试,远程调试的 IDE 为 IDEA

注: war 包调试、Eclipse 远程调试功能请另行了解,这不在本文的探讨范围内。

一、调试命令

最为常见的远程调试命令,也是我正在使用的调试命令是:

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

当然更多的你也可能见到这种:

java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=6001 -jar xxx.jar

1.1 基础概念

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=...

1.2 参数说明

(1) transport

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

  • dt_socket:主要的方式,采用 socket 方式连接
  • dt_shmem:采用共享内存方式连接,仅支持 Windows 平台(暂未验证)

(2) server

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

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

(3) suspend

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

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

(3) address

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

(4) onthrow

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

(5) onuncaught

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

(6) launch

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

(7) timeout

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

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

1.3 参考实例

  • -agentlib:jdwp=transport=dt_socket,server=y,address=8000

    以 Socket 方式监听 8000 端口,程序启动阻塞(suspend的默认值为y)直到被连接。

  • -agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000

    以 Socket 方式监听 8000 端口,当程序启动后5秒无调试者连接的话终止,程序启动阻塞(suspend的默认值为y)直到被连接。

  • -agentlib:jdwp=transport=dt_shmem,server=y,suspend=n

    选择可用的共享内存连接地址并使用 stdout 打印,程序启动不阻塞。

  • -agentlib:jdwp=transport=dt_socket,address=myhost:8000

    以 socket 方式连接到 myhost:8000上的调试程序,在连接成功前启动阻塞。

  • -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 远程调试

首先启动好应用程序,我这里就直接使用最通用的命令:

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

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

填写服务端的 IP 地址,以及调试端口号。在检查下下方的 Command line arguments for remote JVM 是否和服务端启动是配置的一致。

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

三、参考文章

  • 如何使用 Idea 远程调试 Java 代码

  • Java应用程序是否会因-Xdebug的存在而放慢速度,或者仅在逐步完成代码时才放慢速度?

  • Java远程调试各参数说明

  • How to Remotely Debug Application Running on Tomcat From Within Intellij IDEA

  • -X Command-line Options

SpringBoot 远程调试相关推荐

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

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

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

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

  3. Springboot远程调试

    部署时出现问题往往需要远程调试, 那么先用如下命令启动: java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y ...

  4. cassss服务未启动_不要再本地启动项目调试了,试SpringBoot远程调试你会发现新大陆!...

    前言 上周末一个朋友庆生,无意间听他说起了近况,说公司项目太多了,每天一堆BUG需要修复,项目来回切换启动,真是挺烦的. 随着项目越来越多,特别是身处外包公司的朋友,每天可能需要切换两三个项目,难道一 ...

  5. SpringBoot 启用远程调试

    文章目录 SpringBoot 远程调试 什么是远程调试 原理 调试要求 使用方法 SpringBoot 远程调试 什么是远程调试 ​ 开发的过程中有时需要快速定位测试环境中的问题,在日志输出不足以定 ...

  6. SpringBoot官方热部署和远程调试神器,真带劲!

    平时使用SpringBoot开发应用时,修改代码后需要重新启动才能生效.如果你的应用足够大的话,启动可能需要好几分钟.有没有什么办法可以加速启动过程,让我们开发应用代码更高效呢?今天给大家推荐一款Sp ...

  7. SpringBoot官方开发工具,热部署和远程调试真带劲

    平时使用SpringBoot开发应用时,修改代码后需要重新启动才能生效.如果你的应用足够大的话,启动可能需要好几分钟.有没有什么办法可以加速启动过程,让我们开发应用代码更高效呢?今天给大家推荐一款Sp ...

  8. IDEA远程调试linux上的SpringBoot项目

    IDEA远程调试linux上的SpringBoot项目 一.intellij idea配置 打开idea中的run/debug configurations, 选择remote类型,地址配置为服务器地 ...

  9. Intellij IDEA基于Springboot的远程调试

    简介 本篇博客介绍一下在Intellij IDEA下对Springboot类型的项目的远程调试功能.所谓的远程调试就是服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须 ...

最新文章

  1. 这本书,让我秒懂了微服务架构
  2. 一不小心又把应用发挂了,复盘一下这十几分钟的黑暗时刻
  3. 为什么 OLAP 需要列式存储
  4. 腾讯老照片修复算法开源,细节到头发丝,3种预训练模型可下载 | GitHub热榜
  5. Linux shell 变量 数学 运算
  6. Linux 之三 静态库及动态库的编写和使用
  7. Ubuntu 9.04下让Swing和Swt编写的Java桌面程序运行
  8. 短网址批量生成 v2.0
  9. linux下的raid及mdadm的命令详解
  10. 4. Layout overview
  11. S3C2440PWM 定时器
  12. jQuery插件的简单使用及制作
  13. 5G关键技术及应用、5G移动通信组网架构
  14. pytorch保存模型pth_详解Pytorch中的网络构造,模型save和load,.pth权重文件解析
  15. YYC松鼠聚合直播系统添加图片上传视频提示网络错误的问题解决方案
  16. 天天炫斗服务器维修,天天炫斗连接服务器超时怎么办|天天炫斗连接服务器超时解决方法_好特教程...
  17. Switch 无法 关联账号 this page cannot be displayed
  18. 信息通信网络机务员三级(高级)复习知识点
  19. 【MATLAB】MATLAB矩阵的表示
  20. 计算机图书应分为书法的什么类,计算机书法创作模拟与渲染研究-计算机应用技术专业论文.docx...

热门文章

  1. iEmu:在Linux、Windows、Mac、Android系统上仿真运行iOS应用
  2. JVM|什么是符号引用?
  3. SSH与SSM学习之SSH实现CRM练习17——添加客户拜访记录和列表
  4. 前端开发规范[html篇]
  5. 日语动词的几种类型归纳
  6. github视频床视频批量导入
  7. IOS中Segue的使用
  8. 德国监管机构将对ICO进行严格审查
  9. Android jp2(jpeg2000)图片的解码显示
  10. CMMI评估--SCAMPI