日常我们debug是经常用的,但是本地还好说,远程debug就有点难度,而且有时候必须要在预演,测试环境的服务器去debug,举个例子,需要https,公网,域名之类的,测试服务器这些有些是配置的,但是你自己本地开发肯定不会有这些,就需要你自己想办法了。

第一种情况就是你所用的是阿里云全家桶,或者是其他家的提供服务足够多的云服务商,你的公司又不差钱不墨迹,直接有啥用啥的话,实际上阿里云有一个toolkit的插件就可以,支持你镜像,kuberbets一大堆功能,他也可以做到远程调试。

远程连接服务器前置知识

但是如果没有去搞这些,甚至服务器都是自建的,那就要自己动手了。首先我们要理解一个概念JPDA(Java Platform Debugger Architecture)是Java平台调试体系结构,操作过程如下:

  • 1 本机和远程主机的两个 VM 之间使用 Debug 协议通过 指定的Socket 进行通信,传递调试指令和调试信息
  • 2 远程服务器作为被调试程序的远程虚拟机VM:作为 Debug 服务端,监听 Debug 调试指令。jdwp是Java Debug
    Wire Protocol的缩写
  • 3 本地调试程序的本地虚拟机VM:IDEA 中要先配置的 Remote Server,指定 Debug 服务器的Host:Port,以供
    Debug 客户端程序连接,这样服务调用就会调用到你本地,你就可以进行测试。

具体操作过程

配置IDEA中的remote,主要的配置如下:你要调用的module(就是项目入口的那个module),远程服务器地址,远程端口(这个远程端口不是服务器工程配置的端口,你可以理解为是JPDA的接口,用来监听远程服务debug)。

配置完上面主要的三个(毕竟这些都是你自己的,服务器多少,端口多少,那个项目都只有你知道),剩下的配置比较固定,比如通讯方式为socket,debug模式直接按照我的图抄就可以,attach是主动的获取debug的服务调用,listen是被动的,我一般是选择主动attach的,这样测试或者别人调起我debug的服务都会在我idea中展示出来,跟本地启动debug一样。

配置远程服务器启动
由于我的是SpringBoot工程,服务器用的是Jenkins,我需要的只是在Jenkins的启动参数上加上如下:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

记住这里的端口号设置是你的idea,如果你实在记不清楚没把握,idea实际上在配置remote的时候已经给你生成好命令了。

启动远程服务器服务在启动本地远程debug

这里需要两个VM,本地的和远程的一个少不了,所以远程服务器启动项目这是一定的,但是本地怎么启动呢?

实际上你可以把第一步构建remote的过程,你可以理解为edit一个configuration,创建好了就会有一个项目在展示到启动项目那一块,如下:

只不过你会发现run是灰色的,debug是绿色可用的,不用怀疑,这压根也用不到run,直接点击debng按钮去调试就好了,主动一点,要不然配置也白配置,让项目走起来,这样本地的VM就可以和远程的VM通讯了,否则你本地没有VM怎么联调debug。



远程调试

1.1 使用特定JVM参数运行服务端代码

要让远程服务器运行的代码支持远程调试,则启动的时候必须加上特定的JVM参数,这些参数是:

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=${debug_port}

其中的${debug_port}是用户自定义的,为debug端口,本例以5555端口为例。

本人在这里踩过一个坑,必须要说一下。在使用公司内部的自动化部署平台NDP进行应用部署时,该平台号称支持远程调试,只需要在某个配置页面配置一下调试端口号(没有填写任何IP相关的信息),并且重新发布一下应用即可。事实上也可以发现,上述JVM参数中唯一可变的就是${debug_port}。但是实际在本地连接时发现却始终连不上5555 的调试端口,仔细排查才发现,下面截取了NDP发布的应用所有JVM参数列表中与远程调试相关的JVM启动参数如下:

-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=127.0.0.1:5555

address设置为127.0.0.1:5555,表示将调试端口限制为本地访问,远程无法访问,这个应该是NDP平台的一个bug,我们在自己设置JVM的启动参数时也需要格外注意。

