使用 Java Debug Interface(JDI)调试多线程应用程序
2009-10-10 00:00:00 来源:WEB开发网可见变量信息抓取
清单 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" + "Value:"
+ 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();}
}
更多精彩
赞助商链接