关于远程调试

摘要:
本地虚拟机与远程虚拟机通信。远程虚拟机监视自己的堆栈帧、方法调用和其他运行信息。本地虚拟机通过Java API提供的可用调试接口向远程虚拟机发送调试命令,并接受和显示调试结果。远程调试的核心:JPDA框架模块级编程语言函数JVMTI底层CJVMTI是Java虚拟机提供的本地编程接口,为所有需要访问VM状态的工具提供VM接口。

1.为什么要用远程调试?

1.本地环境与远程环境为不一致,线上线下数据的不一致,导致有些问题没办法在本地复现。仅靠本地调试无法直接定位问题。

2.本地调试一般有三种方法,一是写测试用例,二是在swagger上测试,需要造数据,比较麻烦。三是通过前端请求打到后端,但这种方法请求会随机打到本机和Dev环境的机器,需要禁用Dev的机器,有可能影响其他人开发。尤其我们现在基本都在泳道上联调,本地调试更无法定位问题。

2.Java远程调试的原理

由于是对源码进行调试,源码经编译后运行在远程服务器上,并且在本地Idea IDE中打开源码。本地虚拟机与远程虚拟机相互通信,远程虚拟机监控自身的栈帧,方法调用等运行信息,本地虚拟机通过Java API提供的可使用的调试接口,向远程虚拟机发送调试命令,并接受显示调试结果。

远程调试的核心:JPDA(Java Platform Debugger Architecture)框架

关于远程调试第1张

模块

层次

编程语言

作用

JVMTI

底层

C

JVMTI(JVM Tool Interface)是 Java 虚拟机所提供的 native 编程接口,为需要访问VM状态的全部工具(分析,调试,监控,线程分析和覆盖率分析)提供VM接口。

JDWP

中间层

C

为 Java 调试而设计的一个通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。定义 JVMTI 和 JDI 交互的数据格式,包括请求命令、回应数据和错误代码

JDI

高层

Java

定义了调试器(Debugger)所需要的一些调试接口。基于这些接口,本地调试器可以及时地了解远程虚拟机的状态,例如查看目标虚拟机上有哪些类和实例等。另外,调试者还可以控制远程虚拟机的执行,例如挂起和恢复目标虚拟机上的线程,设置断点等。

3.怎么远程调试?

本机

Idea Edit Configurations -> + Remote

重要的是远程机器Ip , 端口 ,plus, octo上都可以看到

  • -Xdebug 启用调试。

  • -Xrunjdwp :启用JDWP实现,

    以下是子选项

    transport=dt_socket : JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。

    address=8080  :远程JVM在8080端口上监听请求。

    server=y   :y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是本机。

    suspend=n : n表示调试时会暂停远程虚拟机。

关于远程调试第2张

远程虚拟机

boot-env.ini文件

关于远程调试第3张

4.通过前端请求进行远程调试,后端打断点失效常见原因

1. 本地与远程代码不一致

  • 分支不一致
  • 代码未更新

2. 远程IP,端口配置错

3.本地源码与二进制代码不一致:实际JVM是基于二进制代码运行的,需要重新编译

 

参考:

https://sq.163yun.com/blog/article/170376356582318080

https://blog.csdn.net/alli0968/article/details/42176721

https://www.ibm.com/developerworks/cn/java/j-lo-jpda1/index.html?ca=drs-

https://blog.csdn.net/qq_27093465/article/details/64124330

免责声明:文章转载自《关于远程调试》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇go语言并发arm-linux-gcc等交叉编译工具的安装下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

LLDB调试基本使用

  在平时开发中,我们可能需要调试某些东西,比如查看给服务器发请求时传过去的参数,如果不适用LLDB的话我们用的最多的就是通过NSLog方式去打印,但现在我们可以精简这个步骤,那就是使用LLDB调试命令.   Xcode从4.0开始编译器开始改用LLVM,相应的调试器也从gdb改为LLDB。而从 Xcode5.0开始所有工程也被自动设置为使用LLDB。  ...

学以致用二十六-----虚拟机磁盘空间清理

最近在虚拟机上调试脚本,安装包解压又删除,解压又删除。结果发现,本地(物理主机)空间消耗很快,最后居然到C盘空间不足了 只有迁移了一个虚拟机到硬盘,再来清理下空间。 在虚拟机里,发现window系列的虚拟机是可以清理磁盘空间的 vm---manage---clean up disk 而在清理linux的虚拟机时,发现没有这个选项 这就比价坑了。那么li...

ParallelsDesktop安装精简版系统

本文原文链接地址:http://nullpointer.pw/ParallelsDesktop%E5%AE%89%E8%A3%85%E7%B2%BE%E7%AE%80%E7%89%88%E7%B3%BB%E7%BB%9F.html 分享一个虚拟机安装精简版 Windows10 系统的方法,只占用 5G 存储空间大小的完整版 win10 系统哦,不要安装那些...

VS2015远程调试

1. 目标(远程)主机配置: 找到远程调试的文件夹 (1) 发现,在Window10的应用窗口中看到: VS2015安装工具中有Remote Debugger Folder文件夹,打开如下目录: (2)如果没有在应用窗口看到这个文件夹的,可以在VS 安装目录的位置找到相应的远程调试窗口,不同版本的IDE可能文件目录不一样: 如: 在VS2017中,则需要...

Crash日志解析

当应用程序崩溃时,会创建一个崩溃报告,这对于了解导致崩溃的原因非常有用。本文档包含有关如何表示,理解和解释崩溃报告的基本信息。 1、介绍 2、获取崩溃和低内存报告 3、象征性的奔溃报告 1、位码(bitCode) 2、确定奔溃报告是否符号化 3、用Xcode标记iOS奔溃报告 4、用atos表示崩溃报告 5、符号故障排除 4、崩溃报告分析 1、...

攻略丨云开发VS Code 插件 CloudBase Toolkit 云函数调试

Tencent CloudBase Toolkit 插件 0.2.0 版起支持云函数本地调试和云端调试两种调试模式。 本地调试:使用 CloudBase CLI 在本地模拟运行 Node.js 云函数,云函数的 event 和 context 均为模拟参数,适合本地开发 云端调试:使用云端的云函数实例进行调试,所有的参数、环境均与云端一致,适合定位复杂的...