惊呆了!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,为什么要图文并茂?因为很多事可 ...
随机推荐
- Codeforces1146G. Zoning Restrictions
Description You are planning to build housing on a street. There are n spots available on the street ...
- PHP序列化与反序列化学习
序列化与反序列化学习 把对象转换为字节序列的过程称为对象的序列化:把字节序列恢复为对象的过程称为对象的反序列化. <?php class UserInfo { public $name = &q ...
- pormise和async
pormise 1.异步问题 假设现在我刚认识你,需要和你说话,但是我普通话不够标准,需要间隔一秒钟才能说一句话,以此让你可以慢慢思考.这样的话我们就需要用到定时器. 最沙雕的代码如下: setTim ...
- Kafka控制器事件处理全流程分析
前言 大家好,我是 yes. 这是Kafka源码分析第四篇文章,今天来说说 Kafka控制器,即 Kafka Controller. 源码类的文章在手机上看其实效果很差,这篇文章我分为两部分,第一部分 ...
- C#设计模式-适配器模式(Adapter Pattern)
概念 把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作.适配器模式有类的适配器模式和对象的适配器模式两种形式.前者类之间的耦合度比后者高,且要求程 ...
- 009 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 03 什么是变量?
009 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 03 什么是变量? 什么是变量? 形象化的生活中的例子理解什么是变量以及变量的三个元素 我们可以根据客人要求 ...
- 【小白学PyTorch】20 TF2的eager模式与求导
[新闻]:机器学习炼丹术的粉丝的人工智能交流群已经建立,目前有目标检测.医学图像.时间序列等多个目标为技术学习的分群和水群唠嗑的总群,欢迎大家加炼丹兄为好友,加入炼丹协会.微信:cyx64501661 ...
- PADS Layout VX.2.3 修改层名
操作系统:Windows 10 x64 工具1:PADS Layout VX.2.3 点击菜单Setup > Layer Definition... 在Layers Setup窗口中,选择相应的 ...
- excel——VlookUp函数的使用
VlookUp函数,查询两个表中的相同字段数据,并将需要引用的数据从B表填充到A表 1.打开A表,将需要查询的列选中 在需要引用的列输入 = 在上方,函数选择中选择VLOOKUP函数 Windows: ...
- js获取foreach循环选中的值
一,循环出来的值,通过checked选中,获取到value值 二,定义一个空数组,用push将数据保存在数组里面 以上操作便可以进行虎丘选中的值了