引言

在之前的开发当中,都会进行本地项目启动,然后向本地服务发起请求来进行 Debug 调试代码,这也是开发人员最常见的调试操作。但是当项目逐渐成型,慢慢的将各个模块部署到服务器后,调试的手段可能就仅仅剩下查看执行日志了。然而和本地 Debug 代码不同,通过日志排查问题是非常不方便的,你需要在特定的位置打印日志预测问题可能出现的原因,无法精确、快速的定位问题。

为了解决这个问题,JVM 提供了远程调试的手段。我们在Linux 服务器上启动项目的时候,为其指定一系列jvm 参数,就可以让java 服务监听指定端口,并与本地代码进行 debug 通信,但一定要保证本地和服务器上的代码要保持一致

另外,不是说远程 Debug 只能用Eclipse ,也并不是说项目类型必须是 Spring Boot 。远程调试的本质是 JVM 之间的 Socket 通信,因此,只要是 Java 项目就都可以进行类似的远程调试操作,只不过启动参数可能书写的位置不同罢了,而且 IDEA 也是有类似远程调试的功能的,本篇博客的灵感就来自 IDEA 远程调试的视频教程:《DEBUG技巧-远程调试》

一、项目启动参数

目前主流的 Spring Boot  项目都是通过 jar 文件进行启动的,例如这样:

nohup java -jar demo.jar &

那么如果想进行远程调试,启动参数就必须加上一些允许远程调试的配置参数:

nohup java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar  demo.jar  &

其中:

-Xdebug 代表开启debug 模式,允许远程debug 数据交互

-Xrunjdwp  代表Java Debug Wire Protocol ,Java Debug 电报协议

transport=dt_socket  表示以 Socket 方式进行数据传输

server=y  表示启动的虚拟机是调试的服务器端

suspend=n  表示不挂起虚拟机,默认是 y ,本参数表示在客户端建立连接前,服务端是否挂起。n 代表不挂起,即不论我们的客户机是否进行debug 连接都不必等待直接启动。

address=8000 表示服务端监听的客户机 debug 端口

可以看到,即便是最必要的远程调试参数也是长长的一串,所以,建议将启动命令以Shell 脚本的方式存储,如下所示:

app.sh 脚本文件:

二、启动项目

执行配置好远程 debug 参数的 java -jar 命令后,我们可以通过检查网络状态来观察对应的端口监听情况:

使用命令 :

netstat -anp | grep java

目前我只有一个 Java 项目在 CentOS 6 (ip :192.168.1.140)上运行,可以看到两个醒目的 LISTEN ,代表 8000端口和 8080 端口都已经被 Java 进程监听。注意,在设置debug 参数的时候我们设置 suspend=n,因此,此时如果不进行 debug 调试的话,服务没有挂起,因此不会有任何影响,依然可以正常工作。

三、Eclipse 连接远程服务

启动好了服务器上的应用程序,且8000 端口已经被监听,那么我们只需要在 自己的本机配置远程调试 IP 和 端口 即可。注意,不论你使用的是不是 Eclipse ,都是有对应的配置的。如果你的远程主机需要通过跳板机访问,需要另外配置端口转发,在文末的注意事项中会提到。

打开 Debug Configuration:

右键弹出浮窗,选择 New Configuration:

填写必要的连接信息:

点击 Apply ——> Debug,可以观察到Eclipse 右下角的提示信息:

虽然这里的进度条信息是 Launching ,但实际上并不代表启动远程服务的意思,而是代表启动本地的客户机代码并连接到服务端。连接成功后,Eclipse 界面不会有任何变化,也不会跳转到 Debug 界面。接下来我们进行一下验证。

四、远程调试验证

又到了验证环节,刚刚有提到,连接成功后不会有任何提示和变化,那我们如何知道是否连接成功了呢?

首先你可以试着再次连接,那么就会提示下面的弹框:

如果你是人生第一次进行远程调试,很可能就被这个对话框唬住了,以为自己连接失败了,我就是这么被骗了好半天。

弹出此对话框的原因是我们已经连接成功了,因此,后面的其他连接都会提示拒绝。

如果将 Eclipse 切换到Debug 界面,可以看到“小红灯” 和 Disconnect 按钮都是红色亮起的状态,这是第一个可以直观验证连接成功的途径:

第二个验证的途径是返回远程服务器,再次查看网络监听状态:

可以清晰的看到,8000 端口已经由 LISTEN 变为了 ESTABLISHED,由于我的Linux 是放在 VMware 虚拟机上,因此这里显示的 192.168.1.1 是 NAT 的虚拟网卡,详情可以参考我的《Linux进阶之路————CentOS网络配置》

第三个验证的途径就是最终我们想要的效果。

我们打开浏览器,请求服务器的资源 url ,可以看到我们的本地 断点成功拦截:

可以看到,我们通过浏览器访问的服务器资源地址,被本地的断点成功拦截到了请求。

五、注意事项和补充说明

需要说明的是,服务器上的jar 文件代码必须要和本地保持一致,否则可能出现调试混乱的情况。

如果服务器开启了防火墙,那么需要将我们远程调试的 Debug 端口放行,具体做法可以参考我的《Linux实操———CentOS 6 安装配置 Tomcat》第三节,简单来说就是修改 /etc/sysconfig/iptables 文件,照着 22 端口的样子粘贴即可,然后重启防火墙。

另外,还有一点需要说明的是,如果在企业中远程服务器无法直接通信,即可能需要跳板机或者堡垒机访问,那么可以配置 Debug 端口的端口转发,可以思考类似的场景:本地的SQLyog 如何连接到受跳板机保护服务器上的MySQL,并参考我的《服务端开发——云服务器的端口转发设置(SSH隧道)》

