最近在研究jdk源码,发现debug时无法查看源码里的变量值。 因为sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt.jar。

下面这六步是编译jdk的具体步骤:

Step 1:  Locate the JDK source

First navigate to the JDK install directory, and locate the src.zip file. This file contains the JDK sources – and is absolutely invaluable for the rest of this process.

Next, unzip this folder to some location, such as c:\src.

Step 2: List all the source files to be compiled

Generate a list of all .java files in the unzipped folder, out to a separate file:
dir /B /S /X c:\src\*.java > jdk-src.txt

Step 3: Compile the source

Compile the source files named in this file, using the –g option.

javac-verbose -nowarn -g -source 1.6 -target 1.6 -J-Xms512m -J-Xmx1024m -bootclasspath C:\java\jdk1.6.0_07\jre\lib\rt.jar;C:\java\jdk1.6.0_07\jre\lib\jce.jar;C:\java\jdk1.6.0_07\jre\lib\jsse.jar;C:\java\jdk1.6.0_07\jre\lib\resources.jar;C:\java\jdk1.6.0_07\jre\lib\charsets.jar;C:\java\jdk1.6.0_07\jre\lib\deploy.jar -sourcepath src -classpath src -d jdk-class @jdk-src.txt

Note the presence of the –bootclasspath flag which makes the stated JARs available to the compiler. This is absolutely critical when trying to build the source distribution of JDK 6.

Step 4: Extract rt.jar

Extract the original rt.jar file, that is found in JAVA_HOME\jre\lib, into a temporary folder.

Step 5:  Generate a composite build

Copy the newly compiled .class files from our jdk-class over the folder where the rt.jar file was expanded. This ensures that the final set has old classes overwritten by newer classes with debug information, while still retaining class files that we couldn't compile.

Step 6: Regenerate rt.jar

Finally, recompress all the files from the composite folder into a new rt.jar file, and overwrite the original rt.jar file with this new one.

如果想在eclipse中跟踪调试,需要在Windows -> Preferences -> Java-Installed JRE下,选择安装的jdk,点edit,然后在列出的jre system libraries列表中选择rt.jar,设置其中的Source attachment为C:\java\jdk1.6.0_07\src.zip。

------------------------------------------------------------------------------------------------------

下面是一个方便的linux脚本, 只要设置了JAVA_HOME, 就可以轻松搞定上面的事情了:)

#!/bin/sh

if [ -z "$JAVA_HOME" ]

then

echo "Must set JAVA_HOME"

exit 1

fi

cd $JAVA_HOME

mkdir temp

cp src.zip temp/

cd temp/

mkdir out

unzip src.zip

rm src.zip

find . -name *.java > filelist

echo "$(wc -l filelist) java files to compile"

javac  -g -d out/ -J-Xmx1024m -cp "../jre/lib/tools.jar:../jre/lib/rt.jar" @filelist

if [ $? != 0 ]

then

echo "compile error!"

exit 1

fi

unzip $JAVA_HOME/jre/lib/rt.jar -d $JAVA_HOME/temp/old_classes

