快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
ator();        while (it.hasNext()) {          handleEvent(it.nextEvent());        }        eventSet.resume();      } catch (InterruptedException exc) {// Ignore      } catch (VMDisconnectedException discExc) {        handleDisconnectedException();        break;      }    } }

获取多线程执行信息

执行流程和变量信息是调试程序最重要的两方面。无论是通过 IDE 设置断点 的调试方式,还是通过在程序中记 Log 的调试方式,它们的主要目的是向开发 者提供以上两方面信息。本文分析器以单个线程为单位,来记录线程运行信息:

执行流程。分析器以方法作为最小颗粒度单位。分析器按照实际的线程执行 顺序记录方法进出。

变量值。对于单个方法而言,其程序逻辑固定,方法的输入值决定了方法内 部执行流程。分析器将在方法入口和出口分别记录该方法作用域内可见变量,便 于开发者调试。

执行栈信息记录。当异常发生时,执行栈中完好地保存了调用帧信息。分析 器获取线程栈中的所有帧,并记录每个帧记录的信息,其中包含可见变量值、帧 调用名称等信息。StackFrame 中变量信息的获取也是 JDI 所提供的特殊能力之 一。

与 IDE 设置断点的方法相比,提供的数据信息量相当,但分析器提供执行流 程信息更加的清晰;与在程序中记录 Log 的方式相比,分析器在执行流程和信 息量两方面都胜出。

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

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

以下将详细介绍上面三方面信息抓取:

线程执行流程

线程执行流程可划分:线程启动→ run() →进入方法→ ... →退出方法→ 线程结束。通过向虚拟机实例注册 ThreadStartRequest,MethodEntryRequest ,MethodExitRequest 和 ThreadDeathRequest 事件的方式记录执行过程。事件 注册详细见清单 4,清单 6 列出分析器对于以上事件的处理方法。

清单 6. 获取执行流程

void threadStartEvent(ThreadStartEvent event) {    println("Thread " + event.thread().name() + "  Start"); } void methodEntryEvent(MethodEntryEvent event) {    println("Enter Method:" + event.method().name() + " --  "      + event.method().declaringType().name());    // 进入方法记录可见变量值     this.printVisiableVariables(); } void methodExitEvent(MethodExitEvent event) {    println("Exit Method:" + event.method().name() + " --  "      + event.method().declaringType().name());    // 退出方法记录可见变量值     this.printVisiableVariables(); } void threadDeathEvent(ThreadDeathEvent event) {    println("Thread " + event.thread().name() + " Dead"); }

可见变量信息抓取

清单 7. 可见变量信息抓取

private void printVisiableVariables() {    try{      this.thread.suspend();      if(this.thread.frameCount()>0) {        //获取当前方法所在的帧         StackFrame frame = this.thread.frame(0);        List<LocalVariable> lvs =  frame.visibleVariables();        for (LocalVariable lv : lvs) {          println("Name:" + lv.name() + "\t" +  "Type:"            + lv.typeName() + "\t" + "Valu

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号