重新编译JDK源码以支持Eclipse调试
首先我们要明白JDK source为什么在debug的时候无法观察局部变量,因为在jdk中,sun对rt.jar中的类编译时,去除了调试信息,这样在eclipse中就不能看到局部变量的值。这样的话,如果在debug的时候查看局部变量,就必须自己编译相应的源码使之拥有调试信息。要达到这个目的,要么找网上人家已经编译好的版本,要么自己去编译。
References:
- https://stackoverflow.com/questions/18255474/debug-jdk-source-cant-watch-variable-what-it-is StackOverflow原文
- http://www.cnblogs.com/zjrodger/p/5110538.html cnblog译文
鉴于找到相同版本的编译好的debug源码实在是有点困难,所以最好还是自己动手。
以下都是翻译自参考链接,步骤都是亲自测试通过的,环境为Win10,JDK 8u151,除非说明,否则命令都是在工作目录下执行的!路径不要切换错了。
- 创建工作目录,这里我选择
D:\tmp
- 在工作目录下创建源码文件夹如:
jdk8_src
和输出文件夹如:jdk_debug
- 从
JDK_HOME
文件夹拷贝src.zip
文件,解压到jdk8_src
中,JDK_HOME
的路径可以通过命令echo %JAVA_HOME%
查看。 选择需要编译的文件夹,并把其余的删掉。如果全部编译会需要额外的操作,这里就不操作了,只编译一些常用的。
选择如下的文件夹:- java
- javax
- org
- 在
JDK_HOME\jre\lib
下找到文件rt.jar
,把文件放到工作目录下(这一步只是为了方便命令中少输入些文件的路径名) - 执行命令
dir /B /S /X jdk8_src\*.java > filelist.txt
,命令会创建一个名为filelist.txt
的文件,其中列出了所有会被编译的Java文件,这个文件将会作为javac的输入。 - 执行javac命令:
javac -J-Xms16m -J-Xmx1024m -sourcepath d:\tmp\jdk8_src -cp d:\tmp\rt.jar -d d:\tmp\jdk_debug -g @filelist.txt >> log.txt 2>&1
。注意替换其中相应的路径。这条命令会编译所有的文件并输出到jdk_debug文件夹,并且会在工作目录生成log.txt文件。检查日志内容,应该会得到一堆警告,但是没有错误,如果你发现有错误,请检查命令并删除刚刚通过命令生成的文件,然后重新执行。 - 进入jdk_debug目录执行命令:
jar cf0 rt_debug.jar *
,这会在当前目录生成包含debug信息的运行库。 - 将生成的jar文件拷到
JDK_HOME\jre\lib\endorsed
下,如果endorsed文件夹不存在则创建。
然后再去debug就能看到JDK源码中的变量了: