引入:
前面用了很多篇幅来讨论JVMTI和JDWP部分,现在终于来看最靠近用户端部分了,JDI。
分析:
a. JDI的基础知识
和JVMTI和JDWP不一样的是,JDI提供了一组接口,这些接口是纯JAVA编写的。他们主要是给开发环境IDE用的,虽然调试器的实现可以直接利用JDWP或者JVMTI,但是多了这一层则可以从用户的代码级别来定义要发送的请求和获取的信息。
本质上,Eclipse的调试器与目标VM之间的双向通信如下:
调试器将用户的操作转化为调试命令,命令通过链接被发送到前端运行目标程序的虚拟机上;然后,目标虚拟机根据接受的命令做出相应的操作,将调试的结果发回给后端的调试器;最后,调试器可视化数据信息反馈给用户。
JDI接口定义在$JAVA_HOME/lib/tools.jar中,从宏观上看,它分为5个大包。
包名 | 描述 |
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的代码级别来分析这些模块。
本文出自 “平行线的凝聚” 博客,请务必保留此出处http://supercharles888.blog.51cto.com/609344/1587958
原文地址:http://supercharles888.blog.51cto.com/609344/1587958