使用 Java Debug Interface(JDI)调试多线程应用程序
2009-10-10 00:00:00 来源:WEB开发网核心提示: 通过 this.thread.frames() 获取异常发生时线程栈中所有帧信息,调用 frame.thisObject() 获取对 this 指针的引用,使用 Java Debug Interface(JDI)调试多线程应用程序(10),进而获取对象字段信息;对于帧信息的抓取与清单 7 类似,
通过 this.thread.frames() 获取异常发生时线程栈中所有帧信息,调用 frame.thisObject() 获取对 this 指针的引用,进而获取对象字段信息;对于帧信息的抓取与清单 7 类似。
分类信息生成 Log
以单线程为记录单元是分析器的特点,下面将从分析器 Log 实现结构、目标程序所模拟的场景及分析结果三方面对示例代码进行介绍。
分析器 Log 实现结构
Trace 为分析器入口类,它负责创建绑定连接,生成目标程序虚拟机实例;EventThread 负责从虚拟机实例的事件队列中获取事件,交由对应的 ThreadTrace 处理,它同时维护着一张 ThreadReference 和 ThreadTrace 一一对应关系的映射表;ThreadTrace 负责分析 ThreadReference 信息,并将结果记录在 logRecord 的缓存中,每个 ThreadTrace 实现了单个线程信息的追踪,详见图 1。
图 1. 分析器类图 :
图片看不清楚?请点击这里查看原图(大图)。
目标程序
目标程序由两个核心类组成:MainThread 和 CounterThread。MainThread 是程序的主类,它负责启动两个 CounterThread 线程实例并抛出两类异常:用户自定义异常 UserDefinedException 和运行时异常 NullPointerException;CounterThread 是一个简单的计数线程。整个目标程序模拟的是多线程和异常的环境。
分析结果
Log 依照目标程序的调用层次进行缩进,清晰地展现每个线程的执行逻辑和变量信息,详见清单 9。为了方便理解,我们在 log 中加入了注释。
更多精彩
赞助商链接