Java远程调试研究过程

  • 环境:
  1. eclipse3.4及以上版本、NetBeans 5.x及以上版本、IntelliJ IDEA等
  2. jdk5及以上版本

 

  • 名词解释:
  1. JPDA(Java Platform Debugger Architecture): Java 平台调试体系结构的缩写,通过 JPDA 提供的 API,开发人员可以方便灵活的搭建 Java 调试应用程序。JPDA 主要由三个部分组成:Java 虚拟机工具接口(JVMTI),Java 调试线协议(JDWP),以及 Java 调试接口(JDI)
  2. JVMTI(JVM Tool Interface):Java 虚拟机工具接口,JDK提供的一套用于开发JVM监控, 问题定位与性能调优工具的通用编程接口。JVMTI 的前身是 JVMDI 和 JVMPI。
  3. JDWP(Java Debug Wire Protocol):Java 调试线协议,是一个为 Java 调试而设计的一个通讯交互协议,它定义了调试器和被调试程序之间传递的信息的格式。在 JPDA 体系中,作为前端(front-end)的调试者(debugger)进程和后端(back-end)的被调试程序(debuggee)进程之间的交互数据的格式就是由 JDWP 来描述的,它详细完整地定义了请求命令、回应数据和错误代码,保证了前端和后端的 JVMTI 和 JDI 的通信通畅。
  4. JDI(Java Debug Interface):是 JPDA 三层模块中最高层的接口,定义了调试器(Debugger)所需要的一些调试接口。基于这些接口,调试器可以及时地了解目标虚拟机的状态,例如查看目标虚拟机上有哪些类和实例等。另外,调试者还可以控制目标虚拟机的执行,例如挂起和恢复目标虚拟机上的线程,设置断点等。
  5. JVMPI(Java Virtual Machine Profiler Interface):可以监控JVM发生的各种事件。例如当JVM创建,关闭,Java类被加载,创建对象,或GC回收,等37种事件。
  6. 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        |

                   \    |--------------|    


Java远程调试研究过程
 

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/

你可能感兴趣的:(java)