惊呆了!Spring Boot 还能开启远程调试?
持续原创输出,点击上方蓝字关注我

目录
前言 什么是远程调试? 为什么要远程调试? 什么是JPDA? 如何开启调试? transport server suspend address onthrow onuncaught launch timeout
常用的命令 IDEA如何开启远程调试? 总结
前言
上周末一个朋友庆生,无意间听他说起了近况,说公司项目太多了,每天一堆BUG需要修复,项目来回切换启动,真是挺烦的。
随着项目越来越多,特别是身处外包公司的朋友,每天可能需要切换两三个项目,难道一有问题就本地启动项目调试?
今天这篇文章就来介绍一下什么是远程调试,Spring Boot
如何开启远程调试?
什么是远程调试?
所谓的远程调试就是服务端程序运行在一台远程服务器上,我们可以在本地服务端的代码(前提是本地的代码必须和远程服务器运行的代码一致)中设置断点,每当有请求到远程服务器时时能够在本地知道远程服务端的此时的内部状态。
简单的意思:本地无需启动项目的状态下能够实时调试服务端的代码。
为什么要远程调试?
随着项目的体量越来越大,启动的时间的也是随之增长,何必为了调试一个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 SE 5
之后的版本,则之前的就忽略了。
日常开发中最常见的开启远程调试的命令如下:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9093 -jar xxx.jar
前面的java -agentlib:jdwp=
是基础命令,后面的跟着的一串命令则是可选的参数,具体什么意思呢?下面详细介绍。
transport
指定运行的被调试应用和调试者之间的通信协议,有如下可选值:
dt_socket
: 采用socket
方式连接(常用)dt_shmem
:采用共享内存的方式连接,支持有限,仅仅支持windows平台
server
指定当前应用作为调试服务端还是客户端,默认的值为n
(客户端)。
如果你想将当前应用作为被调试应用,设置该值为y
;如果你想将当前应用作为客户端,作为调试的发起者,设置该值为n
。
suspend
当前应用启动后,是否阻塞应用直到被连接,默认值为y
(阻塞)。
大部分情况下这个值应该为n
,即不需要阻塞等待连接。一个可能为y
的应用场景是,你的程序在启动时出现了一个故障,为了调试,必须等到调试方连接上来后程序再启动。
address
对外暴露的端口,默认值是8000
注意:此端口不能和项目同一个端口,且未被占用以及对外开放。
onthrow
这个参数的意思是当程序抛出指定异常时,则中断调试。
onuncaught
当程序抛出未捕获异常时,是否中断调试,默认值为n
。
launch
当调试中断时,执行的程序。
timeout
超时时间,单位ms
(毫秒)
当 suspend = y
时,该值表示等待连接的超时;当 suspend = n
时,该值表示连接后的使用超时。
常用的命令
下面列举几个常用的参考命令,这样更加方便理解。
以 Socket
方式监听8000
端口,程序启动阻塞(suspend
的默认值为y
)直到被连接,命令如下:
-agentlib:jdwp=transport=dt_socket,server=y,address=8000
以 Socket
方式监听8000
端口,当程序启动后5
秒无调试者连接的话终止,程序启动阻塞(suspend
的默认值为y
)直到被连接。
-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000
选择可用的共享内存连接地址并使用 stdout
打印,程序启动不阻塞。
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
以 socket
方式连接到myhost:8000
上的调试程序,在连接成功前启动阻塞。
-agentlib:jdwp=transport=dt_socket,address=myhost:8000
以 Socket
方式监听8000
端口,程序启动阻塞(suspend
的默认值为y
)直到被连接。当抛出IOException
时中断调试,转而执行usr/local/bin/debugstub
程序。
-agentlib:jdwp=transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
IDEA如何开启远程调试?
首先的将打包后的Spring Boot
项目在服务器上运行,执行如下命令(各种参数根据实际情况自己配置):
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9193 -jar debug-demo.jar
项目启动成功后,点击 Edit Configurations
,在弹框中点击 +
号,然后选择Remote
。

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

以上步骤配置完成后,点击DEBUG调试运行即可。

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

总结
每天一个小知识,今天你学到了吗?
另外作者为大家准备接近10M
的面筋,涵盖后端的各个层面,老规矩,公号内回复Java面试宝典
即可获取。

