缘起

研究JDK源码的同学应该知道,在debug的时候是无法看源码中局部变量的值的,且方法变量也会显示成arg1,arg2这种形式而不是真正的变量名。

原因

为什么呢?因为在JDK中,sun对rt.jar中的类编译时,去除了调试信息。那么是否有解决办法呢?答案是肯定的。

解决方案
  1. 在你的D:盘新建jdk文件夹,然后在文件夹里面分别创建两个文件夹jdk_src(存放源码)和jdk_debug(存放编译结果文件)。
  2. 从%JAVA_HOME%(此处%JAVA_HOME%就是你的jdk的安装路径,默认的应该是C:\Program Files\Java\jdk1.8.0_152)路径下找到src.zip源码源码压缩包,解压至D:/jdk/jdk_src目录中,并只保留java,javax,org三个文件夹。
  3. 从%JAVA_HOME%\jre\lib找到rt.jar,将它拷贝到D:/jdk文件夹。
  4. 打开DOS命令窗口,用命令cd命令进入D:/jdk文件夹,然后执行命令dir /B /S /X .\jdk_src*.java > .\filelist.txt,完成后会在D:/jdk目录生成filelist.txt文件,里面为待编译的文件路径*/*.java。
  5. 执行命令javac -J-Xms16m -J-Xmx1024m -sourcepath .\jdk_src -cp .\rt.jar -d .\jdk_debug -g @.\filelist.txt >> .\log.txt 2>&1会编译filelist.txt文件中列出的*.java源文件,编译的*.class文件会放入D:/jdk/jdk_debug文件夹,同时编译过程中会在D:/jdk生成log.txt文件。执行完毕之后最后能进D:/jdk/jdk_debug这个下面看看有没有生成文件夹,如果没有生成的话可能是javac命令有问题,可以按照教程重新设置一下java环境变量然后重新执行此步骤。
  6. 执行cd命令切换到D:/jdk/jdk_dug,然后执行jar cf0 rt_debug.jar .class文件打成jar,打包完成后会在D:/jdk/jdk_debug目录中生成rt_debug.jar。
  7. 把这个生成的rt_debug.jar包复制到%JDK_HOME%\jre\lib\endorsed下。如果没有endorsed目录,自己创建一下。
  8. 在eclipse里面找到Window->Installed JRES,选择jdk,点击Edit,然后点击Add External jars,选择刚才创建的rt_debug.jar导入,然后把rt_debug.jar移动到rt.jar的前面,最后选中rt_debug.jar,点击Source Attachment选择%JAVA_HOME%/jdk/src.zip添加源文件,最后,重启eclipse。
    Eclipse调试JDK源码无法查看变量值或者变量值显示arg的解决方案_变量值不显示
    Eclipse调试JDK源码无法查看变量值或者变量值显示arg的解决方案_jar_02
    Eclipse调试JDK源码无法查看变量值或者变量值显示arg的解决方案_eclipse调试_03
    到此,就配置完了,再次打开源码就可以看到变量了。