使用Eclipse调试JDK源码时无法查看局部变量的问题

问题

某次我在使用Eclipse调试Java代码时,突然遇到了一个问题:

在调试模式下查看变量的窗口Variables中无法查看方法中的局部变量;虽然还可以看到方法参数的值,但参数名信息全都丢失了。

我发现以前调试的时候也没出现这种情况,所以我还翻出了以前的代码进行调试,也没出现出这种奇怪的问题,这让我很纳闷。不过我发现,只有在调试有关JDK的源码会出现这种状况,而在调试其他框架的源码的时候根本没有问题。所以在这我也确定了,其实就是调试JDK源码的时候会出现这个问题。

虽然关联了JDK源码,我们也知道方法的参数名,但在调试的时候,这些信息就丢失了,参数名变成了毫无意义的arg0arg1arg2

在调试的时候,Variables窗口没有显示局部变量,并且使用watchinspect查看都不行。

原因

在知道具体问题后,我便在网上查了一下,产生该问题的大体原因就是官方发布的JDK是去除了编译时的调试信息,这是为了降低JDK安装包的体积。而当我们调试JDK的源码想要查看各种变量信息,这就需要编译后带有调试信息的class文件。所以,rt.jar这个jar包中所编译好的字节码文件是不带调试信息的。

解决方案

解决方案有2种,一种是到网上搜寻看有没有已经编译过已经带有调试信息的jar包下载,而另一种方法肯定是我们亲自编译官方所提供的源码src.zip,并使其带上调试信息。我也在网上找过,但大多的都是JDK6的版本,而没有找到过JDK7或8相关已经重新编译好的jar包,并且,有的资源还是要高分才能下载的。而我在某些博文中也看到以前官方是提供了用于debug的JDK,但这些链接全都是过时了。

所以,最好的解决方案就是我们亲自动手,所谓自己动手丰衣足食。

完美的解决方案是我在stackoverflow上一个问题找到的。

步骤

  1. 选一个地方作为你的工作目录,比如我选择c:\
  2. 在工作目录中,创建名为jdk_srcjdk_export两个文件夹
  3. JAVA_HOME路径(即你的jdk安装路径)里找到src.zip这个文件并把它的内容解压到jdk_src
  4. 解压后,我们只需javajavaxorg三个文件夹,而其余的文件夹都可以删除(这些我们用不到)
  5. JAVA_HOME\jre\lib这个路径下找到rt.jar这个文件,并复制它到工作目录
  6. 使用命令行,进入工作目录,执行命令dir /B /S /X 工作目录\jdk_src\*.java > filelist.txt
    这个filelist.txt里面列出了你将要编译的java文件
  7. 继续执行javac命令:
    javac -J-Xms16m -J-Xmx1024m -sourcepath 工作目录\jdk_src -cp 工作目录\rt.jar; -d 工作目录\jdk_export -g @filelist.txt >> log.txt 2>&1
  8. 打开log.txt查看,如果没有错误只有警告,说明编译OK,可以继续以下的操作
  9. 使用命令行,进入jdk_export文件夹,并执行命令jar cf0 rt_debug.jar *,这样就会生成带有调试信息的运行库
  10. 将这个新生成好jar包复制到JAVA_HOME\jre\lib\endorsed,如果没有endorsed这个文件夹,那就先创建它

完成以上步骤后,查看一下Eclipse里的Installed JRESJDK环境是否添加了rt_debug.jar,添加完成后,现在再次用Eclipse调试JDK源码,这就不会再出现之前的问题了。