博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
调试JDK1.8源码的方法
阅读量:6232 次
发布时间:2019-06-21

本文共 1492 字,大约阅读时间需要 4 分钟。

背景 

在学习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
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”栏中直接修改变量的值,即可。

 
 

 

转载于:https://www.cnblogs.com/lujiango/p/7581069.html

你可能感兴趣的文章
开源 免费 java CMS - FreeCMS1.2-功能说明-会员管理
查看>>
apache的mime.types作用
查看>>
语言的对于处理器的字长问题
查看>>
Virgo IDE Milestones
查看>>
查询数据库布局信息
查看>>
Android高手进阶(一)AIDL跨进程调用
查看>>
cocos2d-iphone之魔塔20层第八部分
查看>>
JSTL 核心标签库 使用
查看>>
安装Robot Framework-Mac
查看>>
mysql 多表 update sql语句总结
查看>>
Redhat 6 升级 openssl-1.0.2m 、openssh-7.6p1 和 ntp-4.2.8p10
查看>>
Spring-boot添加Mybatis
查看>>
一个早期前FB员工是如何搞砸了自己的工作,失去了1亿8千5百万美元
查看>>
在CentOS中安装flashplay插件
查看>>
flexpaper组件中关于隐藏真实的swf 地址下载
查看>>
用easyinstaller安装zookeeper,hadoop,hbase等群集软件
查看>>
Play Scala 开发技巧 - 请求限速
查看>>
PHP rabbitmq producer for yii2
查看>>
管道流操作
查看>>
ubuntu下不能以根用户身份运行 Google Chrome 浏览器
查看>>