背景 
在学习JDK源码的时候,免不了需要调试JDK的源码。 
比如:想理解ConcurrentHashMap的put(K k, V v)方法,JDK自带的rt.jar文件是支持断点调试,但是却看不到变量的具体值,对于理解实现非常不方便。 
如下:

package org.github.thread;

import java.util.concurrent.ConcurrentHashMap;

public class Test28 {

    public static void main(String[] args) {
ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
map.put("sdf", "ac");
System.out.println(map);
}
}

在map.put(“sdf”, “ac”)处增加断点,然后进入put方法里面看具体的执行过程。

有两个比较明显的问题(1)put的参数变量命名也变成了arg0,arg1和arg2(2)变量值也看不到。

步骤 
只要是制作一个可调试的rt.jar 
(1)创建两个目录d:\jdk_src和d:\jdk_rt 
(2)将src.zip解压到d:\jdk_src目录 
(3)执行命名dir /B /S /X *.java > filelist.txt 生成filelist.txt文件 
要查看一下,自动生成的filelist.txt中是否有内容哦,没有数据的话下面的操作是没用的 
(4)把JDK安装目录(复制src.zip的那个目录)下jre/lib下的rt.jar复制到jdk_src\src目录下 
(5)生成一些可调试的class文件夹 
执行命令: javac -J-Xms16m -J-Xmx1024m -sourcepath D:\jdk_src\src -cp D:\jdk_src\src\rt.jar -d D:\jdk_rt -g @filelist.txt > log.txt 2>&1 
成功后,jdk_rt文件夹会产生一些可调试的class文件夹,如果没有,请打开jdk_src/log.txt,ctrl+F查找“错误”,并解决。 
一般,将报错的java路径及路径对应的文件删除,再执行dir /B /S /X *.java > filelist.txt即可。 
(6)将这些文件打包成Jar 
执行命令: 
jar cf0 rt_debug.jar * 
(7)替换原rt.jar为新的rt_debug.jar 
备注:如果替换rt.jar运行失败,可以从原rt.jar拷贝相关的class文件到新rt-bubug.jar文件对应的地方。 
如:我在替换rt.jar的过程中遇到运行java程序报错Error occurred during initialization of VM java/lang/NoClassDefFoundError: sun/misc/Cleaner 
然后打开rt.jar和rt-debug.jar的文件发现,rt-debug.jar里面确实少了sun相关的目录,我就把原来的全部拷贝到新的里面,运行就OK了。 
bebug中修改变量的值:当在debug模式下调试到断点时,在“Variables”视图中的“Value”栏中直接修改变量的值,即可。

 
 

调试JDK1.8源码的方法的更多相关文章

  1. idea调试jdk1.8源码(最新)

    我们发现如果,直接用idea点项目jdk源码进去后发现自己不能注释说明,非常麻烦,不便阅读记录 于是: 1.在安装的jdk1.8路径下,找到src.zip和javafx-src.zip压缩文件 ,解压 ...

  2. 【JUC】JDK1.8源码分析之ArrayBlockingQueue(三)

    一.前言 在完成Map下的并发集合后,现在来分析ArrayBlockingQueue,ArrayBlockingQueue可以用作一个阻塞型队列,支持多任务并发操作,有了之前看源码的积累,再看Arra ...

  3. PHP扩展编写、PHP扩展调试、VLD源码分析、基于嵌入式Embed SAPI实现opcode查看

    catalogue . 编译PHP源码 . 扩展结构.优缺点 . 使用PHP原生扩展框架wizard ext_skel编写扩展 . 编译安装VLD . Debug调试VLD . VLD源码分析 . 嵌 ...

  4. JDK1.8源码阅读系列之三:Vector

    本篇随笔主要描述的是我阅读 Vector 源码期间的对于 Vector 的一些实现上的个人理解,用于个人备忘,有不对的地方,请指出- 先来看一下 Vector 的继承图: 可以看出,Vector 的直 ...

  5. 【集合框架】JDK1.8源码分析之ArrayList详解(一)

    [集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,Lis ...

  6. 集合之TreeSet(含JDK1.8源码分析)

    一.前言 前面分析了Set接口下的hashSet和linkedHashSet,下面接着来看treeSet,treeSet的底层实现是基于treeMap的. 四个关注点在treeSet上的答案 二.tr ...

  7. 集合之LinkedHashSet(含JDK1.8源码分析)

    一.前言 上篇已经分析了Set接口下HashSet,我们发现其操作都是基于hashMap的,接下来看LinkedHashSet,其底层实现都是基于linkedHashMap的. 二.linkedHas ...

  8. 集合之HashSet(含JDK1.8源码分析)

    一.前言 我们已经分析了List接口下的ArrayList和LinkedList,以及Map接口下的HashMap.LinkedHashMap.TreeMap,接下来看的是Set接口下HashSet和 ...

  9. 框架源码系列五:学习源码的方法(学习源码的目的、 学习源码的方法、Eclipse里面查看源码的常用快捷键和方法)

    一. 学习源码的目的 1. 为了扩展和调优:掌握框架的工作流程和原理 2. 为了提升自己的编程技能:学习他人的设计思想.编程技巧 二. 学习源码的方法 方法一: 1)掌握研究的对象和研究对象的核心概念 ...

