如何在eclipse中debug调试进入JDK源码及显示调试过程中的局部变量的值

转载:https://blog.****.net/ftp_2014/article/details/51087603

对于想了解JDK源码的朋友来说,通过调试JDK源码来学习是一个常用的方法。但是默认的情况下,eclipse是不支持进入jdk源码中进行调试和显示当前变量的。
本文主要解决两个问题:
(1)如何进入jdk源码中进行调试
(2)如何在进入jdk源码中进行调试的时候显示当前的局部变量值

一、如何进入jdk源码中进行调试

如果在debug调试时,不能进入JDK源码,则需要设置一下:
依次选择【Window】-【Preference】-【Java】-【Installed JREs】
如何在eclipse中debug调试进入JDK源码及显示调试过程中的局部变量的值
这里我们可以看到Eclipse默认使用的JRE,它是不支持调试的,需要替换成JDK
依次选择【Add】-【Next】-【Add JRE】
在【DIrectory】选择机器上安装的JDK的目录,不是JRE的目录。此时JDK的jar文件都会默认选择JDK目录下的src.zip作为source,如果没有,自行手动设置。
如何在eclipse中debug调试进入JDK源码及显示调试过程中的局部变量的值
然后,选择使用JDK,这个不要忘记了,点击OK按钮关闭dialog。
如何在eclipse中debug调试进入JDK源码及显示调试过程中的局部变量的值
最后在package或者project列表中选中项目,点击右键选中Properties,打开的dialog中,选择【Build Path】里使用刚刚添加的JDK:add Library->JRE system library->alternate jre,最后要去除默认的JRE引用(最好去除,不然后面很可能有问题)。
这样的话,一般就可以在debug调试的时候,可以进入到jdk源码中了。

二、如何在进入jdk源码中进行调试的时候显示当前的局部变量值

  在步骤一中,只能进入jdk源码中进行调试,但是无法查看当前jdk源码的变量值。首先我们要明白JDK source为什么在debug的时候无法观察局部变量,因为在jdk中,sun对rt.jar中的类编译时,去除了调试信息,这样在eclipse中就不能看到局部变量的值。这样的话,如果在debug的时候查看局部变量,就必须自己编译相应的源码使之拥有调试信息。要达到这个目的,一是找网上人家已经编译好的版本;二是自己去编译jdk源码。下面我们对于自己编译提供一个方法:
(1)选择或创建你的工作目录,比如我选择:C:\test\
(2) 在你的工作目录中,创建文件夹jdk_src,用于存放源码;创建文件夹jdk_debug,用于输出编译结果。
(3)从你的机器装jdk的地方找到src.zip,在你的JDK_HOME可以找到,比如我的在C:\Java\jdk1.7.0_09目录下。然后把src解压到jdk_src目录下。
(4)解压完后,选择你需要编译的源码内容包,删除剩下的包。一般选择如下的几个文件夹就可以了:java javax org 这三个目录就可以了。
(5)从你得JDK_HOMME\jre\lib中复制到你的工作目录(eg:C:\test\)中,这样做的目的可以让你减少在命令行中输入的文件名。
(6).执行如下这条命令:
dir /B /S /X jdk_src*.java > filelist.txt //创建一个叫做filelist.txt的文件,这个文件存放了所有你将要编译的类的名称。

(7)执行如下的命令:
javac -J-Xms16m -J-Xmx1024m -sourcepath c:\test\jdk_src -cp c:\test\rt.jar -d c:\test\jdk_debug -g @filelist.txt >> log.txt 2>&1 //这条命令将要编译所有你指定的文件,并把编译结果输出到jdk_debug目录中,同时产生log.txt日记文件。这个日记文件记录着编译警告,但是没有错误。
(8)进入到jdk_debug目录中,输入如下命令:
jar cf0 rt_debug.jar *
(9)把这个生成的rt_debug.jar包复制到JDK_HOME\jre\lib\endorsed。如果没有endorsed目录,自己创建一下。
(10)如果你是在eclipse中debug的。点击Window->Installed JRES,选择相应的JDK,点击Edit,然后选择点击Add External jars,选择我们步骤(9)中目中的rt_debug.jar,就可以了。现在完成了所有的步骤了,赶快尝试debug一下,如果可以查看局部变量了,那么恭喜你成功了。

参考:

  1. https://blog.****.net/leehsiao/article/details/50562871