如果只是临时调试,在端口号前面不要加上限制访问的IP地址,调试完成之后,将上述JVM参数去除掉之后重新发布下,防范开放远程调试端口可能带来的安全风险。

1.2 本地连接远程服务器debug端口

1.1.1 配置

打开Intellij IDEA,在顶部靠右的地方选择”Edit Configurations…”,进去之后点击+号,选择”Remote”,按照下图的只是填写红框内的内容,其中Name填写名称,这里为remote webserverhost为远程代码运行的机器的ip/hostnameport为上一步指定的debug_port,本例是5555。然后点击Apply,最后点击OK即可。

1.1.2 本地IDEA启动debug模式

现在在上一步选择”Edit Configurations…”的下拉框的位置选择上一步创建的remote webserver,然后点击右边的debug按钮(长的像臭虫那个),看控制台日志,如果出现类似“Connected to the target VM, address: ‘xx.xx.xx.xx:5555’, transport: ‘socket’”的字样,就表示连接成功过了。我这里实际显示的内容如下:

Connected to the target VM, address: '10.185.0.192:15555', transport: 'socket'

1.1.3 设置断点,开始调试

远程debug模式已经开启,现在可以在需要调试的代码中打断点了,比如:

如图中所示,如果断点内有√,则表示选取的断点正确。

现在在本地发送一个到远程服务器的请求,看本地控制台的bug界面,划到debugger这个标签,可以看到当前远程服务的内部状态(各种变量)已经全部显示出来了,并且在刚才设置了断点的地方,也显示了该行的变量值。

备注:需要注意的是,用于远程debug的代码必须与远程部署的代码完全一致,不能发生任何的修改,否则打上的断点将无法命中,切记切记。

远程调试原理

Java远程调试的原理是两个VM之间通过debug协议进行通信,然后以达到远程调试的目的,两者之间可以通过socket进行通信;

我们知道,Java 程序都是运行在 Java虚拟机上的,我们要调试 Java程序,事实上就需要向 Java 虚拟机请求当前运行态的状态,并对虚拟机发出一定的指令,设置一些回调等等,那么Java的调试体系,就是虚拟机的一整套用于调试的工具和接口。

对于 Java 虚拟机接口熟悉的人来说,您一定还记得 Java 提供了两个接口体系:

  • JVMPI(Java Virtual Machine Profiler Interface)
  • JVMDI(Java Virtual Machine Debug Interface)

JPDAJava 平台调试体系)模块层次:

模块 层次 编程语言 作用
JVMTI 底层 ` C` 获取及控制当前虚拟机状态
JDWP 中介层 C 定义JVMTIJDI交互的数据格式
JDI 高层 C 提供JavaAPI来远程控制被调试的虚拟机

举个例子:客户端(ideaeclipse 等)之所以可以进行调试,是由于客户端 和 服务端(程序端)进行了 socket 通信,通信过程如下:

  1. 先建立起了 socket连接
  2. 将断点位置创建了断点事件通过 JDI 接口传给了 服务端(程序端)的 VMVM 调用 suspendVM 挂起
  3. VM挂起之后将客户端需要获取的 VM 信息返回给客户端,返回之后 VM resume 恢复其运行状态
  4. 客户端获取到VM返回的信息之后可以通过不同的方式展示给客户;

换句话说,通过JPDA这套接口,我们就可以开发自己的调试工具

