Java 平台调试架构JPDA

转载自  Java-JPDA 概述

JPDA:Java 平台调试架构(Java Platform Debugger Architecture)

它是 Java 虚拟机为调试和监控虚拟机专门提供的一套接口。

 

一、JPDA

https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/

JPDA 由三个规范组成:JVMTI(JVM Tool Interface)、JDWP(Java Debug Wire Protocol)、JDI(Java Debug Interface)

这三个规范的层次由低到高分别是 JVMTI、JDWP、JDI

这三个规范把调试过程分解成几个概念:调试者(debugger)、被调试者(debuggee)、以及它们中间的通信器

关系和作用如下图:

JPDA 被抽象为三层实现。其中 JVMTI 是 JVM 对外暴露的接口。JDI 是实现了 JDWP 通信协议的客户端,调试器通过它和 JVM 中被调试程序通信。

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

 

二、JVMTI

https://juejin.im/post/5b029fcef265da0b83370da0

JVMTI(Java Virtual Machine Tool Interface)即指 Java 虚拟机工具接口,它是一套由虚拟机直接提供的 native 接口,它处于整个 JPDA 体系的最底层,所有调试功能本质上都需要通过 JVMTI 来提供。

通过这些接口,开发人员不仅调试在该虚拟机上运行的 Java 程序,还能查看它们运行的状态,设置回调函数,控制某些环境变量,从而优化程序性能。

1.定义及原理

JVMTI 本质上是在 JVM 内部的许多事件进行了埋点。通过这些埋点可以给外部提供当前上下文的一些信息。甚至可以接受外部的命令来改变下一步的动作。

外部程序一般利用C/C++实现一个JVMTIAgent,在Agent里面注册一些JVM事件的回调。当事件发生时JVMTI调用这些回调方法。Agent可以在回调方法里面实现自己的逻辑。JVMTIAgent是以动态链接库的形式被虚拟机加载的。

2.历史

JVMTI 的前身是 JVMDI(Java Virtual Machine Profiler Interface) 和 JVMPI(Java Virtual Machine Debug Interface),它们原来分别被用于提供调试 Java 程序以及 Java 程序调节性能的功能。

在 J2SE 5.0 之后 JDK 取代了JVMDI 和 JVMPI 这两套接口,JVMDI 在最新的 Java SE 6 中已经不提供支持,而 JVMPI 也计划在 Java SE 7 后被彻底取代。

3.功能

JVMTI 处于整个 JPDA 体系的最底层,所有调试功能本质上都需要通过 JVMTI 来提供。

从大的方面来说,JVMTI 提供了可用于 debug 和 profiler 的接口;同时,在 Java 5/6 中,虚拟机接口也增加了监听(Monitoring),线程分析(Thread analysis)以及覆盖率分析(Coverage Analysis)等功能。

从小的方面来说包含了虚拟机中线程、内存、堆、栈、类、方法、变量,事件、定时器处理等等诸多功能。具体可以参考 oracle 的文档。

通过这些接口,开发人员不仅可以调试在该虚拟机上运行的 Java 程序,还能查看它们运行的状态,设置回调函数,控制某些环境变量,从而优化程序性能。

4.实现

JVMTI 并不一定在所有的 Java 虚拟机上都有实现,不同的虚拟机的实现也不尽相同。不过在一些主流的虚拟机中,比如 Sun 和 IBM,以及一些开源的如 Apache Harmony DRLVM 中,都提供了标准 JVMTI 实现。

 

三、JDWP

JDWP(Java Debug Wire Protocol)是一个为 Java 调试而设计的一个通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。

在 JPDA 体系中,作为前端(front-end)的调试者(debugger)进程和后端(back-end)的被调试程序(debuggee)进程之间的交互数据的格式就是由 JDWP 来描述的,它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的 JVMTI 和 JDI 的通信通畅。

比如在 Sun 公司提供的实现中,它提供了一个名为 jdwp.dll(jdwp.so)的动态链接库文件,这个动态库文件实现了一个 Agent,它会负责解析前端发出的请求或者命令,并将其转化为 JVMTI 调用,然后将 JVMTI 函数的返回值封装成 JDWP 数据发还给后端。

