最近突然萌发了研究JDK源码的想法,所以就想到了在自己常用的Eclipse上可以调试JDK源码。

整个设置过程也很简单:

首先你要安装好JDK(我的JDK安装路径根目录是D:\Java\jdk-8u92-windows-x64),JDK安装路径根目录里有个“src.zip”就是JDK的源码文件压缩包;

设置好环境变量的JAVA_HOME变量和PATH变量(JAVA_HOME变量值是JDK安装路径根目录D:\Java\jdk-8u92-windows-x64)。

然后打开Eclipse设置可以Debug模式调试JDK源码:

1 打开Eclipse的菜单栏Windows->Preferences:点开Java->Installed JREs,点击Add->Standard VM,JRE home就填写你环境变量里的%JAVA_HOME%路径(我的%JAVA_HOME%是D:\Java\jdk-8u92-windows-x64);

2 在JRE system libraries可以看到JDK源码的相关JAR包,点开某个JAR(如D:\Java\jdk-8u92-windows-x64\jre\lib\resources.jar、D:\Java\jdk-8u92-windows-x64\jre\lib\rt.jar……),可以看到“Source attachment:(none)”,点击右侧的“Source attachment…”选择External location->Path通过路径指向JDK源码文件压缩包%JAVA_HOME%\src.zip;

通过上面两步设置,就有了一个可以调试JDK源码的JRE了。

只需把项目的JRE指定为这个设置好的JRE,就可以调试JDK源码。

通过上面的设置,虽然调试可以进入到JDK源码,但是你会发现JDK源码的方法的传入参数和方法体里的局部变量是无法显示值的。

那是因为为了尽量节省JAR包的大小,Oracle在编译JDK源码时,去除了对变量值的显示。

所以,我们需要重新编译和打JAR包:

1 找一个空的文件夹作为工作空间根目录,如E:\jdk,在里面新建两个文件夹“jdk_src”和“jdk_debug”;其中“jdk_src”用来存放待编译的.java源码文件,“jdk_debug”用来存放编译后的.class字节码文件;

2 到%JAVA_HOME%\jre\lib找到rt.jar,将它拷贝到工作空间根目录 E:\jdk;

3 打开JDK源码文件压缩包%JAVA_HOME%\src.zip,把java、javax、org这三个文件夹,直接拖拽解压到用来存放待编译的.java源码文件的E:\jdk\jdk_src文件夹;

4 运行CMD,执行如下指令:

4.1 切换目录到工作空间 CD E:\jdk ;列出E:\jdk\jdk_src里所有待编译的.java源码文件到filelist.txt: dir /B /S /X .\jdk_src\*.java > .\filelist.txt ;完成后将会在E:\jdk生成一个filelist.txt,里面列出了很多行**.java;

4.2 将jdk_src里所有待编译的.java源码文件,编译成.class字节码文件,放到jdk_debug这个用来存放编译后的.class字节码文件的文件夹里: javac -J-Xms16m -J-Xmx1024m -sourcepath .\jdk_src -cp .\rt.jar -d .\jdk_debug -g @.\filelist.txt >> .\log.txt 2>&1 ;编译过程中将会在E:\jdk\生成编译日志文件log.txt,编译完成后可以在E:\jdk\jdk_debug看到生成了相应的文件夹和.class字节码文件;

提醒:打开编译日志文件E:\jdk\log.txt,如果除了警告之外还有错误的话,那么很可能是JDK版本不一致。请确保你的JDK源码压缩包src.zip和环境变量里的%JAVA_HOME%保持一致!!!

4.3 切换目录 CD E:\jdk\jdk_debug ,将.class字节码文件打成JAR包: jar cf0 .\rt_debug.jar .\* ;打包完成后将会在E:\jdk\jdk_debug生成rt_debug.jar。

有了这个可以调试时显示变量值的rt_debug.jar,接下来你只需要在Eclipse把这个JAR包加到你设置好的JRE:

打开Eclipse的菜单栏Windows->Preferences:点开Java->Installed JREs,选择你设置好的JRE点击Editd,在JRE system libraries点击右边Add External JARs,把rt_debug.jar添加进去,并点击Up把rt_debug.jar上移到rt.jar之上。

接下来,好好享受品味JDK源码的乐趣吧。

中文参考文献:http://blog.csdn.net/appleprince88/article/details/21873807

英文参考文献:http://stackoverflow.com/questions/18255474/debug-jdk-source-cant-watch-variable-what-it-is