Java本地远程服务器debug调试详解相关推荐

  1. Eclipse Debug调试详解

    目录 一.debug透视图: 1.进入方式:​右上角点击添加框,选择"臭虫",再点击小虫. 2.debug调试下的一些常用一些透视图,如果没有自行添加,windows---> ...

  2. Leetcode怎么调试java代码,IDEA2020.1使用LeetCode插件运行并调试本地样例的方法详解...

    环境: idea2020.1 插件: LeetCode-editor 6.7 一.IDEA安装LeetCode插件 安装完成重启idea 打开插件 URL可以选择国服和世界服.LoginName和Pa ...

  3. java解压服务器文件夹,java获取远程服务器上的文件夹

    java获取远程服务器上的文件夹 内容精选 换一换 安装X722板载网卡驱动软件包,使裸金属服务器支持在v5服务器上下发.其他类型服务器可跳过此步骤.本文以Windows Server 2016为例, ...

  4. PyCharm中Debug模式进行调试详解

    参考博文: Pycharm Debug调试(纯干货)_小麦粒的博客-CSDN博客 pycharm下debug详解_诺一呦-的博客-CSDN博客_pycharm的debug怎么用 Pycharm Deb ...

  5. python远程linux服务器执行命令_基于使用paramiko执行远程linux主机命令(详解)

    paramiko是python的SSH库,可用来连接远程linux主机,然后执行linux命令或者通过SFTP传输文件. 关于使用paramiko执行远程主机命令可以找到很多参考资料了,本文在此基础上 ...

  6. Java编程工具(11):IDEA 服务器热部署详解E

    IDEA 服务器热部署详解(On Update action/On frame deactivation) IDEA 服务器热部署详解(On Update action/On frame deacti ...

  7. eclipse调试详解

    eclipse调试详解 作者: 高州人家 来源: 网络转载 浏览: 1610 次 好评: 0分 [ 小 中 大 ] 2007-11-16 本地调试     Java   调试器具有客户机/服务器设计, ...

  8. Java网络编程 Socket、ServerSocket 详解,方法介绍及完整代码示例

    Java网络编程 Socket.ServerSocket 详解,方法介绍及完整代码示例 概念 什么是网络编程? 网络编程是指编写运行在多个设备(计算机)的程序,这些设备通过网络连接起来.当这些通过网络 ...

  9. java怎么获取服务器文件夹,java获取远程服务器的文件夹

    java获取远程服务器的文件夹 内容精选 换一换 工具中所有涉及上传文件功能的,如果需要上传的文件大于1GB或者解压后超过剩余磁盘空间的一半,则需要释放磁盘空间或手动将文件上传至服务器,其他情况可通过 ...

最新文章

  1. 看微软如何发展 Windows 下一代系统
  2. 第一百三十四期:MySQL分页查询方法及优化
  3. *【HDU - 4006】 The kth great number(优先队列 or 线段树)
  4. Android Ac 控件,Android控件--MultiAutoCompleteTextView
  5. 1024灯控台初学_MA2的小弟MA1控台说明书
  6. Python数据类型解析(基础篇)
  7. OpenHarmony 1.1.0 LTS 版本发布,十六大性能全面提升
  8. Vue实现简书导航栏效果
  9. [笔记].关于使用JLINK的三线SWD模式调试NUC1xx的一点粗浅认识
  10. 将php中stat()得到的文件权限转成Linux形式
  11. 笔记本计算机涂硅脂,图吧小白教程 篇十一:笔记本拆机换硅脂教程(大拆)...
  12. RK3399触摸不准,修改drivers中gt9xx.h的cfg
  13. 【笔记】python中使用if语句处理列表:检查特殊元素、确定列表不是空的、使用多个列表
  14. 基建管控系统_基建管控系统在电网建设中的应用
  15. Python求1+2+…+n
  16. 一枚前端UI组件库 KUI for React
  17. 【机器学习系列】聊聊决策树
  18. 【DFS 水洼数目】
  19. controller 之@...
  20. 【软件2.0】软件2.0时代来了!特斯拉AI负责人说:神经网络正在改变编程

热门文章

  1. java cas 实现_Java CAS算法简介及简单模拟CAS算法
  2. [SSD科普之2] SATA、mSATA、M.2、M.2(NVMe)、PCIE固态硬盘接口详解
  3. Airtest爬朋友圈并生成中文词云图
  4. bash与csh下获取系统命令执行结果
  5. 计算机毕业设计Java果之芒农场销售系统(源码+系统+mysql数据库+Lw文档)
  6. 考试偷用计算机检讨书300字,学生违纪检讨书300字
  7. 网上询找客户的八种方法
  8. 2020年北京交通大学电子系统课程设计——病毒大作战方案记录
  9. html5拨打电话自动录音,移动web唤起手机拍照、摄影、录音及拨号
  10. AD设置1:1打印出PCB图纸