另外,这里需要注意的是 JDWP 本身并不包括传输层的实现,传输层需要独立实现,但是 JDWP 包括了和传输层交互的严格的定义,就是说,JDWP 协议虽然不规定我们是通过 EMS 还是快递运送货物的,但是它规定了我们传送的货物的摆放的方式。

在 Sun 公司提供的 JDK 中,在传输层上,它提供了 socket 方式,以及在 Windows 上的 shared memory 方式。当然,传输层本身无非就是本机内进程间通信方式和远端通信方式,用户有兴趣也可以按 JDWP 的标准自己实现。

 

四、JDI

JDI(Java Debug Interface)是三个模块中最高层的接口,在多数的 JDK 中,它是由 Java 语言实现的。

JDI 由针对前端定义的接口组成,通过它,调试工具开发人员就能通过前端虚拟机上的调试器来远程操控后端虚拟机上被调试程序的运行,JDI 不仅能帮助开发人员格式化 JDWP 数据,而且还能为 JDWP 数据传输提供队列、缓存等优化服务。

从理论上说,开发人员只需使用 JDWP 和 JVMTI 即可支持跨平台的远程调试,但是直接编写 JDWP 程序费时费力,而且效率不高。因此基于 Java 的 JDI 层的引入,简化了操作,提高了开发人员开发调试程序的效率。

 


https://blog.csdn.net/duqi_2009/article/details/94518203

https://www.ibm.com/developerworks/cn/java/j-lo-jpda1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jzoj6305-最小值【线段树,dp,双端链表】

正题 题目大意 定义函数f(x)Ax3Bx2CxDf(x)Ax^3Bx^2CxDf(x)Ax3Bx2CxD 然后给出一个序列,要求按顺序分成若干段。对于一段[L..R][L..R][L..R],贡献为f(min{ai}(i∈[L..R]))f(min\{a_i\}(i\in[L..R]))f(min{ai​}(i∈[L..R])) 然后要求所有段的贡献之和最大…

Ocelot + Consul实践

