JAVA 调试框架(JPDA)简介

原始链接:http://blog.sina.com.cn/s/blog_3f5f0dd70100070z.html

JPDA 是一个多层的调试框架,包括 JVMDI、JDWP、JDI 三个层次。JAVA 虚拟机提供了 JPDA 的实现。其开发工具作为调试客户端,可以方便的与虚拟机通讯,进行调试。Eclipse 正是利用 JPDA 调试 JAVA 应用,事实上,所有 JAVA 开发工具都是这样做的。SUN JDK 还带了一个比较简单的调试工具以及示例。

JVMDI 定义了虚拟机需要实现的本地接口

JDWP 定义了JVM与调试客户端之间的通讯协议
调试客户端和JVM 既可以在同一台机器上,也可以远程调试。JDK 会包含一个默认的实现 jdwp.dll,JVM 允许灵活的使用其他协议代替 JDWP。SUN JDK 有两种方式传输通讯协议:Socket 和共享内存(后者仅仅针对 Windows),一般我们都采用 Socket 方式。
你可以用下面的参数,以调试模式启动JVM

-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
-Xrunjdwp  JVM 加载 jdwp.dll 
transport=dt_socket  使用 Socket 传输
address  表示调试端口号
server=y  表示 JVM 作为服务器,建立 Socket
suspend=n  表示启动过程中,JVM 不会挂起去等待调试客户端连接

  • JDI 则是一组JAVA接口
    如果是一个 JAVA 的调试客户端,只要实现 JDI 接口,利用JDWP协议,与虚拟机通讯,就可以调用JVMDI了。

    下图为 JPDA 的基本架构:
    Components  Debugger Interface
    /  |-----------------------|
    /  |  VM  |
    debuggee ----(  |-----------------------|  <------- JVMDI - Java VM Debug Interface
    \  |  back-end  |
    \  |-----------------------|
    /  |
    comm channel -(  |  <--------------- JDWP - Java Debug Wire Protocol
    \  |
    |---------------------|
    | front-end  |
    |---------------------|  <------- JDI - Java Debug Interface
    |  UI  |
    |---------------------|
    参见:http://java.sun.com/j2se/1.4.2/docs/guide/jpda/architecture.html

  • Eclipse作为一个基于 JAVA 的调试客户端,利用 org.eclipse.jdt.debug Plugin 提供了JDI 的具体实现。JDI 接口主要包含下面 4 个包

    com.sun.jdi com.sun.jdi.connect com.sun.jdi.event com.sun.jdi.request

    本文不对 JDI 进行深入阐述,这里重点介绍 JDI 中与断点相关的接口。

    • com.sun.jdi
      主要是JVM(VirtualMachine) 线程(ThreadReference) 调用栈(StackFrame) 以及类型、实例的描述。利用这组接口,调试客户端可以用类似类反射的方式,得到所有类型的定义,动态调用 Class 的方法。
    • com.sun.jdi.event
      封装了JVM 产生的事件, JVM 正是将这些事件通知给调试客户端的。例如 BreakpointEvent 就是 JVM 执行到断点的时候,发出的事件;ClassPrepareEvent就是 Class 被加载时发出的事件。
    • com.sun.jdi.request
      封装了调试客户端可以向 JVM发起的请求。例如 BreakpointRequest 向 JVM 发起一个添加断点的请求;ClassPrepareRequest 向 JVM 注册一个类加载请求,JVM 在加载指定 Class 的时候,就会发出一个 ClassPrepareEvent 事件。

你可能感兴趣的:(JAVA 调试框架(JPDA)简介)