引入:前端
前面用了不少篇幅来讨论JVMTI和JDWP部分,如今终于来看最靠近用户端部分了,JDI。后端
分析:eclipse
a. JDI的基础知识
ide
和JVMTI和JDWP不同的是,JDI提供了一组接口,这些接口是纯JAVA编写的。他们主要是给开发环境IDE用的,虽然调试器的实现能够直接利用JDWP或者JVMTI,可是多了这一层则能够从用户的代码级别来定义要发送的请求和获取的信息。工具
本质上,Eclipse的调试器与目标VM之间的双向通讯以下:ui
调试器将用户的操做转化为调试命令,命令经过连接被发送到前端运行目标程序的虚拟机上;而后,目标虚拟机根据接受的命令作出相应的操做,将调试的结果发回给后端的调试器;最后,调试器可视化数据信息反馈给用户。spa
JDI接口定义在$JAVA_HOME/lib/tools.jar中,从宏观上看,它分为5个大包。debug
包名 |
描述 |
com.sun.jdi |
这是JDI的核心包,它提供了镜像机制将目标虚拟机上的全部数据、类型、域、方法、事件、状态和资源,以及调试器发向目标虚拟机的事件请求等都映射成 Mirror 对象 |
com.sun.jdi.connect |
该包用于定义JDI到目标虚拟机的链接 |
com.sun.jdi.connect.spi |
该包用于定义开发TransportService(也就是前面我在JDWP层讨论很深的传输器服务)所须要的必要的类和接口。 |
com.sun.jdi.event |
该包定义了JDI事件和事件处理 |
com.sun.jdi.request |
该包用于发送JDI事件而后在必定条件下发送。 |
b.JDI的具体实现调试
以Eclipse为例:对象
org.eclipse.jdt.debug 是 JDI 的一个完整实现,而org.eclipse.jdt.debug.ui 是 Eclipse 调试工具界面的实现。从包名上看,咱们大致上把JDI 分红三个部分:
(1)数据模块。它负责调试器(Debugger)和目标虚拟机上(Target VM)的数据建模。
(2)连接模块。它创建调试器(Debugger)与目标虚拟机(Target VM)的沟通渠道。
(3)事件请求与处理模块。它提供调试器(Debugger)与目标虚拟机(VM)之间的交互方式。
咱们会在接下来的几篇文章中从Eclipse的代码级别来分析这些模块。