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

标签 java debugging

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

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

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

最佳答案

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

在大多数情况下,JDI 反射(reflect)了代码的结构。给定范围的命名局部变量可以通过调试对象线程的当前 StackFrame 获得。 .可以通过调试对象线程的当前 Method 获取无作用域的局部变量和方法参数.但是,一般情况下,在文档中引用 LocalVariable 的地方,它是一个命名的本地变量。

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

结论是如果在Java 1.6下直接使用JDI的话,如果正常返回的话,可以在函数赋值给local之前拿到函数的返回值。 Eclipse 和 Netbeans UI 不支持这个。您无法获取有关已抛出但尚未捕获的异常的信息。

关于java - 调试未分配给命名变量的堆栈数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2915994/

相关文章:

java - <Lists> 清空自身

debugging - NativeScript Webview - 如何查看控制台输出

asp.net-mvc - 使用 Visual Studio 调试,ASP.NET MVC 上的 URL 错误

debugging - 确定Speex编码的音频与预期设置有何不同

c++ - Qt Creator调试不直接停在断点

java - 检查 20 个随机 boolean 值是否具有相同的值

Java 比较器总是将值读取为字符串

ADLS Gen2 中文件的 Java 文件对象

java - Gradle 尝试编译 jar 的源代码

eclipse - 我可以将Eclipse调试器中的结果集查看为表格吗