问题
某次我在使用Eclipse调试Java代码时,突然遇到了一个问题:
在调试模式下查看变量的窗口Variables
中无法查看方法中的局部变量;虽然还可以看到方法参数的值,但参数名信息全都丢失了。
我发现以前调试的时候也没出现这种情况,所以我还翻出了以前的代码进行调试,也没出现出这种奇怪的问题,这让我很纳闷。不过我发现,只有在调试有关JDK的源码会出现这种状况,而在调试其他框架的源码的时候根本没有问题。所以在这我也确定了,其实就是调试JDK源码的时候会出现这个问题。
虽然关联了JDK源码,我们也知道方法的参数名,但在调试的时候,这些信息就丢失了,参数名变成了毫无意义的arg0
、arg1
、arg2
。
在调试的时候,Variables
窗口没有显示局部变量,并且使用watch
或inspect
查看都不行。
原因
在知道具体问题后,我便在网上查了一下,产生该问题的大体原因就是官方发布的JDK是去除了编译时的调试信息,这是为了降低JDK安装包的体积。而当我们调试JDK的源码想要查看各种变量信息,这就需要编译后带有调试信息的class文件。所以,rt.jar
这个jar包中所编译好的字节码文件是不带调试信息的。
解决方案
解决方案有2种,一种是到网上搜寻看有没有已经编译过已经带有调试信息的jar包下载,而另一种方法肯定是我们亲自编译官方所提供的源码src.zip
,并使其带上调试信息。我也在网上找过,但大多的都是JDK6的版本,而没有找到过JDK7或8相关已经重新编译好的jar包,并且,有的资源还是要高分才能下载的。而我在某些博文中也看到以前官方是提供了用于debug的JDK,但这些链接全都是过时了。
所以,最好的解决方案就是我们亲自动手,所谓自己动手丰衣足食。
完美的解决方案是我在stackoverflow上一个问题找到的。
步骤
- 选一个地方作为你的
工作目录
,比如我选择c:\
- 在工作目录中,创建名为
jdk_src
和jdk_export
两个文件夹 - 从
JAVA_HOME
路径(即你的jdk安装路径)里找到src.zip
这个文件并把它的内容解压到jdk_src
中 - 解压后,我们只需
java
、javax
、org
三个文件夹,而其余的文件夹都可以删除(这些我们用不到) - 从
JAVA_HOME\jre\lib
这个路径下找到rt.jar
这个文件,并复制它到工作目录
中 - 使用命令行,进入
工作目录
,执行命令dir /B /S /X 工作目录\jdk_src\*.java > filelist.txt
,
这个filelist.txt
里面列出了你将要编译的java文件 - 继续执行
javac
命令:
javac -J-Xms16m -J-Xmx1024m -sourcepath 工作目录\jdk_src -cp 工作目录\rt.jar; -d 工作目录\jdk_export -g @filelist.txt >> log.txt 2>&1
- 打开
log.txt
查看,如果没有错误只有警告,说明编译OK,可以继续以下的操作 - 使用命令行,进入
jdk_export
文件夹,并执行命令jar cf0 rt_debug.jar *
,这样就会生成带有调试信息的运行库 - 将这个新生成好jar包复制到
JAVA_HOME\jre\lib\endorsed
,如果没有endorsed
这个文件夹,那就先创建它
完成以上步骤后,查看一下Eclipse里的Installed JRES
JDK环境是否添加了rt_debug.jar
,添加完成后,现在再次用Eclipse调试JDK源码,这就不会再出现之前的问题了。