cp -r  $JAVA_HOME/temp/out/* $JAVA_HOME/temp/old_classes/

cd $JAVA_HOME/temp/old_classes/

jar cf rt_debug.jar *

cp rt_debug.jar $JAVA_HOME/jre/lib/

mv $JAVA_HOME/jre/lib/rt.jar $JAVA_HOME/lib/rt_old.jar

cd $JAVA_HOME/jre/lib/

ln -s rt_debug.jar rt.jar

rm -rf $JAVA_HOME/temp

原文:http://hi.baidu.com/austincao/item/e6e91329892497c1a4275a1a

转载于:https://www.cnblogs.com/davidwang456/p/3790550.html

JDK源码重新编译——支持eclipse调试JDK源码--转载相关推荐

  1. 解决Eclipse调试JDK源码无法查看变量值

    问题 研究JDK源码的同学应该知道,在debug的时候是无法看源码中变量的值的,为什么呢?因为在JDK中,sun对rt.jar中的类编译时,去除了调试信息.那么是否有解决办法呢?答案是肯定的. 解决方 ...

  2. Activemq源码、编译、导入idea、源码调试总结

    1.在本地下载源码 在GitHub官网搜activemq,找到排名第一的,并打开,如图所示,拷贝url地址. activemq托管地址:https://github.com/apache/active ...

  3. 一键源码安装,支持多版本LNMP_Server_install_scripts 源码安装

    一键安装常用服务脚本原文笔记链接请点击文章尾部链接:最近,入职一家新公司,开始公司编译安装需要输入大量的命令,如果是配置测试环境需要耗费大量的时间.现在无需一个一个的输入命令,无需值守,编译安装优化编 ...

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

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

  5. ubuntu编译并调试OpenJDK8源码实践

    最近打算研究一下 jvm 相关的知识,所以想编译 OpenJDK 的源码,一直在Mac上面编译,但是总是出现莫名其妙的error,还找不到有效的解决方式,所以还是进入 Ubuntu 下面进行编译,虽然 ...

  6. 01【在线日志分析】之Flume-1.7.0源码编译导入eclipse

    [前提]: 1.windows 7 安装maven-3.3.9   其中在conf/setting.xml文件添加   D:\software\apache-maven-3.3.9\repositor ...

  7. Android FrameWork学习(一)Android 7 0系统源码下载 编译

    最近计划着研究下 Android 7.0 的系统源码,之前也没做过什么记录,这次正好将学习的内容记录下来,方便以后复习巩固. 既然要学习我们的系统源码,那我们第一步要做的就是下载源码并进行编译了. # ...

  8. Android FrameWork学习(一)Android 7.0系统源码下载\编译

    重点内容 转载. http://blog.csdn.net/cjpx00008/article/details/60474883 硬件环境要求 1. 编译环境 按照官方的说法,编译Android 2. ...

  9. 使用AndroidStudio查看并调试Android源码

    使用AndroidStudio查看并调试Android源码 使用AndroidStudio查看并调试Android源码 0.基础环境 1. 操作系统 2. Java 3. Android源码 1. 编 ...

最新文章

  1. pat天梯赛L1-052. 2018我们要赢
  2. 兄弟3150cdn加粉后清零_兄弟MFC1618MFC1816 tn1035加粉清零方法
  3. python海龟绘图画圣诞帽男人_python海龟绘图实例教程
  4. 云小课 | 华为云KYON之ELB混合负载均衡
  5. 广播路由算法: 如何优雅地传递悄悄话?
  6. 3个问题,1套非技术人员的AI方法论 | 哈佛商业评论最新热文
  7. python str转json_Python中如何将一个字符串转换为json格式呢?
  8. 有关onpropertychange事件
  9. 安装esxi时候的No Network Adapters报错 解决办法
  10. Win10环境下VMware安装Mac OS虚拟机并在虚拟机中安装xcode
  11. my soft_macsoft
  12. Erphp loggedin 异地IP登录自动禁封用户 WordPress插件
  13. Git本地版本回退与远端版本回退(回滚)
  14. 英语智能语音测试软件,卓帆英语人机对话智能评测练习软件
  15. 从实验室跃进产业,腾讯AI是如何向to B进化的?
  16. 将VMware 虚拟磁盘文件vmdk直接挂到win系统下的方法
  17. 强化学习(二):马尔可夫决策过程
  18. 【个人纪录 | 分割】
  19. 分享一个毕业实习体会
  20. linux下,文件名带括号如何处理

热门文章

  1. 人体肺活量测试软件,人体肺活量怎么测试
  2. js获取php页面session的值,在html页面中取得session中的值的方法
  3. 两个vlan之间如何通信_如何桥接两个不同的VLAN?
  4. elasticjob2.x 获取上次执行时间_深圳会务公司-会议活动策划与执行注意事项
  5. linux限制pptp连接数_性能调优,让你的服务器更强大!增加TCP连接最大限制
  6. java 自带观察者模式_java 内置的观察者模式
  7. android 之ListView分页效果以及从网络上加载数据一系列的综合运用
  8. cas跨域单点登录原理_CAS实现SSO单点登录原理
  9. vue里面怎么删除部分页面_基于VUE选择上传图片并页面显示(图片可删除)
  10. Batch Normalization的细致理解