设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的值的更多相关文章

  1. eclipse如何debug调试jdk源码(任何源码)并显示局部变量

    最近要看struts2源码 仿照了一下查看jdk源码的方式 首先你要有strtus2的jar包和源码,在struts官网上下载时,选择full版本,里面会有src也就是源码了. jar导入项目,保证可 ...

  2. eclipse调试jdk源码

    摘要 介绍使用eclipse调试jdk源码 java是一门开源的程序设计语言,喜欢研究源码的java开发者总会忍不住debug一下jdk源码.虽然官方的jdk自带了源码包src.zip,然而在debu ...

  3. 跟踪调试JDK源码时遇到的问题及解决方法

    目录 问题描述 解决思路 在IntelliJ IDEA中调试JDK源码 在eclipse中调试JDK源码 总结 问题描述 最近在研究MyBatis的缓存机制,需要回顾一下HashMap的实现原理.于是 ...

  4. eclipse如何debug调试jdk源码

    java是一门开源的程序设计语言,喜欢研究源码的java开发者总会忍不住debug一下jdk源码.虽然官方的jdk自带了源码包src.zip,然而在debug时查看变量却十分麻烦.例如调试HashMa ...

  5. JDK源码重新编译——支持eclipse调试JDK源码--转载

    最近在研究jdk源码,发现debug时无法查看源码里的变量值. 因为sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt.jar. 下面这六步是编译jdk的具体步骤: Step 1:   ...

  6. eclipse无法断点调试JDK源码的问题

    最近换了新版的eclipse,在jdk源码里面,打断点发现无法进入源码调试,程序直接跳过,已查资料发现自己eclipse配置的是jre环境的. 此处要配成jdk目录才有效 打开preferences, ...

  7. 利用eclipse调试JDK源码

    先看效果图 综合网上各种教程,总结如下 新建 D:/jdk/src .D:/jdk/debug 目录 src存放源码 debug存放编译结果 将 %JAVA_HOME%/src.zip 解压到 D:/ ...

  8. Eclipse使用Debug模式调试Spring Boot项目时跳转到exitCurrentThread的问题

    Spring Boot项目使用了spring-boot-devtools工具且在Eclipse中Debug调试会自动跳转到这个方法: public static void exitCurrentThr ...

  9. 调试JDK源码时,不能查看变量的值

    前几天本来想以debug模式看一下JDK的源码,进入调试模式时才发现,根本看不到方法里面变量值的情况.为什么呢?JDK现在的版本中,编译过后,去除了里面的调试信息.解决办法是,编译那些类,使其带有调试 ...

随机推荐

  1. hdu-3018 Ant Trip(欧拉路径)

    题目链接: Ant Trip Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) ...

  2. kallsyms

    kallsyms 在v2.6.0的内核中,为了更好地调试内核,引入新的功能kallsyms.kallsyms把内核用到的所有函数地址和名称连接进内核文件,当内核启动后,同时加载到内存中.

  3. Outlook 开发

    转自:http://www.cnblogs.com/madebychina/archive/2011/09/20/madebychina_2.html C#使用如下代码调用Outlook2003发送邮 ...

  4. CodeForces 1098D. Eels

    题目简述:对一个非空正整数(可重)集合$S$,从中选出两个元素$a, b (a \leq b)$,将他们从$S$中删除并将$a+b$加入$S$,重复这个操作直到$S$中只剩下一个元素为止,称为一次[竞 ...

  5. c++拷贝函数详解(转)

    一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如 int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变 ...

  6. 3、webpack打包出的文件解析

    分析打包后的结果,看看打包后的结果是什么东西 把打包后的结果.注释什么的删删‘’ 当前是一个匿名函数. 默认的时候会执行,执行的时候会传一个对象,对象有几部分,第一部分是我们的key.第二部分是我们的 ...

  7. Tomcat注入到系统服务中,实现服务自启动及常驻

    步骤一.打开service.bat 并修改(推荐notepad++):  1.set SERVICE_NAME=Tomcat6(服务名称,可在命令行中通过该名字进行服务的控制(启动/关闭)) 2.se ...

  8. mysql 自动备份命令

    --1.全备 --single-transaction:基于此选项能实现热备InnoDB表  --databases要备份的表名mysqldump -u root -p --single-transa ...

  9. 483. Smallest Good Base

    For an integer n, we call k>=2 a good base of n, if all digits of n base k are 1. Now given a str ...

  10. Unity(2) 脚本简单操作

    生命周期(按顺序排列) Awake():脚本唤醒,系统执行的第一个方法,在脚本声明周期内只执行一次,初始化一般可以在这里 Start():Awake之后,Update之前,只执行一次,一般在awake ...