最近突然萌发了研究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 VMJRE 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. 并不对劲的CTS2019

    day0 没有C day1 t1:并不想简述题意 10分暴力走人 t2:有\(n\)个在\([1,D]\)内的均匀随机整数,问有多少的概率出现\(m\)对相同的 设\(f(i,j)\)表示考虑前\(i ...

  2. [ZJOI 2013] K大数查询

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3110 [算法] 整体二分 + 线段树 时间复杂度 : O(NlogN ^ 2) [代 ...

  3. SNMP:简单网络管理协议

    基于 TCP/IP 的网络管理包括两部分:网络管理站 (manager) 和被管理的网络单元(被管设备).这些被管设备的共同点就是都运行 TCP/IP 协议.管理进程和代理进程之间的通信有两种方式,一 ...

  4. 安装ubuntu16.04之后无法关机和重启

    这个问题是由于NVIDA驱动导致的,查询显卡型号,安装对应版本的驱动就可以解决此问题.ubuntu16.04 NVIDIA 驱动安装

  5. HDOJ-1391

    Number Steps Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  6. java读取文件:二进制文件

    FileWriter只能接受字符串形式的参数,也就是说只能把内容存到文本文件.相对于文本文件,采用二进制格式的文件存储更省空间 InputStream用于按字节从输入流读取数据.其中的int read ...

  7. TimeUtils(没试过)

    package util; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.ParseExc ...

  8. 15.oauth2 + oidc 实现 server部分

    OAuth主要做授权. OpenIdConnect简历在OAuth2.0基础之上的,相结合 客户端.授权中心.Resource Owner用户本身(资源的拥有者).Resource Server 通过 ...

  9. 【转】Maven 入门

    [转]http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html   Maven入门--概念与实例  最近由于工作原因在研究 ...

  10. GcSpreadSheet自定义Tab键选择

    最开始的时候需要在GcSpreadSheet中按Tab在需要输入的cell中切换,在模板中定义Tab的切换规则:后来又有一个新的要求,因为在使用的时候会出现数据不平的情况,这个时候需要在标记中的不平数 ...