- 环境:
- eclipse3.4及以上版本、NetBeans 5.x及以上版本、IntelliJ IDEA等
- jdk5及以上版本
- 名词解释:
- JPDA(Java Platform Debugger Architecture): Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP),以及 Java 调试接口(JDI)
- JVMTI(JVM Tool Interface):Java 虚拟机工具接口,JDK提供的一套用于开发JVM监控, 问题定位与性能调优工具的通用编程接口。JVMTI 的前身是 JVMDI 和 JVMPI。
- JDWP(Java Debug Wire Protocol):Java 调试线协议,是一个为 Java 调试而设计的一个通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。在 JPDA 体系中,作为前端(front-end)的调试者(debugger)进程和后端(back-end)的被调试程序(debuggee)进程之间的交互数据的格式就是由 JDWP 来描述的,它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的 JVMTI 和 JDI 的通信通畅。
- JDI(Java Debug Interface):是 JPDA 三层模块中最高层的接口,定义了调试器(Debugger)所需要的一些调试接口。基于这些接口,调试器可以及时地了解目标虚拟机的状态,例如查看目标虚拟机上有哪些类和实例等。另外,调试者还可以控制目标虚拟机的执行,例如挂起和恢复目标虚拟机上的线程,设置断点等。
- JVMPI(Java Virtual Machine Profiler Interface):可以监控JVM发生的各种事件。例如当JVM创建,关闭,Java类被加载,创建对象,或GC回收,等37种事件。
- JVMDI(Java Virtual Machine Debug Interface):Java 虚拟机调试接口。
JVMTI的前身为JVMPI及JVMDI,Java5.0中这两套接口已被JVMTI取代,JVMDI在java6中已经不支持,JVMPI在Java7中将彻底不存在。
- JPDA简介:
Java 平台调试器架构
Components Debugger Interfaces
/ |--------------|
/ | VM |
debuggee -----( |--------------| <---- JVMTI - Java VM Tool Interface
\ | back-end |
\ |--------------|
/ |
comm channel --( | <------------ JDWP - Java Debug Wire Protocol
\ |
/ |--------------|
/ | front-end |
debugger -----( |--------------| <---- JDI - Java Debug Interface
\ | UI |
\ |--------------|
debuggee为被调试者,即我们想要调试的jvm。
debugger为调试者,即jdi的实现,例如eclipse的org.eclipse.jdt.debug等工具。
jdwp为传输协议,定义debuggee和debugger之间的数据传输格式,但并不包括传输层的实现,具体采用什么方式传输数据需要独立实现,Sun的JDK中数据传输提供了两种方式:socket、shared memory(仅widows下可用)
- 远程调试参数:
-Xdebug
启用调试特性。
-Xrunjdwp:<sub-options>
在目标 VM 中加载 JDWP 实现。它通过传输和 JDWP 协议与独立的调试器应用程序通信。下面介绍一些特定的子选项。
从 Java V5 开始,您可以使用 -agentlib:jdwp 选项,而不是 -Xdebug 和 -Xrunjdwp。但如果连接到 V5 以前的 VM,只能选择 -Xdebug 和 -Xrunjdwp。下面简单描述 -Xrunjdwp 子选项。
transport
这里通常使用套接字传输。但是在 Windows 平台上也可以使用共享内存传输。
server
如果值为 y,目标应用程序监听将要连接的调试器应用程序。否则,它将连接到特定地址上的调试器应用程序。
address
这是连接的传输地址。如果服务器为 n,将尝试连接到该地址上的调试器应用程序。否则,将在这个端口监听连接。
suspend
如果值为 y,目标 VM 将暂停,直到调试器应用程序进行连接。
例子:
作为调试服务器的目标 VM
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8765
作为调试客户机的目标 VM
-Xdebug -Xrunjdwp:transport=dt_socket,address=127.0.0.1:8765
JPDA 层次比较
模块 层次 编程语言 作用
JVMTI 底层 C 获取及控制当前虚拟机状态
JDWP 中介层 C 定义 JVMTI 和 JDI 交互的数据格式
JDI 高层 Java 提供 Java API 来远程控制被调试虚拟机
- 总结:
JPDA 定义了一套如何开发调试工具的接口和规范。
JPDA 由三个独立的模块 JVMTI、JDWP、JDI 组成。
调试者通过 JDI 发送接受调试命令。
JDWP 定义调试者和被调试者交流数据的格式。
JVMTI 可以控制当前虚拟机运行状态。
除了标准实现,JPDA 还有许多开源实现供使用(Apache Harmony、org.eclipse.jdt.debug)。
- 参考及扩展资料:
使用 Eclipse 远程调试 Java 应用程序
http://www.ibm.com/developerworks/cn/opensource/os-eclipse-javadebug/
使用Netbeans远程调试Java应用程序
http://wiki.netbeans.org/FaqDebuggingRemote
使用 intellij idea 进行远程调试
http://yiminghe.iteye.com/blog/1027707
深入 Java 调试体系系列文章(共4部分):
http://www.ibm.com/developerworks/cn/java/j-lo-jpda1/
基于 JVMTI 实现 Java 线程的监控
http://www.ibm.com/developerworks/cn/java/j-lo-jvmti/