无法检查本地声明的变量

IT小君   2021-10-16T04:45:16

有时,当我在 Eclipse 中调试代码时,虽然我可以毫无困难地查看和检查类成员变量,但我无法检查在函数中本地声明的变量的值。顺便说一句,当前函数的任何参数都失去了它们的“真实”名称,而是在变量窗口中看到它们的值列为 arg0、arg1、arg2 等,但至少这些值是可见的。

目前,这种情况与核心 JDK 中定义的类有关。我已经验证安装的和当前的 JRE 是一个 JDK。

有没有人能够对这种行为有所了解?

评论(4)
IT小君

显然,答案是:

JDK 附带的 rt.jar(核心 Java 类所在的位置)没有使用 .class 文件中包含的完整调试信息进行编译,因此调试器没有局部变量信息。

不幸的是,这不是 Eclipse 可以做的任何事情 - 所有调试器都会遇到与 JDK 核心类相同的问题。

Eclipse 3.4发行说明指出:

缺少调试属性
如果要能够显示行号和局部变量,调试器需要使用调试属性编译类文件。很多时候,类库(例如,“rt.jar”)是在没有完整调试属性的情况下编译的,因此这些类的局部变量和方法参数在调试器中是不可见的。

2021-10-16T04:45:16   回复
IT小君

曾经是,你可以从HTTP调试的rt.jar://download.java.net/jdk6/binaries/,但是现在不是了。

所以现在用 -g 构建你自己的 rt.jar似乎是唯一的选择。这很简单:只需使用 JDK 中的 javac 和 jar。

  • mkdir \tmp; mkdir \tmp\out
  • 解压src.zip到JDK安装目录tmp\src
  • cd src
  • find -name *.java > files.txt
  • javac -verbose -g -d \tmp\out -J-Xmx512m -cp "<jdk>\jre\lib\rt.jar";"<jdk>\lib\tools.jar" @files.txt
  • cd \tmp\out; jar cvf rt.jar *

如果您使用 Eclipse,则不需要 -Xbootclasspath/p:,而只需在启动配置中的 JRE 之前将您的调试 jar 放入 Bootstrap Entries。

2021-10-16T04:45:16   回复
IT小君

您可以在以下位置找到 1.6.0_25 的调试二进制文件:http : //download.java.net/jdk6/6u25/promoted/b03/index.html

这应该让您调试到 1.6 的 Java 库代码。

2021-10-16T04:45:17   回复
IT小君

我尝试了链接(http://www.javaadvent.com/2014/12/recompiling-java-runtime-library-with.html),下载了ant脚本并对其进行了修改。修改:传入<compilerarg line="-g" />javac。它生成了 rt.jar。替换了 JRE 的 rt.jar。(不要忘记保留备份)。

现在我可以在 eclipse 中的调试过程中观察、检查 rt.jar 中任何类的局部变量。

2021-10-16T04:45:17   回复