首页 > 解决方案 > Eclipse调试到java源,不列出源类的成员变量

问题描述

我正在尝试调试 JDK 源文件。更具体地说,我有兴趣研究 Collection 类的内部实现。

所以我创建了一个简单的 Java 项目,添加了一些示例代码,如下所示:

import java.util.HashMap;
import java.util.Map;

public class HashMapWorking {
    public static void main(String[] args) {
        Map<String, String> demoMap = new HashMap<>();

        demoMap.put("one", "first");
        demoMap.put("two", "second");
        demoMap.put("three", "third");
    }
}

例如,我需要知道调用该demoMap.put()方法时会发生什么。

我使用“编辑源查找路径”对话框添加了源存档:

在此处输入图像描述

现在我的问题是,当我调试到类put()中的方法时,变量选项卡没有列出它的成员变量。相反,我只是看到传递给各个方法的参数:java.util.HashMap

在此处输入图像描述

带有方法的局部变量也没有被捕获

我该怎么做才能像调试任何其他源类一样通过 java 源进行调试?

我尝试在“编辑源查找路径”对话框中引用src.zip以及提取的 src.zip 版本,但它们都不起作用。

好心提醒。

标签: javaeclipsedebugging

解决方案


类字段。在您发布的显示中,您实际上并没有停止在HashMap.put(K,V)方法中,而是在HashMap.hash(Object)方法(put调用)中。 hash(Object)是一种static方法——它在没有任何“实例”上下文(特别是this)的情况下执行。

如果您沿着堆栈向下查找该put(K,V)方法(或任何其他实例方法),您将看到它有一个 HashMap 对象作为this. 如果尚未展开,请单击加号框以查看类中的所有字段。

尽管静态字段(仅)可由静态方法访问(并且取决于可见性,可访问其他没有或使用实例的类中的方法),但“变量”窗口/视图无法找到它们. 您可以在“表达式”窗口/视图中访问单个静态字段——尽管在标准 (JDK) 类中,我查看的静态字段大多是常量,其值在源代码中给出,因此使用调试器查看它们不是非常有用。

局部变量。较旧的 Oracle 版本显然是使用LineNumber(和 SourceFile)调试信息编译的,但没有LocalVariable 调试信息。这些是单独的子选项;参见帮助信息或手册javac。如果类文件中没有这些信息,调试器不会显示局部变量或参数名称(它会显示参数arg0 arg1等,因为类型信息在基本类文件数据中)。

我不知道他们为什么这样做;也许这是预开源时代的遗留物。Oracle 为较新版本(j9 及更高版本)构建,而我可以轻松检查的一些OpenJDK 构建是否具有LocalVariables。您可以尝试其中一种(使用较新的版本可能在某种程度上取决于您的 Eclipse 版本)。


推荐阅读