JPDA 概览
JPDA 的全称是 Java Platform Debugger Architecture,它是 Java 官方针对 Java 代码调试所设计的一个机制。在 Oracle 官网上有专门的页面介绍。它属于多层架构,包括:JVMTI 接口规范、JDWP 通信规范、JDI API 层。
Debug 应该是每个程序员都经历过的,日常基于 IDE 的开发中,我们可以给某行代码打上断点,然后以 Debug 模式运行程序,程序运行后会在断点处暂停,这时开发者可以安逸地查看此时各个变量的值,也可以在此时加上更多的断点。
-
JVMTI
Java VM Tool Interface 定义的是一系列跟调试相关的接口,由 VM 实现这些接口。我们所说的程序暂停下来,确实是 JVM 运行代码的时候停在了有断点的地方,那么 JVM 必然提供一种联络方式,让别人告诉它断点在哪个类的第几行。这里的联络方式,就是 JVMTI(JVM Tool Interface),这是 JVM 提供的一个类似钩子的机制,通过 JVMTI,可以指挥 JVM 执行某些操作,例如停在断点处,也可以在 JVM 运行过程中,发生某些事件时,通过钩子通知外部感兴趣的人。
那么谁可以跟钩子通信呢,并不是说任何人只要有兴趣就行的。JVM 要求它必须是一个 JVMTI Agent,Java 在不同的操作系统中,都已经内置了本地 JVMTI Agent。在 Windows 系统中,这个 JVMTI Agent 就是一个 DLL 文件,在类 Unix 的操作系统中,则是一个 SO 文件。JVMTI Agent 与 JVM 是运行在同一个机器上同一个进程内的。
-
JDWP
当想要利用 JVMTI 让 JVM 做一些事的时候,那么就要先要与 Agent 通信,由它代为传话。因此,JVMTI Agent 内置了一个称之为“通信后端”的模块,用来接收外部的请求。
想要与 JVMTI Agent 通信的第三方,就要先与通信后端通信,通信就意味着必然有一个通信协议的存在,这个协议就是 JDWP(Java Debug Wire Protocol) 协议。
-
JDI
Java 程序员经常使用的 eclipse、idea 这样的 IDE 来 debug 程序的时候,就是以 JDWP 协议与目标 JVM 的 JVMTI Agent 通信的。考虑到 JDWP 协议的实现比较繁琐,Java 官方也在 com.s