注意,远程Debug模式可以成功将访问服务器的请求拦截到本地代码的断点上,此时本地和远程的代码都处于暂停(同步执行)的状态,即远程服务会等待开发者执行 Debug 操作,如 Resume(F8)、Step Over(F6) 等。如果希望退出Debug,只需要点击 Disconnect 按钮断开通信即可,点击后,远程服务自动向下继续执行。

注意,一定不要点击Terminate按钮,如果只是希望退出 Debug 而误点了“小红灯”那么远程服务也会被终止,需要再次重启服务才能恢复。

其实只要断开连接,远程服务和本地的Eclipse 不会产生任何通信,所有的断点都不会生效。而一旦连接成功,那么所有本地Debug操作都会被传送到远程服务,因此,一定要谨慎操作,避免在不必要的时候使远程服务停滞或关闭!

远程Debug 可以反复断开、重连。

参考文章

《JDWP了解》

《微服务学习(一)-使用Springboot配合Eclipse远程调试》

《eclipse远程调试之springboot》

综上,是关于远程调试的一些知识总结,欢迎文末留言。

Spring Boot 实用开发技巧————Eclipse 远程调试相关推荐

  1. apache目录 vscode_VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)

    VsCode搭建Java开发环境(Spring Boot项目创建.运行.调试) 安装如下两个主要扩展即可,这两个扩展已关联java项目开发主要使用的maven.springboot等所需要的扩展. 开 ...

  2. VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)

    本文转载自:https://www.cnblogs.com/miskis/p/9816135.html 安装如下两个主要扩展即可,这两个扩展已关联java项目开发主要使用的maven.springbo ...

  3. 使用 Eclipse 远程调试 Java 应用程序

    转载地址:使用 Eclipse 远程调试 Java 应用程序 远程调试对应用程序开发十分有用.例如,为不能托管开发平台的低端机器开发程序,或在专用的机器上(比如服务不能中断的 Web 服务器)调试程序 ...

  4. Spring Boot:开发常用的热部署方式汇总

    Spring Boot:开发常用的热部署方式汇总 平时开发Sprig Boot的时候,经常改动个小小的地方就要重新启动项目,这无疑是一种很差的体验.在此,博主收集了3种热部署的方案供大家选择. 正文 ...

  5. 基于Spring boot框架开发的电商网站系统

    目 录 第一章 绪论- 2 1.1 编写目的 - 2 1.2 项目背景 - 2 1.3 项目需求 - 2 第二章 系统体系结构 - 3 2.1 系统体系结构 - 3 2.2 数据库设计 E-R 图 - ...

  6. Spring Boot + vue-element 开发个人博客项目实战教程(一、项目介绍和规划)

    ⭐ 作者简介:码上言 ⭐ 代表教程:Spring Boot + vue-element 开发个人博客项目实战教程 ⭐专栏内容:零基础学Java.个人博客系统 ⭐我的文档网站:http://xyhwh- ...

  7. ECLIPSE远程调试出现如下问题 ECLIPSE中调试代码提示找不到源

    ECLIPSE远程调试出现如下问题  ECLIPSE中调试代码提示找不到源 如此提示是由于没有JAR包中找不到MAIN,可以手动添加或自己修改 利用ECLIPSE填写JAR中的MAIN方法后,就可以调 ...

  8. ES6 实用开发技巧

    Javascript - ES6 实用开发技巧 本文只罗列出在 ES6 开发过程中相对实用的内容,并非一个高大全的文档,如果希望查阅详细的内容,可购买阮一峰老师所出版的 ES6 相关图书.另外阮一峰老 ...

  9. Windows Phone 实用开发技巧(10):Windows Phone 中处理图片的技巧

    在开发Windows Phone应用程序的时候,或多或少会与图片打交道,下面总结下Windows Phone 中处理图片的一些技巧 1.  图片格式. 2.  图片编译方式 3.  图片加载方式 4. ...

最新文章

  1. 使用Ubuntu笔记
  2. 【链接】调查显示:超20%美国大学生曾花学生贷款投
  3. 电路常识性概念(1)-输入、输出阻抗
  4. 数据库 sqlite 进阶
  5. new操作符具体都干了什么?一次笔试题遇到的
  6. 阿里云杜欢:云上Serverless开发能力将成为前端的“金手指”
  7. Apache Flink 结合 Kafka 构建端到端的 Exactly-Once 处理
  8. 打败 IE 的葵花宝典:CSS Bug Table
  9. PJAX全局无刷新的设置方法~
  10. jmeter404_jmeter压力测试报告
  11. JavaSE环境搭建
  12. 登录会员管理系统java_huiyuan 会员管理,一款基于java web 的 软件,可以实现登录、注册、充值功能。 Jsp/Servlet 262万源代码下载- www.pudn.com...
  13. html如何设置整体字体颜色,html字体颜色 html如何设置字体颜色
  14. 交易系统开发(十二)——QuickFIX官方文档
  15. 分类与预测模型效果评价
  16. css 属性 linear-gradient 渐变色
  17. 仅有爱情是不够的(转载)
  18. 巴菲特致股东的一封信:2001年
  19. 使用base64格式字符串播放音频
  20. dbo sysadmin和db_owner的区别

热门文章

  1. appweb ejs_具有快速路线的EJS
  2. 「递归」的正确打开方式,看不懂你打我~
  3. C# 读取照片的EXIF信息
  4. Jsp中使用数据库连接池
  5. C语言实现AES加密解密
  6. YOLO v3 安装并训练自己数据
  7. lru调度算法例题_嵌入式必会!C语言最常用的贪心算法就这么被攻略了
  8. CAS实现原子操作的三大问题
  9. SQL Server大量数据秒级插入/新增/删除
  10. java jvm 加载_Jvm是如何加载Java类的?