SpringBoot 远程调试
在配合 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 远程调试相关推荐
- 线上Bug无法复现怎么办?老司机教你一招,SpringBoot远程调试不用愁!
前言 在部署线上项目时,相信大家都会遇到一个问题,线上的 Bug 但是在本地不会复现,多么无奈. 此时最常用的就是取到前端传递的数据用接口测试工具测试,比如 POSTMAN,复杂不,难受不? 今天陈某 ...
- springboot设置默认值_线上Bug无法复现?老司机教你一招,SpringBoot远程调试不用愁!...
前言 在部署线上项目时,相信大家都会遇到一个问题,线上的 Bug 但是在本地不会复现,多么无奈. 此时最常用的就是取到前端传递的数据用接口测试工具测试,比如 POSTMAN,复杂不,难受不? 今天陈某 ...
- Springboot远程调试
部署时出现问题往往需要远程调试, 那么先用如下命令启动: java -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y ...
- cassss服务未启动_不要再本地启动项目调试了,试SpringBoot远程调试你会发现新大陆!...
前言 上周末一个朋友庆生,无意间听他说起了近况,说公司项目太多了,每天一堆BUG需要修复,项目来回切换启动,真是挺烦的. 随着项目越来越多,特别是身处外包公司的朋友,每天可能需要切换两三个项目,难道一 ...
- SpringBoot 启用远程调试
文章目录 SpringBoot 远程调试 什么是远程调试 原理 调试要求 使用方法 SpringBoot 远程调试 什么是远程调试 开发的过程中有时需要快速定位测试环境中的问题,在日志输出不足以定 ...
- SpringBoot官方热部署和远程调试神器,真带劲!
平时使用SpringBoot开发应用时,修改代码后需要重新启动才能生效.如果你的应用足够大的话,启动可能需要好几分钟.有没有什么办法可以加速启动过程,让我们开发应用代码更高效呢?今天给大家推荐一款Sp ...
- SpringBoot官方开发工具,热部署和远程调试真带劲
平时使用SpringBoot开发应用时,修改代码后需要重新启动才能生效.如果你的应用足够大的话,启动可能需要好几分钟.有没有什么办法可以加速启动过程,让我们开发应用代码更高效呢?今天给大家推荐一款Sp ...
- IDEA远程调试linux上的SpringBoot项目
IDEA远程调试linux上的SpringBoot项目 一.intellij idea配置 打开idea中的run/debug configurations, 选择remote类型,地址配置为服务器地 ...
- Intellij IDEA基于Springboot的远程调试
简介 本篇博客介绍一下在Intellij IDEA下对Springboot类型的项目的远程调试功能.所谓的远程调试就是服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须 ...
最新文章
- 这本书,让我秒懂了微服务架构
- 一不小心又把应用发挂了,复盘一下这十几分钟的黑暗时刻
- 为什么 OLAP 需要列式存储
- 腾讯老照片修复算法开源,细节到头发丝,3种预训练模型可下载 | GitHub热榜
- Linux shell 变量 数学 运算
- Linux 之三 静态库及动态库的编写和使用
- Ubuntu 9.04下让Swing和Swt编写的Java桌面程序运行
- 短网址批量生成 v2.0
- linux下的raid及mdadm的命令详解
- 4. Layout overview
- S3C2440PWM 定时器
- jQuery插件的简单使用及制作
- 5G关键技术及应用、5G移动通信组网架构
- pytorch保存模型pth_详解Pytorch中的网络构造,模型save和load,.pth权重文件解析
- YYC松鼠聚合直播系统添加图片上传视频提示网络错误的问题解决方案
- 天天炫斗服务器维修,天天炫斗连接服务器超时怎么办|天天炫斗连接服务器超时解决方法_好特教程...
- Switch 无法 关联账号 this page cannot be displayed
- 信息通信网络机务员三级(高级)复习知识点
- 【MATLAB】MATLAB矩阵的表示
- 计算机图书应分为书法的什么类,计算机书法创作模拟与渲染研究-计算机应用技术专业论文.docx...