关于Consul(https://www.consul.io)是一个分布式,高可用,支持多数据中心的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源。 在Consul的文档上,Consul 支持Service Discovery, Health …

Arthas - 开源 Java 诊断工具

转载自 Arthas使用 Authas — 开源的java诊断工具 下载安装 authas是一个jar包,可以直接下载后运行 wget https://alibaba.github.io/arthas/arthas-boot.jarjava -jar arthas-boot.jar就可以启动起来。启动后,authas会自动检测存在的java进程&…

jzoj6307-安排【归并排序】

正题 题目大意 一个目前序列,一个目标序列,每次可以选择一个区间交换区间最大值和最小值。 询问在345678345678345678步内将目前序列转换回目标序列的方案(输出该方案)。 解题思路 我们考虑归并排序,对于两个升序的序列,我们考…

.NET Core 2.1 Preview 1发布:更快的构建性能

今天,我们宣布发布 .NET Core 2.1 Preview 1。这是 .NET Core 2.1 的第一个公开发布。我们有很大的改进希望分享出来,并且渴望得到您的反馈意见,无论是在评论中还是在github中dotnet/core #1297ASP.NET Core 2.1 Preview 1 和 Entity Framewo…

Spark SQL(七)之基于用户的相似度公式

一、基于用户的Jaccard相似度公式 其中,u、v表示任意两个用户,N(u)表示用户u喜欢的物品集合,N(v)表示用户v喜欢物品的集合。 代码 public class UserCFApp {public static void main(String[]args){SparkConf sparkConf new SparkConf();sparkConf.se…

欢乐纪中A组赛【2019.8.17】

前言 前几天题目没改完(好难QvQQvQQvQ),然后这几天ZZYZZYZZY和WHFWHFWHF去广州二中了 然后我是菜鸡,今天暴力写挂了QAQQAQQAQ,T2T2T2少判断了个东西少了808080 成绩 懒得写只放自己的了(反正垫底) Rank51,20ptsRank51,20ptsRank51,20pts 正…

BXUG第11期活动

分享主题:Xamarin Azure 微软云加端移动应用技术架构分享者:周岳 微软MVP分享主题:从设计图到最终界面- Xamarin跨平台界面最佳实践分享者: 程文锋 视高盛景分享主题:基于VSTS的App DevOps分享者: 安庭庭 张浩 视高…

Spark SQL(八)之基于物品的相似度公式

一、基于物品的Jaccard相似度公式 其中,i、j表示任意两个物品,N(i)表示喜欢物品i的用户数,N(j)表示喜欢物品j的用户数。 代码: public class ItemCFApp {public static void main(String[]args){SparkConf sparkConf new Spark…

CF1200D-White Lines【二维前缀和】

正题 题目链接:https://www.luogu.org/problem/CF1200D 题目大意 一个黑白组成的n∗nn*nn∗n矩阵,然后可以选择将k∗kk*kk∗k的覆盖为白色,然后求有多少白线(整行或整列都是白色)。 解题思路 对于每一行或每一列可以变成白线的话那么可行范围一定是一…

ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL

ASP.NET CORE MVC 中,默认的 Route 模板是: /{controller}/{action} 。我们可以通过开启 URL 小写转换将 URL 变为小写,但此方式在 Controller 或者 Action 为一个词组时,生成的 URL 并不友好。假设我们有 UserController 和 Add…

Spark SQL(九)之基于用户的推荐公式

一、基于用户的推荐公式 其中,S(u,K)表示与用户u最相似的K个用户,N(i)代表喜欢物品i的用户集合,rm表示用户v对物品i的评分。 二、代码 public class UserCFRecommendApp {public static void main(String[]args){SparkConf sparkConf new S…

jzoj6309-完全背包【贪心,背包】

正题 题目大意 完全背包,不过容量特别大。 解题思路 然后我们可以先做一个1∼200001\sim 200001∼20000的背包,然后枚举一个大小,然后将这个大小填入背包知道无法填入为止,然后剩下的空位在再一次背包就好。 codecodecode #incl…

拥抱.NET Core系列:MemoryCache 缓存过期

MSCache项目MSCache目前最新的正式版是 2.0.0,预览版是2.1.0,会与.NETCore 2.1一起发布。本篇用了2.0.0版本开源在GitHub上,仓库地址是:https://github.com/aspnet/CachingNuGet地址为:https://www.nuget.org/packages…

Spark SQL(十)之基于物品的推荐公式

一、基于物品的推荐公式 其中,S(j,K)表示与物品j最相似的K个物品,N(u)表示用户u喜欢的物品集合,Rui表示用户u对物品i的评分。 二、代码 public class ItemCFRecommendApp {public static void main(String[]args){SparkConf sparkConf new …

jzoj6308-中间值【分治】

正题 题目大意 两个序列不降a,ba,ba,b,每次可以修改或询问[l1,r1,l2,r2][l_1,r_1,l_2,r_2][l1​,r1​,l2​,r2​]要求输出将序列aaa的l1∼r1l_1\sim r_1l1​∼r1​和bbb的l2∼r2l_2\sim r_2l2​∼r2​部分合起来然后求中位数。 解题思路 我们考虑分治,…

MongoDB嵌套数组,多维数组查询

一、嵌套数组 数据: {"arrays": [{"keyArrays": [{"key": "index","key2": "index2"},{"key": "index1","key2": "index2"}]}] } mongo语法 db.collecti…

ASP.NET Core Razor 页面使用教程

ASP.NET Core Razor 页面作为 ASP.NET Core 2.0的一部分发布,它是基于页面的全新的Web开发框架。如果您想学习如何使用 ASP.NET Core Razor 页面,可以访问微软的官方站点https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/razor-page…

jzoj6306-Sequence【线性筛,积性函数,数论】

正题 题目大意 定义函数f(x)f(x)f(x)表示有多少长度为nnn的序列使得其中全都是xxx的约束,然后每个序列的贡献是这个序列的gcdgcdgcd再gcdgcdgcd上一个BBB。 给出n,m,Bn,m,Bn,m,B,求∑i1mf(i)\sum_{i1}^mf(i)∑i1m​f(i)。 解题思路 我们发现fff是一个…

MongoDb连接表的查询

一、外键关联 a_table关联b_table通过a_table的a_fieldb_table的b_field,在a_table生成lookup_field字段存储关联的b_table数据 MongoOperations mongoOperations ...;LookupOperation agg Aggregation.lookup("b_table", "a_field","…