快速业务通道

使用Java Debug Interface(JDI)调试多线程应用程序 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
e:"            + frame.getValue(lv));        }      }    } catch(Exception e){//ignore}    finally{this.thread.resume();} }

通过 this.thread.frame(0) 获取当前方法对应的帧,调用 frame.visibleVariables() 取出当前方法帧的所有可见变量。

异常时线程栈快照

清单 8. 异常事件线程栈快照

private void printStackSnapShot() {    try {      this.thread.suspend();      //获取线程栈       List<StackFrame> frames = this.thread.frames ();      //获取线程栈信息      for (StackFrame frame : frames) {        if (frame.thisObject() != null) {          //获取当前对象应该的所有字段信息          List<Field> fields = frame.thisObject ().referenceType().allFields();          for (Field field : fields) {            println(field.name() + "\t" +  field.typeName()+ "\t"              + frame.thisObject().getValue(field));          }        }        //获取帧的可见变量信息        List<LocalVariable> lvs =  frame.visibleVariables();        for (LocalVariable lv : lvs) {          println(lv.name() + "\t" + lv.typeName() +  "\t"            + frame.getValue(lv));        }      }    } catch (Exception e) {}    finally { this.thread.resume();} }

通过 this.thread.frames() 获取异常发生时线程栈中所有帧信息,调用 frame.thisObject() 获取对 this 指针的引用,进而获取对象字段信息;对于 帧信息的抓取与清单 7 类似。

使用Java Debug Interface(JDI)调试多线程应用程序(6)

时间:2010-12-19 IBM 钱毅 蔡小川

分类信息生成 Log

以单线程为记录单元是分析器的特点,下面将从分析器 Log 实现结构、目标 程序所模拟的场景及分析结果三方面对示例代码进行介绍。

分析器 Log 实现结构

Trace 为分析器入口类,它负责创建绑定连接,生成目标程序虚拟机实例; EventThread 负责从虚拟机实例的事件队列中获取事件,交由对应的 ThreadTrace 处理,它同时维护着一张 ThreadReference 和 ThreadTrace 一一 对应关系的映射表;ThreadTrace 负责分析 ThreadReference 信息,并将结果 记录在 logRecord 的缓存中,每个 ThreadTrace 实现了单个线程信息的追踪, 详见图 1。

图 1. 分析器类图 :

目标程序

目标程序由两个核心类组成:MainThread 和 CounterThread。MainThread 是程序的主类,它负责启动两个 CounterThread 线程实例并抛出两类异常:用 户自定义异常 UserDefinedException 和运行时异常 NullPointerException; CounterThread 是一个简单的计数线程。整个目标程序模拟的是多线程和异常的 环境。

分析结果

Log 依照目标程序的调用层次进行缩进,清晰地展现每个线程的执行逻辑和 变量信息,详见清单 9。为了方便理解,我们在 log 中加入了注释。

清单 9. Log

-- VM Started --    ====== main ======      Enter Method:main//        Enter Method:<init>//MainThread 构造函数          a   int   0          b   int   0          c   int   0        Exit Method:<init>        Enter  Method:makeABusinessException//makeABusinessException 方法

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号