JDPA是java的一套调试机制(IDE调试工具都是基于jdpa开发,通过 JPDA 开发出来的调试工具先天具有跨平台、不依赖虚拟机实现、JDK 版本无关等移植优点,因此大部分的调试工具都是基于这个体系的),java虚拟机给出的俩类接口体系分别是JVMPI与JVMDI,这俩个接口提分都是整个java调试机制重要组成的部分
JDPA分为3个模块如下,其中的VM或者是JDI是单独可以抽取出来的,不去遵守jdwp的协议只需要遵守自己单独模块的通信与命令接口就好。现在分别介绍一下这三个模块
Java 虚拟机工具接口(JVMTI)
JVMTI(Java Virtual Machine Tool Interface)即指 Java 虚拟机工具接口,它是一套由虚拟机直接提供的 native 接口,它处于整个 JPDA 体系的最底层,所有调试功能本质上都需要通过 JVMTI 来提供。通过这些接口,开发人员不仅调试在该虚拟机上运行的 Java 程序,还能查看它们运行的状态,设置回调函数,控制某些环境变量,从而优化程序性能。我们知道,JVMTI 的前身是 JVMDI 和 JVMPI,它们原来分别被用于提供调试 Java 程序以及 Java 程序调节性能的功能。在 J2SE 5.0 之后 JDK 取代了 JVMDI 和 JVMPI 这两套接口,JVMDI 在最新的 Java SE 6 中已经不提供支持,而 JVMPI 也计划在 Java SE 7 后被彻底取代。就是java的虚拟机但是在运行的过程中多了加载Agent JDWP 从而具调试功能。被调试器必须是java以及c/c++编写
必须通过java虚拟机提供jamti接口实现debug功能
JDWP通信协议
JDWP是调试器(debug)与被调试器的java虚拟机(target vm)之间的通信协议,这二者之间分别有着各自的进程在其运行,他们之间的通信方式就是jdwp,类似于adb吧像桥梁一样。jdwp可以理解为一个传输的协议,但是他没有定义协议的传输数据的格式,所以我们可以建立在任何的传输协议上。
协议建立:协议只需要进行一次握手和应答就可以建立起联系,通讯的命令是无序的,一般是通过命令包和回复包来进行信息之间的交流。
命令包:通过命令来获取请求的数据信息来得知debug时间得发生如断点或产生异常。
回复包:一般是回复执行是否成功,要是成功的话会发送一些关于请求数据等。
dwp传输层定义接口有俩类:连接管理和I/O操作
连接管理:负责连接和关闭(调试器、被调试器之间)并提供一个可靠的双向数据流
I/O操作:负责传输层读写packet
Java 调试接口(JDI)
JDI(Java Debug Interface)是三个模块中最高层的接口,在多数的 JDK 中,它是由 Java 语言实现的。 JDI 由针对前端定义的接口组成,通过它,调试工具开发人员就能通过前端虚拟机上的调试器来远程操控后端虚拟机上被调试程序的运行,JDI 不仅能帮助开发人员格式化 JDWP 数据,而且还能为 JDWP 数据传输提供队列、缓存等优化服务。从理论上说,开发人员只需使用 JDWP 和 JVMTI 即可支持跨平台的远程调试,但是直接编写 JDWP 程序费时费力,而且效率不高。因此基于 Java 的 JDI 层的引入,简化了操作,提高了开发人员开发调试程序的效率。
总结:
模块 ------- 层次 ---- 语言 ---- 作用
JVMTI ---- 底层 ---- C ---- 获取及控制当前虚拟机状态
JDWP ---- 中介层 ---- C ---- 定义 JVMTI 和 JDI 交互的数据格式
JDI --------- 高层 ---- Java ---- 提供 Java API 来远程控制被调试虚拟机