惊呆了!Spring Boot 还能开启远程调试?的更多相关文章
- spring boot / cloud (六) 开启CORS跨域访问
spring boot / cloud (六) 开启CORS跨域访问 前言 什么是CORS? Cross-origin resource sharing(跨域资源共享),是一个W3C标准,它允许你向一 ...
- springboot开启远程调试
远程调试maven设置 The run goal forks a process for the boot application. It is possible to specify jvm arg ...
- Java项目开启远程调试(tomcat、springboot)
当我们运行一个项目的时候,一般都是在本地进行debug.但是如果是一个分布式的微服务,这时候我们选择远程debug是我们开发的利器. 环境apache-tomcat-8.5.16 Linux 如何启用 ...
- springboot项目使用idea开启远程调试
远程调试是调试服务器的有效手段,远程服务器运行的应用可以在本地代码中打断点调试,能让开发人员准确定位服务器上的问题. 一.开启远程调试前提:本地代码与服务器代码一致, 二.开启远程调试步骤 1.开发工 ...
- tomcat如何正确的开启远程调试功能
在日常开发中,有时需要对远程服务器上的应用进行远程调试,对于tomcat,要进行远程调试其实很简单,只需要在启动tomcat时开启jpda服务即可. 什么是JPDA呢? JPDA(JavaPlatfo ...
- tomcat开启远程调试
tomcat开启远程调试模式: 需要在启动脚本中的 JAVA_OPTS='-server -Xms1024m -Xmx1024m -Xmn384m -Xss256k -XX:PermSize=128m ...
- tomcat如何正确的开启远程调试功能(转)
转自:http://blog.csdn.net/mhmyqn/article/details/49209541 版权声明:本文为博主原创文章,未经博主允许不得转载. 在日常开发中,有时需要对远程服务器 ...
- spring boot 使用 mybatis 开启事务回滚 的总结
1.前言 以前没有使用mybatis,可以关闭自动提交,然后做sql操作,对操作进行catch捕获异常, 如果没有异常则commit 提交 ,有异常则 rollback 回滚,新增的数据则删除 ,修改 ...
- 【Java】使用Eclipse进行远程调试,Windows下开启远程调试
原博链接:http://blog.csdn.net/sunyujia/article/details/2614614 今天决定做件有意义的事,写篇图文并茂的blog,为什么要图文并茂?因为很多事可 ...
随机推荐
- Group Convolution组卷积
思路按照常规卷积到组卷积来. 常规卷积: 如果输入feature map尺寸为C∗H∗W C*H*WC∗H∗W,卷积核有N NN个,输出feature map与卷积核的数量相同也是N NN,每个卷积核 ...
- PYG2010-02-精装友情通讯录再分析
- Python3基础数据类型(数字、字符串、元组、列表、集合、字典)
笔记参考了菜鸟教程 Python 中的变量不需要声明,赋值才创建.赋值给变量的是什么类型变量就是什么类型 多个变量赋值 1 a, b, c = 1, 2, "runoob" 标准数 ...
- SFUD+FAL+EasyFlash典型场景需求分析,并记一次实操记录
SFUD+FAL+EasyFlash典型场景需求分析:用整个flash存储数据,上千条数据,读取得时候用easyflash很慢,估计要检索整个flash太慢了. 改进方法:分区检索. 1存数据时,根据 ...
- matplotlib绘图教程,设置标签与图例
大家好,欢迎大家阅读周四数据处理专题,我们继续介绍matplotlib作图工具. 在上一篇文章当中我们介绍了matplotlib这个包当中颜色.标记和线条这三种画图的设置,今天我们同样也介绍三种新的设 ...
- c++中 预编译头文件PCH
转载:https://blog.csdn.net/lovemysea/article/details/74858430 一.预编译头文件使用经验: 如果预编译头文件被正确使用时,它确实大大提高我们编程 ...
- 批处理中的删除命令:del
转载:https://blog.csdn.net/playboy1/article/details/6869358 删除一个或数个文件.DEL [/P] [/F] [/S] [/Q] [/A[[:]a ...
- matlab中fopen 打开文件或获得有关打开文件的信息
参考:https://ww2.mathworks.cn/help/matlab/ref/fopen.html?searchHighlight=fopen&s_tid=doc_srchtitle ...
- Fullscreen API与DOM监听API
前言 以下几个API,在web开发中可以简化我们一部分交互操作. Fullscreen API 有时候我们想要全屏预览的效果,比如类似于图片预览.幻灯片播放等.全屏API是一个很好的选择. 基本用法 ...
- MeteoInfoLab脚本示例:地图投影
在用axesm函数创建地图坐标系的时候可以指定地图投影(设置projinfo参数),地图投影可以通过projinfo函数来创建,里面的参数依据proj4投影字符串,可以参考此网页:http://rem ...