结构概述
Java平台调试器架构的结构如下:
组件 调试器接口 / |--------------| / | 虚拟机 | 被调试程序 ----( |--------------| <------- JVM TI - Java虚拟机工具接口 \ | 后端 | \ |--------------| / | 通信通道 -( | <--------------- JDWP - Java调试线协议 \ | |--------------| | 前端 | |--------------| <------- JDI - Java调试接口 | 用户界面 | |--------------|
什么是Java平台调试器架构(JPDA)?
JPDA是一个多层次的调试架构,允许工具开发人员轻松创建调试器应用程序,可在各种平台、虚拟机(VM)实现和JDK版本之间可移植地运行。
JPDA由三层组成:
- JVM TI - Java虚拟机工具接口
- 定义了VM提供的调试服务。
- JDWP - Java调试线协议
- 定义了被调试程序和调试器进程之间的通信。
- JDI - Java调试接口
- 定义了一个高级别的Java语言接口,工具开发人员可以轻松使用它来编写远程调试器应用程序。
参考实现
除了这些接口的规范外,Oracle还提供了一个参考实现,包括:
- 多个VM上的JVM TI实现(参见VM文档)。
- 一个使用JVM TI实现JDWP调试器端的后端。
- 一个使用JDWP调试器端实现JDI的前端。
- 两个简单的示例调试器应用程序,构建在JDI之上。
这提供了一个分层实现,其中任何一层都可以被替换。
使用JPDA
调试器开发人员可以在任何层次上连接到JPDA。由于JDI是最高级别且最易于使用的,我们鼓励开发人员使用这个接口。假设一家公司使用JDI开发了一个调试器。他们可以将其与参考实现一起使用,它将自动适用于Oracle支持的VM和平台。例如,它也可以与参考实现的前端一起工作,并且可以运行另一家公司实现了JDWP的VM上的被调试程序(可能使用或绕过JVM TI)。
一些调试器是构建在较低层次上的,例如JDWP(例如,如果前端不是用Java语言编写的)或JVM TI(对于需要低级功能的专门调试器)。
组件
被调试程序
被调试程序是正在被调试的进程,它包括被调试的应用程序(未显示)、运行应用程序的VM和调试器的后端。
Java虚拟机(VM)
这指的是正在运行被调试应用程序的VM。
调试器架构被设计用于在各种VM实现中使用。
VM实现了Java虚拟机工具接口(JVM TI)。
后端
调试器的后端负责将来自调试器前端的请求传递给被调试程序的VM,并将这些请求的响应(包括所需的事件)传递给前端。后端使用Java调试线协议(JDWP)通过通信通道与前端通信。后端使用Java虚拟机工具接口(JVM TI)与被调试程序的VM通信。
从经验中可以明显看出,运行在被调试程序上并用Java编写的调试器支持代码会以导致挂起和其他不良行为的方式与被调试程序竞争。因此,后端是本地代码。这又意味着JVM TI必须是纯本地接口。
通信通道
通信通道是调试器的前端和后端之间的链接。它可以被看作由两个机制组成:
-
连接器。连接器是一个JDI对象,用于建立前端和后端之间的连接。
JPDA定义了三种类型的连接器:
- 监听连接器:前端监听来自后端的传入连接
- 附加连接器:前端附加到已经运行的后端
- 启动连接器:前端实际上启动将运行被调试代码和后端的Java进程
-
传输。传输是用于在前端和后端之间传输位的底层机制。
使用的传输机制未指定;可能的机制包括:套接字、串行线路和共享内存。然而,通过通道流动的序列化位流的格式和语义由Java调试线协议(JDWP)指定。
JPDA包括服务提供者接口,允许开发和部署连接器和传输实现。这些服务提供者接口允许调试器和其他工具供应商开发新的连接器实现,并提供超出Oracle提供的套接字和共享内存传输之外的其他传输机制。JDI中的服务提供者接口在com.sun.jdi.connect.spi包中指定。
除了JDI中的服务提供者接口外,JPDA还定义了一个名为Java调试线协议传输接口的传输库接口。传输库由目标VM中的JDWP代理加载,并用于建立与调试器的连接以及在调试器和VM之间传输JDWP数据包。
有关使用这些SPI的更多信息,请参阅Java平台调试器架构 - 服务提供者接口。
前端
调试器前端实现了高级别的Java调试接口(JDI)。前端使用来自低级别Java调试线协议(JDWP)的信息。
用户界面(UI)
调试器的用户界面未指定;意图是工具供应商将提供增值实现。我们提供了一个简单的图形用户界面(GUI)示例,作为测试工具和更复杂GUI开发的起点。还提供了JDB的一个版本作为示例。
这些示例UI是Java调试接口(JDI)的客户端。
调试器接口
Java虚拟机工具接口(JVM TI)
由VM实现的本地接口。
定义了VM必须为调试提供的服务。包括请求信息(例如,当前堆栈帧)、操作(例如,设置断点)和通知(例如,断点命中时)。调试器可能使用除此之外的VM信息(例如,Java本机接口(JNI)),但这是所有调试器特定信息的来源。
指定VM接口允许任何VM实现者轻松地插入调试架构。它还允许替代的通信通道实现。不遵循此接口的VM实现仍可以通过Java调试线协议(JDWP)提供访问。
另请参见:
Java调试线协议(JDWP)
定义了在被调试程序进程和调试器前端之间传输的信息和请求的格式。它不定义传输机制(套接字、串行线路、共享内存等)。
协议的规范允许被调试程序和调试器前端在不同的VM实现和/或不同的平台上运行。它还允许前端用其他语言编写,或者被调试程序是非本地的(例如Java)。
信息和请求大致处于Java虚拟机调试接口(JVM TI)的级别,但会包括由带宽问题所需的附加信息和请求,例如信息过滤和批处理。
另请参见:
Java调试接口(JDI)
由前端实现的100% Java接口。
在用户代码级别定义了信息和请求。
虽然调试器实现者可以直接使用Java调试线协议(JDWP)或Java虚拟机工具接口(JVM TI),但这个接口极大地促进了调试功能集成到开发环境中。我们建议所有调试器开发都使用JDI层。
另请参见: