JPDA(jaa platform debugger architecture)

参考文献:
https://www.ibm.com/developerworks/cn/java/j-lo-jpda1/index.html?ca=drs-
https://www.ibm.com/developerworks/cn/java/j-lo-jpda2/
http://www.ibm.com/developerworks/cn/java/j-lo-jpda3/index.html?ca=drs-
http://www.ibm.com/developerworks/cn/java/j-lo-jpda4/index.html?ca=drs-

https://docs.oracle.com/javase/7/docs/technotes/guides/jpda/architecture.html
https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html

1.概述

Java 程序都是运行在 Java 虚拟机上的,我们要调试 Java 程序,事实上就需要向 Java 虚拟机请求当前运行态的状态,并对虚拟机发出一定的指令,设置一些回调等等,那么 Java 的调试体系,就是虚拟机的一整套用于调试的工具和接口。
对于 Java 虚拟机接口熟悉的人来说,您一定还记得 Java 提供了两个接口体系,JVMPI(Java Virtual Machine Profiler Interface)和 JVMDI(Java Virtual Machine Debug Interface),而它们,以及在 Java SE 5 中准备代替它们的 JVMTI(Java Virtual Machine Tool Interface),都是Java 平台调试体系(Java Platform Debugger Architecture,JPDA)的重要组成部分。 Java SE 自 1.2.2 版就开始推出 Java 平台调试体系结构(JPDA)工具集,而从 JDK 1.3.x 开始,Java SDK 就提供了对 Java 平台调试体系结构的直接支持。顾名思义,这个体系为开发人员提供了一整套用于调试 Java 程序的 API,是一套用于开发 Java 调试工具的接口和协议。本质上说,它是我们通向虚拟机,考察虚拟机运行态的一个通道,一套工具。理解这一点对于学习 JPDA 非常重要。

换句话说,通过 JPDA 这套接口,我们就可以开发自己的调试工具。通过这些 JPDA 提供的接口和协议,调试器开发人员就能根据特定开发者的需求,扩展定制 Java 调试应用程序,开发出吸引开发人员使用的调试工具。前面我们提到的 IDE 调试工具都是基于 JPDA 体系开发的,区别仅仅在于它们可能提供了不同的图形界面、具有一些不同的自定义功能。另外,我们要注意的是,JPDA 是一套标准,任何的 JDK 实现都必须完成这个标准,因此,通过 JPDA 开发出来的调试工具先天具有跨平台、不依赖虚拟机实现、JDK 版本无关等移植优点,因此大部分的调试工具都是基于这个体系的。

1.1 架构

JVMTI ( Java VM Tool Interface):java 1.5推出的新接口。它通过接口的形式定义了VM可提供的调试服务;
JDWP(Java Debug Wire Protocol): java 调试通信协议。调试者与被调试者两者通信协议。
JDI (Java Debug Interface): 高层的Java语言接口,调试工具开发者可基于该接口开发自己的调试工具。
在这里插入图片描述

1.2 关于JPDA中各层说明

调试开发者可使用JPDA中各层接口进行开发。但是JDI是JPDA中最高层的,y也是使用起来最简单的,鼓励调试工具开发者使用该层接口开发。如果某个公司需要开发调试器,则可参考“JDI参看实现”。

1.2.1 VM

JVM实现了JVM TI接口。
关于JVM TI接口的说明见下章节。

1.2.2. back-end

负责和debugger(调试者)前端通信,并交消息传递给被调试的VM,并将消息返回给debugger(调试者)前端。两者通信通过JDWP(Java Debug Wire Protocol)。back-end和被调试的虚拟机通信通过 JVMTI ( Java Virtual Machine Debug Interface)通信
== 前后端的通信机制:==
通信包括两种机制,1)connector,2)transport(具体实现形式没有定义) 。其中connector是一个JDI对象。backend与front-end可通过conector建立通信连接。JPDA定义了三种connector:

  • (1) listening connectors: 前端监听back-end的连接请求;
  • (2)attaching connectors:前端主动的绑定到已经运行了的后端上;
    *(3)launching connectors:前端自己启动java vm,其中包括了被调试的java代码和back-end(所有的东西都在一起)

1.2.3. 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 的标准自己实现。

1.2.4 JDI

JDI(Java Debug Interface)是三个模块中最高层的接口,在多数的 JDK 中,它是由 Java 语言实现的。 JDI 由针对前端定义的接口组成,通过它,调试工具开发人员就能通过前端虚拟机上的调试器来远程操控后端虚拟机上被调试程序的运行,JDI 不仅能帮助开发人员格式化 JDWP 数据,而且还能为 JDWP 数据传输提供队列、缓存等优化服务。从理论上说,开发人员只需使用 JDWP 和 JVMTI 即可支持跨平台的远程调试,但是直接编写 JDWP 程序费时费力,而且效率不高。因此基于 Java 的 JDI 层的引入,简化了操作,提高了开发人员开发调试程序的效率。

1.2.5. front-end

front-end实现了JDI接口。

2. JVMTI:Java 虚拟机工具接口

JVMTI(Java Virtual Machine Tool Interface)即指 Java 虚拟机工具接口,它是一套由虚拟机直接提供的 native 接口,它处于整个 JPDA 体系的最底层,所有调试功能本质上都需要通过 JVMTI 来提供。通过这些接口,开发人员不仅调试在该虚拟机上运行的 Java 程序,还能查看它们运行的状态,设置回调函数,控制某些环境变量,从而优化程序性能。

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

2.1 JVMTI与Agent的关系

JVM TI is implemented by HotSpot and allows a native code ‘agent’ to inspect and modify the state of the JVM.(参看http://openjdk.java.net/groups/hotspot/docs/Serviceability.html#battach 中的说明)
Agent 即 JVMTI 的客户端,它和执行 Java 程序的虚拟机运行在同一个进程上,通过调用 JVMTI 提供的接口和虚拟机交互,负责获取并返回当前虚拟机的状态或者转发控制命令。把 Agent 编译成一个动态链接库之后,我们就可以在 Java 程序启动的时候来加载它(启动加载模式),也可以在 Java 5 之后使用运行时加载(活动加载模式)。
总结:个人感觉,JVMTI一种操作JVM的规范与接口。开发者通过Agent的方式使用该套接口。同时Agent的逻辑运行机制依赖与JVMTI接口的实现。

2.2 Agent的工作过程

我们使用 JVMTI 的过程,主要是设置 JVMTI 环境监听虚拟机所产生的事件

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JPDA(Matlab)是一种用于航迹关联的算法,具体分为基于卡尔曼滤波、粒子滤波和启发式搜索三种实现方式。如果你对JPDA算法感兴趣,可以访问海神之光的个人主页获取相应的Matlab代码。通过使用这些代码,你可以学习和实践JPDA算法,并进行相关的仿真开发。此外,海神之光也提供其他多个Matlab仿真内容,例如图像处理、路径规划、神经网络预测与分类、优化求解、语音处理、信号处理和车间调度等领域。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【航迹关联】基于matlab NNDA+PDA+JPDA算法航迹关联【含Matlab源码 1928期】](https://blog.csdn.net/TIQCmatlab/article/details/125648565)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [实现航迹关联的三种JPDA算法及Matlab代码](https://blog.csdn.net/code_welike/article/details/131862643)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值