背景 
在学习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. mysql 按年月查询

    查询2017的数据:select * from table where year(column)='2017';查找月份为12的数据:select * from table where month(c ...

  2. Java 的BigDecimal

    原文:http://blog.csdn.net/diyu122222/article/details/76887382 decimal decimal(18,0) 18是定点精度,0是小数位数. de ...

  3. java使用HttpClient 发送get、pot请求

    package eidolon.messageback.PostUtil; import java.io.BufferedReader; import java.io.IOException; imp ...

  4. python笔记5-python2写csv文件中文乱码问题

    前言 python2最大的坑在于中文编码问题,遇到中文报错首先加u,再各种encode.decode. 当list.tuple.dict里面有中文时,打印出来的是Unicode编码,这个是无解的. 对 ...

  5. python的globals()使用

    使用命令pyrasite-shell pid,可以与进程进行shell交互,获取,在shell里执行globals(),可以获取整个进程的全部全局变量,比如django应用.flask应用的变量,而不 ...

  6. Java中的SPI(Service Provider Interface)

    转自:http://singleant.iteye.com/blog/1497259 最近看到公司的一些框架和之前看到的开源的一些框架的一些服务发现和接入都采用了java的spi机制. 所以简单的总结 ...

  7. 【云计算】OpenShift容器服务参考

    https://docs.openshift.com/enterprise/latest/using_images/db_images/mysql.html 红帽发布OpenShift Dedicat ...

  8. ubuntu 的runlevel设定

    修改ubuntu的启动级别 runlevel ----------------------------------------------------------------------------- ...

  9. Java基础大家必看啊

    写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java语言代码把思路体现出来.   学习 ...

  10. WinKawaks如何载入游戏

    1 把下载的游戏放入roms目录 2 运行Kawaks,点击载入游戏,勾选"仅存在的",点击扫描所有游戏.然后会出现所有名字正确的游戏.你下载的zip如果有中文或者名字不对,都是无 ...