调试未分配给命名变量的堆栈数据

时间:2010-05-26 19:13:49

标签: java debugging

有没有办法查看堆栈元素,如未分配的返回值或未分配给局部变量的异常? (例如扔新......)

例如,假设我的代码如下:

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限制?)

2 个答案:

答案 0 :(得分:1)

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

在大多数情况下,JDI会镜像代码的结构。可以通过调试对象线程的当前StackFrame获取给定范围的命名本地。可以通过调试对象线程的当前Method获取无范围的本地和方法参数。但是,通常文档引用LocalVariable时,它是一个名为local的。

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

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

答案 1 :(得分:0)

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