Debug JDK源码没变量值怎么办?

对于程序员而言,阅读源码是一个非常重要的能力,相信Java程序员最常看的就是JDK的源码了,但有时候我们想具体看看源码在运行时某个变量的值,就会发现Debug时看不到变量的值,这是因为官方在编译 rt.jar 中的类的时候去除了调试信息,那么该怎么办呢?

有两种办法:一种是去网上找编译好有调试信息的 rt.jar,另一种是自己去编译JDK源码,下面就是自己编译的详细过程,希望大家第一次不要怕麻烦,跟着做,弄好之后以后调试就非常方便了

来源:博客园,文章左下角可查看原文

作者:傻瓜不傻108 原作者:cherry_chen

问题效果图:

解决后的效果:

具体步骤:

1.制作可调试的 rt.jar 包

1.1 .在D盘新建jdk7_src及jdk7_rt-debug两个文件夹

1.2.复制JDK源码

将环境变量中配置的java_home地址或者将用的外部JDK安装目录下的src.zip

复制到D:/jdk7_src,解压.效果如下图

1.3.选择要编译的源码

原文中说,留下Java,javax,org三个文件夹就足够了,其他都可以删除。

我只是把swing的内容删除了,其他都留下了。大伙可以随意。

swing包目录位置:com\sun\java\swing,javax\swing

1.4.得到要处理的java文件名

命令及效果图如下:

要查看一下,自动生成的filelist.txt中是否有内容哦,没有数据的话下面的操作是没用的。

d:
cd jdk7_src
dir /B /S /X *.java>filelist.txt

1.5.复制jre/lib/rt.jar

把JDK安装目录(复制src.zip的那个目录)下jre/lib下的rt.jar复制到jdk7_src目录下

1.6.生成一些可调试的class文件夹

执行如下命令,成功后,jdk7_rt-debug文件夹会产生一些可调试的class文件夹,如下图:

如果没有,请打开jdk7_src/log.txt,ctrl+F查找“错误”,并解决。

一般,将报错的java路径及路径对应的文件删除,再执行dir /B /S /X *.java > filelist.txt即可。

javac -J-Xms16m -J-Xmx1024m -sourcepath D:\jdk7_src -cp D:\jdk7_src\rt.jar -d D:  \jdk7_rt-debug -g @filelist.txt >> log.txt 2>&1

1.7.将这些文件打包成Jar

命令和效果如下图

cd ..  
cd jdk7_rt-debug  
jar cf0 rt_debug.jar *  

2.使用可调试的 rt.jar

2.1.把rt_debug.jar放入JDK中

放入java_home/jre/lib/endorsed目录

2.2.将rt_debug.jar加入Eclipse使用的JDK中

2.3.添加rt_debug.jar的源码包

注意:若原来的JRE目录下已经存在了rt.jar包,则要将新编译的rt_debug.jar的位置在原来的jar包之前,如下图所示。

2.4.开始debug吧,你成功了!!

-END-

原文发布于微信公众号 - 趣谈编程(gh_51e791ad9174)

原文发表时间:2018-11-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ytkah

教你一步步composer安装Magento2.2

  以前外贸建站一直用zencart,这段时间ytkah比较有时间,就决定用magento来创建一下站点。magento不像普通的程序一样下载就可以直接安装,需...

1602
来自专栏梧雨北辰的开发录

Python学习(2):环境安装与运行一、Windows安装Python二、Mac OS与Linux安装Python三、Python的三种运行方式

2093
来自专栏IT可乐

Maven详解(四)------ 常用的Maven命令

  这章我们讲讲几个常用的 Maven 命令。由于执行命令是在工程的基础上来的,所以我们要先创建一个 Maven 工程,具体如何创建,在上一篇博客已经介绍了:h...

4148
来自专栏张善友的专栏

Enterprise Library 4 缓存应用程序块的设计

缓存应用程序为以下目的而设计: 提供一个大小可管理的 API 集合。 允许开发人员添加标准的缓存操作到他们的应用程序中,而不用学习应用程序块的内部工作。 ...

2106
来自专栏程序猿DD

Spring Cloud构建微服务架构:消息驱动的微服务(消费分区)【Dalston版】

通过上一篇《消息驱动的微服务(消费组)》的学习,我们已经能够在多实例环境下,保证同一消息只被一个消费者实例进行接收和处理。但是,对于一些特殊场景,除了要保证单一...

3424
来自专栏农夫安全

Knock 子域名扫描工具

Knock是一款Python编写的工具,通过单词列表来枚举目标域上的子域。扫描DNS区域传输,并尝试绕过通配DNS记录。再最新版本中knockpy支持查询Vir...

6353
来自专栏程序员互动联盟

【编程基础】Linux环境开发效率--那些强大的命令

之前写了一篇关于linux下常用的几个命令,参考Linux入门--提高工作效率的命令。接下来接着介绍一些在linux下做开发经常使用到得命令,其中有打包压缩命令...

3045
来自专栏Linux驱动

linux下使用gcc编译运行C程序

gcc(GNU Compiler Collection)是Linux下最常用的C语言编译器,是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和...

2197
来自专栏公有云大数据平台弹性 MapReduce

在emr中使用httpfs组件

httpfs是hadoop中HDFS over HTTP的实现,为HDFS的读写操作提供了统一的REST HTTP接口。在一些特定场景下非常有用,例如不同had...

35210
来自专栏Jackie技术随笔

多进程TCP并发服务器

我们的期望应该是一台服务器同时为多个客户服务。实现并发服务器最简单的办法就是为每个客户均fork一个子进程。

1.2K8

扫码关注云+社区

领取腾讯云代金券