Java程序调试跟c++类程序调试,存在显著区别,Java基于虚拟机,所以调试本质是查看运行时,虚拟机状态,而c,调试时,需要生成一个调试版程序,所有运行时状态有这个调试程序来提供。
类eclipse,intellij,netbeans等图形化ide都提供了一个调试器,可以调试java 程序,此类调试器,需基于java 的调试体系,来进行开发。它们只是一个壳,java 自带jdb 控制台调试命令。
JPDA(Java Platform Debugger Architecture)是 Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。 JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP),以及 Java 调试接口(JDI)
它们的关系是调用者,被调用者,以及通讯层协议。
(被调试者)jvmti(Java Virtual Machine Debug Interface),调试的本质是通过jvmti,查看虚拟机运行状态变量,设置回调等。
(通信层协议)JDWP(Java Debug Wire Protocol)是定义调试者与被调试者,之间的一个数据定义,他规定了后端调用的命令格式,以及前端返回数据的格式。jdwp.dll(jdwp.so)是sun的实现。
协议层只规定了数据格式,没有对传输层进行约束,如同我们规定了货物的打包、编码、发送目拜访格式。但是不限制是走快递还是物流。所以传输层可以自定义,一般实现有2种
1.socket 方式,
2.以及在 Windows 上的 shared memory 方式。
当然,传输层本身无非就是本机内进程间通信方式和远端通信方式,用户有兴趣也可以按 JDWP 的标准自己实现。
Java 调试接口(JDI)
JDI(Java Debug Interface)是三个模块中最高层的接口,在多数的 JDK 中,它是由 Java 语言实现的。 JDI 由针对前端定义的接口组成,通过它,调试工具开发人员就能通过前端虚拟机上的调试器来远程操控后端虚拟机上被调试程序的运行,JDI 不仅能帮助开发人员格式化 JDWP 数据,而且还能为 JDWP 数据传输提供队列、缓存等优化服务。从理论上说,开发人员只需使用 JDWP 和 JVMTI 即可支持跨平台的远程调试,但是直接编写 JDWP 程序费时费力,而且效率不高。因此基于 Java 的 JDI 层的引入,简化了操作,提高了开发人员开发调试程序的效率
表 1. JPDA 层次比较
模块
层次
编程语言
作用
JVMTI
底层
C
获取及控制当前虚拟机状态
JDWP
中介层
C
定义 JVMTI 和 JDI 交互的数据格式
JDI
高层
Java
提供 Java API 来远程控制被调试虚拟机
Java 的 JPDA 就是一套为调试和优化服务的虚拟机的操作工具,其中,JVMTI 是整合在虚拟机中的接口,JDWP 是一个通讯层,而 JDI 是前端为开发人员准备好的工具和运行库。