2010-05-26 79 views
2

有没有办法查看未分配的返回值或未分配给本地变量的异常等堆栈元素? (如抛出新的...)调试未分配给已命名变量的堆栈数据

例如,假设我有沿的线条代码:

public String foo(InputStream in) throws IOException {  
    NastyObj obj = null; 
    try { 
     obj = new NastyObj(in); 
     return (obj.read()); 
    } finally { 
     if (obj != null) obj.close(); 
    } 
} 

有什么办法来查看返回或异常值,而迈向更高的水平帧中它被分配?这与例外情况尤其相关,因为您经常需要通过多个帧后退来查找实际的处理程序。

我通常使用Eclipse的调试环境,但任何答案是赞赏。另外,如果这不能完成,你能解释为什么吗? (JVM,JPDA的限制?)

+0

你的意思是这样的:http://stackoverflow.com/questions/1069066/get-current-stack-trace-in-java/1069074#1069074 – jjnguy 2010-05-26 19:17:05

+0

以为不止一次。 Eclipse不能,AFAIK。 – 2010-05-26 19:40:28

+0

@ Justin Nelson - No目标是查看调试器中的异常或返回值。例如如果我在finally块的某个断点处停下来的话。获取堆栈跟踪将只显示进入foo的调用路径,而不是结果。 – gibbss 2010-05-26 20:00:34

回答

1

答案似乎是JPDA/JDI和Eclipse都不足。 我已验证以下内容,但除非有人真的需要,否则我不打算发布代码。

JDI大部分反映了代码的结构。给定范围的命名当地人可以通过调试对象线程当前的StackFrame获得。通过调试对象线程当前的Method可以获得未调整的局部和方法参数。但是,通常在文档引用LocalVariable的地方,它是一个命名的本地。

如果函数正常返回并且您使用1.6调试设置(RFE),则可以获取函数的返回值。如果调试器侦听MethodExitEvent,那么event.returnValue()将在所有方法执行完成后获取返回的值。根据文档,当方法通过抛出的异常终止时,不会生成此事件。

结论是,如果您直接在Java 1.6下使用JDI,则可以在函数返回值分配给本地(如果它正常返回)之前获取它的返回值。 Eclipse和Netbeans UI不支持这一点。您无法获取有关引发但尚未捕获的异常的信息。

0

难道你只是赶上IOException(并命名它),然后重新抛出它? (不知道Java,但这就是我在C++和Python中所做的。)当然,如果您无法编辑给定代码或正在检查并需要知道什么它看起来像...但如果你可以编辑代码,这似乎是要走的路。

+0

谢谢,但不,我不想编辑代码。 通常当这是一个问题时,我正在调试第三方代码,并且不想深入(或重新编译)NastyObj,因为它很讨厌。 – gibbss 2010-05-26 20:04:00