随机推荐

  1. 【转】记录PHP、MySQL在高并发场景下产生的一次事故

    看了一篇网友日志,感觉工作中值得借鉴,原文如下: 事故描述 在一次项目中,上线了一新功能之后,陆陆续续的有客服向我们反应,有用户的个别道具数量高达42亿,但是当时一直没有到证据表示这是,确实存在,并且 ...

  2. Ubuntu下Firefox无法播放视频的解决方法

    Ubuntu为Firefox安装Adobe Flash Player 解决方法(解决火狐浏览器安装了三个flash插件中的第二个或者第三个插件而无法安装第一个adobe flash插件的方法):在新立 ...

  3. ECCV 2014 Oral Paper

    今年的ECCV 的paper已经挂到了网上.本文整了当中Oral Paper. 一,Tracking and Activity Recognition

  4. C/C++中的格式化字符

    格式化输出函数包括printf, fprintf, sprintf等等. 格式化输入函数包括scanf, fscanf, sscanf等等. 这类函数在输入输出的时候都有一个参数为格式化字符串(for ...

  5. saltstack之mount和umount的用法

    线上很多服务器都需要挂载存储上的公共目录,并实现开机启动(/etc/fstab),比如web的静态文件共享目录,日志远程集中收集等. 一.批量挂载部分. 1.在node1上配置nfs服务器,有关nfs ...

  6. 流畅的python第五章一等函数学习记录

    在python中,函数是一等对象,一等对象是满足以下条件的程序实体 1在运行时创建 2能复制给变量或数据结构的元素 3能作为参数传给函数 4能作为函数的返回结果 高阶函数(接受函数作为参数或者把函数作 ...

  7. 关于typedef的用法总结(zz)

    不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多 的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一 ...

  8. xUtils怎样通过注解对FindViewById进行封装

    之前讲到了介绍了一下xUtils的基本用法,今天我们就来具体介绍一下关于xUtils中的ViewUtils模块. 在ViewUtils模块中我们首先看到的是它採用了一种注解的方式进行声明,那么我们首先 ...

  9. WCF 之 初识WCF

    在编程中服务的作用越来越大了,.net从2.0的 webservice,到3.5之后的WCF,服务的功能越来越强了.现在先从简单的看起,先看看WCF服务的发布. 现在来看看一步一步发布 WCF 服务. ...

  10. ARM 指令集版本和ARM 版本z

    a9是cortex-a9的简称,属于v7指令集,属于目前比较新的了.arm9就是arm9,属于v5指令集,arm9后面的是arm11,属于v6指令集,之前的是arm7,属于v4指令集.虽然他们之间差别 ...