学习jdk源码的时候,我们都会像学习其他源码的时候,想对源码进行调试,但是虽然可以进入断点,但是不能看到断点变量的值。
原因:jdk中的Jre里的rt.jar包的class文件编译生成时是设置为不生成调试信息的(javac -g:none)(可以查看javac命令的参数说明)。
解决方法是用javac -g对源码重新编译,并覆盖原来的jar包,下面讲讲如何让myelipse调试jdk源码时显示变量值:
1.在你的D:
盘新建jdk
文件夹,然后在文件夹里面分别创建两个文件夹jdk_src
(存放源码)和jdk_debug
(存放编译结果文件)。
2.从%JAVA_HOME%
路径下找到src.zip
源码源码压缩包,解压至D:/jdk/jdk_src
目录中,并只保留java
,javax
,org
三个文件夹。
3.从%JAVA_HOME%\jre\lib
找到rt.jar
,将它拷贝到D:/jdk
文件夹(重新编译生成class文件时依赖的类库)。
4.打开DOS命令窗口,用命令cd
命令进入D:/jdk
文件夹,然后执行命令dir /B /S /X .\jdk_src\*.java > .\filelist.txt
,完成后会在D:/jdk
目录生成filelist.txt
文件,里面为待编译的文件路径*/*.java
。
dir命令扩展 :
/S 显示指定目录及所有子目录中文件
/B 使用空格式(没有标题信息或摘要)。
/X 显示为非 8.3 文件名产生的短名称。格式是 /N 的格式, 短名称插在长名称前面。如果没有短名称,在其位置显示空白。
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
文件。
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
添加源文件,并把rt.jar
的源文件删除,最最后,重启eclipse。