(文章后面提供了ant和build.xml打包之后的build.zip下载,解压build.zip,然后将apache-ant-1.9.2-bin.zip解压即完成了ant安装,也可到http://ant.apache.org/bindownload.cgi下载widnows平台下的zip压缩包)

当用eclipse调试jdk源码的时候,会发现里面的局部变量的值无法看到,这是因为sun在编译jdk的时候,没有加入调试信息。下面就介绍用ant如何重新编译jdk,加入调试信息。

首先,要安装ant,设置环境变量ANT_HOME。如果ant的根目录在d:\ant那么ANT_HOME就设置为d:\Ant192。之后,按照图片上的显示输入命令,如果出现同样信息,说明ant安装成功。

接下来是编写build.xml文件,build.xml文件如下:

<?xml version = "1.0" encoding = "UTF-8" ?>
<project name="create rt_debug.jar" default="makejar" basedir="."> <!-- 初始化任务 -->
<target name="init">
<tstamp/>
<property environment="env"/>
<property name="project.build" location="build"/>
<property name="project.src" location="${project.build}/src"/>
<property name="project.classes" location="${project.build}/classes"/>
<property name="project.dist" location="${project.build}/dist"/>
<property name="project.classesJarRoot" location = "rt" />
<property name="debuglevel" value="source,lines,vars" />
<path id="project.classpath">
<pathelement location = "${project.classesJarRoot}" />
</path>
</target> <!-- 删除任务 -->
<target name="clean" depends="init">
<delete dir="${project.build}" quiet="true"/>
<mkdir dir="${project.build}"/>
</target> <!-- 加压JAVA_HOME/src.zip -->
<target name="unpack" depends="init, clean">
<unzip src="${env.JAVA_HOME}/src.zip" dest="${project.src}"/>
</target> <!-- 通过javac重新编译源文件 -->
<target name="build" depends="unpack">
<mkdir dir="${project.classes}"/>
<javac srcdir="${project.src}" classpathref="project.classpath"
destdir="${project.classes}" debug="on"
fork="true" memoryMaximumSize="512m" failonerror="false" nowarn = "true" debuglevel = "${debuglevel}">
<!-- talk to the hand troublesome libs -->
<exclude name="org/apache/xpath/domapi/XPath*.java"/>
<exclude name="com/sun/corba/se/internal/Interceptors/Thread*.java"/>
<exclude name = "com\sun\java\swing\plaf\gtk\*.java" />
</javac>
</target> <!-- 打包编译好的class文件到rt_debug.jar中 -->
<target name="makejar" depends="build">
<mkdir dir="${project.dist}"/>
<copy file="${env.JAVA_HOME}/jre/lib/rt.jar" tofile="${project.dist}/rt_debug.jar"/>
<jar jarfile="${project.dist}/rt_debug.jar" update="true" compress="false">
<fileset dir="${project.classes}"/>
</jar>
</target> </project>

这里要求已经设置好JAVA_HOME(即安装的jdk的根目录,如果jdk安装在d:\java,那么JAVA_HOME就设置为d:\java)。把build.xml文件放在比如d:\build里面,将JAVA_HOME/jre/lib/rt.jar文件也拷到d:\build里,并且解压到一个叫rt目录里面,在命令行里面输入如下命令,然后运行:

当运行结束后,在d:\bulid目录里面会增加另一个build个目录,一个log.txt文件。log.txt是打印的日志文件,里面存储了编译jdk的一些信息,可能有很多警告,但是只要没有编译错误,可以不用理会。而build目录里面还有3个目录,分别是src目录,存储解压于JAVA_HOME/src.zip的java源码,classes目录存放重新编译之后的class文件,dist目录,存放将重新编译后的class打包的rt_debug.jar文件。这个rt_debug.jar文件,就是加入了调试信息后的jar文件。

下面在eclipse里面引入这个jar文件,假定将刚才的rt_debug.jar文件拷贝到d:\rt_debug下面,打开eclipse,然后选择Window->Preferences->Java->Installed JRES,出现如下界面:

然后再界面右边Installed JREs列表里面选择一个jre,点击Edit按钮,如下图:

当点击Edit按钮之后,会出现如下界面:

在上面界面中点击Add External JARs...按钮,刚才生成的rt_debug.jar,并且一定要注意,保证rt_debug.jar在原始的rt.jar的前面(在加入rt_debug.jar后,选择rt_debug.jar,通过上面界面右边的Up按钮移动即可)。最终的结果如下图:

点击Finish按钮,完成之后,新建一个工程,试着调试进入jdk源码,将鼠标放在源码里面的局部变量里面,看是否可以看见局部变量的值。

build.zip下载

用ant重新编译jdk加入调试信息的更多相关文章

  1. QT如何编译出带调试信息的qtwebkit库

    因为在编译QT的时候默认是不编译成带调试信息的qtwebkit库的,不论如何设置参数都是没有用的.后面在一博客中查找到相关信息   1.编译带debug 信息的webkit 库 注释或者删除qt-ev ...

  2. 重新编译jdk源码,启用debug信息

    我有一个不知道是好还是不好的习惯,搞不懂的一些玩意儿,喜欢调试然后单步执行看这玩意儿到底是怎么运行的. 今天看到正则表达式的时候,appendReplacement()这个方法怎么也看不明白它是怎么工 ...

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

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

  4. Centos 编译带调试信息的libevent

    libevent编译过程 查看libevent文档即可 解决cmake编译出来的可执行文件没有调试信息(该方法未实验,暂时对cmake不熟悉) SET(CMAKE_BUILD_TYPE "D ...

  5. axf 文件包含太多的调试信息,导致的编译错误

    构建工程时,提示: build\my_test_prj.axf: Error: L6291E: Cannot assign Fixed Execution Region MCU_FLASH1 Load ...

  6. VS2008中编译通过,但调试时出现“未使用调试信息生成二进制文件”的问题

    .只要是“建立项目的时候不应建立空项目,而应当建立一个“win32控制台应用程序”.这样确实可以解决问题.只要你选择的是这个"win32控制台应用程序"则在附加选项里面选不选上“空 ...

  7. Ant自动编译打包&发布 android项目

    Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我们自动编译打包了. ...

  8. Android开发中Ant命令编译和APK签名的一些心得

    本文章麦子学院跟小伙伴们详细的分享一下关于Android Ant命令行编译和APK签名详解一些实现方法,这是一个朋友在自己做安卓开发时写的,希望对大家会有所帮助呀. 最近在做Android开发时,需要 ...

  9. 利用ant进行编译和发布项目

    本文通过一个示例来解说如何通过ant进行编译和发布项目.本例按如下目录结构来组织项目. D:/web/antsample项目根目录 D:/web/antsample/src源代码目录 D:/web/a ...

随机推荐

  1. C#设置鼠标在控件上面时,改变光标形状

    //设置鼠标在控件上面时,改变光标形状 private void pictureBox_macroLogo_MouseHover(object sender, System.EventArgs e) ...

  2. C++ BitArray 引用计数实现

    #ifndef __BITARRAY__ //数组不支持多线程同时访问,没有对引用计数以及分配的资源做任何锁处理 #define __BITARRAY__ 1 //越界访问修改为抛出异常 #ifdef ...

  3. Java中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后在今天使用的时候发现报错了,然后去科普了一下,发现这是一个误区.下面我们来一起看一下. Java中循环遍 ...

  4. [Mugeda HTML5技术教程之15]案例分析:制作移动教育课件

    本文档要分析的案例是一个一氧化碳还原氧化铜的教育小课件,从中可以体会一些Mugeda API的用法和使用Mugeda动画制作移动教育课件的方法.Mugeda为移动教育领域和移动数字出版领域提供理想的教 ...

  5. javascript 过滤空格

    1: 过滤首尾空格trim.2:过滤左边空格ltrim    3:过滤右边空格 用正则方法写成三个函数. <script type="text/javascript"> ...

  6. 自定义View—颜色

    一.颜色通道的意思 ARGB888.ARGB444.RGB565.Alpha8的区别 二.如何自定义颜色 ①.首先ARGB分别表示

  7. js判断是手机访问还是电脑访问

    <script type="text/javascript">        <!--        //平台.设备和操作系统         var syste ...

  8. linux 文件查找和压缩工具

    文件查找 1,which命行查找可执行文件,which 只会搜索系统$PATH目录 2,whereis,查找可执行文件,并显示出此文件的man page文件,并且可以查找到系统的库目录 3,locat ...

  9. 答:我们公司的ASP.NET 笔试题,你觉得难度如何

    闲来无事,逛逛园子,发现有个面试题,觉得有意思.已自己的理解答来看看,不足之处,请多指教. 原文地址:http://www.cnblogs.com/leotsai/p/aspnet-tests-for ...

  10. 将图片以Blob格式存入数据库,再通过Servlet显示到界面

    1:为了方便测试,直接将1.png图片存入到数据库中. public static void storePicBlog() throws FileNotFoundException, SQLExcep ...