使用 Java Debug Interface(JDI)调试多线程应用程序
2009-10-10 00:00:00 来源:WEB开发网Java Debug Wire Protocol(JDWP),定义了调试双方信息和请求的文本格式。
Java Debuger Interface(JDI),定义了代码级别的调试接口。
从开发者的角度来看,调试工具的开发既可以基于 JVMTI 也可以基于 JDI。JVMTI 是 native 接口,使用起来相对复杂,并且需要 C 语言的基础,因此,在本文中,我们将介绍如何使用 JDI 这种最上层的方式来开发 Java 调试程序。
需求分析
在接下的部分,我们将介绍如何使用 JDI 来开发一个用来调试多线程程序的工具。在开始前,让我们先列出这个工具需要满足的功能:
独立于目标应用程序的。
应该足够简单,并且能在通过少量的代码修改就能完成集中配置,这样是帮助开发者不需要付出太多的努力就能开始调试自己的多线程程序。
能够抓取足够的信息,比如说异常的信息,程序调用过程中的变量值等等。
所生成的 Log 应该足够清晰,能够按不同的线程来分离记录,而不是按照时间的顺序来生成每一条记录,否则会给调试带来不便。
实现
在文章最后的 示例代码 中,我们展示了一个典型的基于 JDI 的调试工具逻辑,并且用它来 Profile 一个简单的多线程程序的执行。根据前面所提到的需求,代码展示了线程运行栈快照、方法调用的入口参数值收集、异常过滤定制、类过滤配置、线程 Log 记录等功能。具体来说:
独立于目标程序
分析工具可以通过如下方式启动:
java Trace options class args
支持的 options 参数:
-output 文件名:工具生成的 Log 的路径
class 是目标程序的入口类,args 为目标程序的输入参数
简洁配置
异常过滤配置:
您可以在 ExceptionConfig.properties 属性文件中配置所需记录异常类型。在 Demo 代码中配置了对于 NullPointerException 和 UserDefinedException 两种异常,分析工具将追踪这两种异常情况。
更多精彩
赞助商链接