前言

上周末一个朋友庆生,无意间听他说起了近况,说公司项目太多了,每天一堆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

指定运行的被调试应用和调试者之间的通信协议,有如下可选值:

  1. dt_socket: 采用socket方式连接(常用)
  2. dt_shmem:采用共享内存的方式连接,支持有限,仅仅支持windows平台

server

指定当前应用作为调试服务端还是客户端,默认的值为n(客户端)。

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

suspend

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

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

address

对外暴露的端口,默认值是8000

注意:此端口不能和项目同一个端口,且未被占用以及对外开放。

onthrow

这个参数的意思是当程序抛出指定异常时,则中断调试。

onuncaught

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

launch

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

timeout

超时时间,单位ms(毫秒)

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

常用的命令

下面列举几个常用的参考命令,这样更加方便理解。

  1. 以Socket 方式监听 8000 端口,程序启动阻塞(suspend 的默认值为 y)直到被连接,命令如下:
-agentlib:jdwp=transport=dt_socket,server=y,address=8000

  1. 以 Socket 方式监听 8000 端口,当程序启动后 5 秒无调试者连接的话终止,程序启动阻塞(suspend 的默认值为 y)直到被连接。
-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000

  1. 选择可用的共享内存连接地址并使用 stdout 打印,程序启动不阻塞。
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n

  1. 以 socket 方式连接到 myhost:8000上的调试程序,在连接成功前启动阻塞。
-agentlib:jdwp=transport=dt_socket,address=myhost:8000

  1. 以 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 调试按钮,当我访问某一接口时,能够正常调试。

你get到了吗?

如果觉得本文对你有帮助,可以转发关注支持一下

原文链接:https://www.cnblogs.com/Chenjiabing/p/13896121.html

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

  1. cassss服务未启动_systemd时代的服务管理

    systemd时代的服务管理 使用systemd做服务管理时,需要了解一些基本知识: 了解systemd可管理哪些服务 了解systemd所管理服务的状态 了解systemctl管理服务的基本命令 学 ...

  2. cassss服务未启动_SS 服务未启动,系统不支持 S5.1 加密锁

    18.06.05 01:33:13 [03756]: 开始关机 18.06.05 01:33:49 [03916]: 服务开始,版本:3.8.570.3593 18.06.05 01:33:51 [0 ...

  3. centos7无盘启动_从无盘启动看Linux启动原理

    作者:bobyzhang,腾讯 IEG 运营开发工程师 0. 故事的开始 0.1 为什么和做什么 最近家里买了对音响,我需要一个数字播放器.一凡研究后我看上了volumio( 我打算让volumio运 ...

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

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

  5. linux java远程调试_[转]JPDA:Java平台调试架构(常用的远程调试方法)

    原文出处:http://www.javaeye.com/topic/75128 最近使用WTP的Server功能很不爽,连tomcat服务器时java类中的任何改动都要重启服务器,一怒之下就改用JPD ...

  6. cassss服务未启动_电梯启动死机故障处理方法

    电梯情况描述:广东奥的斯,有机房 梯龄5年 故障现象描述:现场人员反馈,停梯一晚,第二天开梯,门一开就死机,显示HAD,断电复位后电梯正常 维修过程描述: 1.到达现场查看历史故障记录,显示开门到位故 ...

  7. cassss服务未启动_冰箱不启动是因为什么?要怎么解决这个问题

    冰箱可以保鲜食物,所以冰箱一旦故障了就很麻烦.但是使用久了难免会出现一些故障,常见的就是冰箱不启动了.下面小编就给大家说一下关于冰箱不启动维修服务的详细信息. 1.请检查开关电源与电冰箱电源插头是不是 ...

  8. cassss服务未启动_Mysql无法启动情况下,如何恢复数据呢?

    本文适用于,mysql无法启动,但数据文件未丢失的情况. Mysql因意外情况,导致无法启动,数据库未做备份的情况下,如何将数据迁移至其他数据库中. 原数据库地址:192.168.1.100(以下简称 ...

  9. docker容器内开启22 ssh_在docker容器中开启ssh服务 (未成功有时间再验证)

    一. 利用ubuntu:14.04镜像创建一个容器: [root@docker ~]# docker run -it ubuntu:14.04 /bin/bash root@161f67ccad50: ...

最新文章

  1. IDEA打包成war部署web项目
  2. java016.集合
  3. Spring Cloud + Spring Boot + Mybatis + shiro + RestFul + 微服务
  4. 怎样写APP计划书-20150313早读课
  5. java发送会议邀请邮件模板_Spring 发送邮件 HTML邮件
  6. Struts2——namespace、action、以及path问题
  7. leelen可视对讲怎么接线_楼宇对讲系统怎么布线 楼宇对讲系统布线方式【介绍】...
  8. Flink 1.9 实战:使用 SQL 读取 Kafka 并写入 MySQL
  9. LCN根据官网改造本项目失败案例
  10. 基于HT for Web的3D树的实现
  11. 电信商务领航1-1端口映射即虚拟服务器
  12. magisk下载里显示没有模块_magisk框架
  13. IIC总线专题超级全
  14. Struts2详细执行流程自己总结
  15. 行业观察(一)| 从渠道为王到数据为王——浅谈服装零售企业的数字化转型
  16. 算法效率的衡量方式 - 时间复杂度与空间复杂度
  17. Matlab建的模型如何导入MS中,lammps输出的模型如何导入MS中建模
  18. html字体制作,用@font-face实现网页特殊字符(制作自定义字体)
  19. 华为社招技术二面,总结复盘
  20. 使用spire.doc实现word文档合并

热门文章

  1. 微信可直接转账到 QQ;小米联合中国联通推出当前最便宜 5G 套餐;Git 2.25.0 发布 | 极客头条...
  2. 如何从零开始制作智能桌宠?
  3. 阿里云安全掌门人肖力:企业上云,如何保证安全?| 问底中国 IT 技术演进
  4. 阿里 20 年,逍遥子宣告「全面迈入数字经济时代」
  5. Rust 编程有什么好?
  6. 阿里涉足零售 IoT 的猜想
  7. 套现4.88亿美元,百度从此告别外卖!
  8. 谷歌如何获取了我们的个人数据?
  9. 今日头条反省整改;微信QQ封杀短视频;雷军10亿赌约将见分晓| CSDN极客头条
  10. 程序员穿衣是怎么变得越来越丑的