重新编译jdk源码,启用debug信息
我有一个不知道是好还是不好的习惯,搞不懂的一些玩意儿,喜欢调试然后单步执行看这玩意儿到底是怎么运行的.
今天看到正则表达式的时候,appendReplacement()这个方法怎么也看不明白它是怎么工作的,于是想调试源码单步执行,然后watch几个关键的变量看看.
刚开始的时候,eclipse里调试模,单步,发现没有办法进入方法内. 用google百度了一下,发现是JRE配置的问题. 使用jre是不可以的,需要使用jdk的环境.(之前真的没有注意到这一点)
于是window->Preferences->Java->Installed JREs 添加换到jdk_xxx.
这里注意一下源码是不是正确的,如果不对的话Source Attachment哪里手动改一下.

然后Project的BuildPath里remove掉jre的环境,换成刚添加jdk_xxx
然后再调试的时候就可以进入到jdk提供的方法体内了.
之后又出现一个问题,折腾了我快两个小时(折腾的时间长的一个重要原因是,今天我"嘿嘿嘿那啥墙"的VPS不知道怎么了,google半天打不开...).
不得不说一下,微信就是一个扯闲篇的地方,前不久加了某某论坛的一个群,大家平时除了扯淡就是调戏女群主,问了一个正经问题,没人搭理...

添加监视变量之后,发现无论怎么执行,jdk方法体内的变量都一直是"cannot be resolved to a variable". 当然这个问题最常见的原因就是变量超出作用域. 但是,很明显,这里不是...
由于谷歌一直打不开,只能百度了一下,可以说百度今天终于靠谱一回,一下就查到问题原因了,是因为官方jdk在打包的时候,为了控制体积有意去掉了一些用于debug的信息,有人说是LocalVariableTable这个表被移除了,所以无法从上下文中获取足够的信息来监控变量.
想重新得到这个表可以使用javac -g来重新编译源码.
还查到一个常识问题...
eclipse并不是使用javac来编译的,而是使用自己的编译器EJC. EJC也可以得到javac -g的效果,需要勾选Add variable attributes to generated class files这个复选框. 具体位置看这个图:

但是现在的问题,自己的代码调试的时候没问题. jdk提供的方法还是不行啊. 于是十分不情愿的去查怎么重新编译jdk源码.
查到一个貌似很牛的办法:http://www.cnblogs.com/davidwang456/p/3790550.html
但是尝试了很多次都不成功(试之前一定记得备份一下rt.jar...)
恰好这个时候又看到一篇博客...
这个简单很多了,
直接把src.zip解压,eclipse里新建一个工程,把java和javax这两个源码文件夹复制到新工程里,build一下. 然后把对应的class文件覆盖回rt.jar...
遇到一个问题,源码拖进来之后一片飘红,各种报错. 大概看了一下,都是因为调用了com.sun这个package里的内容. 不管他,把这个直接改成warning保证build成功就可以了. 因为之后还是会放到原来的地方.package路径,调用的内容都没有变,我们只是重新编译添加了一些信息而已.
Windows -> Preferences -> Java -> Compiler -> Errors/Warnings -> Deprecated and trstricted API -> Forbidden reference ->改成warning
之后检查一下还有没error的文件,有的话直接删除掉.
我的eclipse几乎都是默认配置,是自动build的,所以源码一拖进来,内容太多,直接电脑干死了.
等编译完成后,找到JAVA_HOME\jre\lib\rt.jar文件,用解压缩软件打开,找到工程对应目录bin下的对应的文件夹,拖进去覆盖原先的java和javax. 然后重启eclipse.
目前来看,调试的时候,监控变量是正常的. 程序跑起来也没有其他问题.
刚开始用1.6这样搞的时候,classloader老是报错. 后来在1.8上试了一下是可以的.
先用着,以后万一有问题,应该也是很严重到一眼就能看出来的.
这里觉得oracle有点拧巴了,既然都放到jdk里了,肯定都是开发人员在用.何必还阉割调试需要的信息呢. 估计也很少有人闲到去调试jdk源码...但是感觉debug单步执行,是学习的一个好办法呀. 至少比死抠源码来的直观.
重新编译jdk源码,启用debug信息的更多相关文章
- 解决debug到jdk源码时不能查看变量值的问题
目录 如何跟踪jdk源码 1. 编译源码 2. 关联源码 3. 大功告成 如何跟踪jdk源码 看到这个标题大概大家都会在心里想谁还跟踪个源码呀,在eclipse中打个断点,以debug的方式运行,然后 ...
- 设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的值
最近突然萌发了研究JDK源码的想法,所以就想到了在自己常用的Eclipse上可以调试JDK源码. 整个设置过程也很简单: 首先你要安装好JDK(我的JDK安装路径根目录是D:\Java\jdk-8u9 ...
- CentOS6.5上编译OpenJDK7源码
本文地址:http://www.cnblogs.com/wuyudong/p/build-openjdk7.html,转载请注明源地址. 采用开源的OpenJDK版本,获取其源码的方式有两种: 通Me ...
- 跟踪调试JDK源码时遇到的问题及解决方法
目录 问题描述 解决思路 在IntelliJ IDEA中调试JDK源码 在eclipse中调试JDK源码 总结 问题描述 最近在研究MyBatis的缓存机制,需要回顾一下HashMap的实现原理.于是 ...
- VS2010编译Unigine_2010源码
VS2010编译Unigine_2010源码[Debug版本] 1.Laucher工程属性改为控制台项目 2.Unigine工程编译时的Warnning LNK2019 a.属性--常规-目标文件名改 ...
- eclipse如何debug调试jdk源码(任何源码)并显示局部变量
最近要看struts2源码 仿照了一下查看jdk源码的方式 首先你要有strtus2的jar包和源码,在struts官网上下载时,选择full版本,里面会有src也就是源码了. jar导入项目,保证可 ...
- eclipse如何debug调试jdk源码
java是一门开源的程序设计语言,喜欢研究源码的java开发者总会忍不住debug一下jdk源码.虽然官方的jdk自带了源码包src.zip,然而在debug时查看变量却十分麻烦.例如调试HashMa ...
- JDK源码重新编译——支持eclipse调试JDK源码--转载
最近在研究jdk源码,发现debug时无法查看源码里的变量值. 因为sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt.jar. 下面这六步是编译jdk的具体步骤: Step 1: ...
- eclipse 如何debug jdk源码(转)
转:http://blog.csdn.net/cherrycheng_/article/details/51004386 原英文地址:http://stackoverflow.com/question ...
随机推荐
- Hibernate中使用Criteria查询
忽略一些配置,测试代码如下: Session session= HibernateUtil.getSession(); Transaction tx= session.beginTransaction ...
- 《微软互联网信息服务(IIS) 最佳实践》已上市,欢迎选购!
本书内容涵盖了IIS6.0~IIS 10.0 的全部主流IIS 版本,是多年微软技术支持经验的结晶.祝您顺利排除Web 服务器的疑难杂症! 本书由微软亚太区全球技术支持中心IIS 方面的顶尖专家金鑫作 ...
- Dropbox创造共享新思维——Datastore API
7月9日,第一届Dropbox开发者大会上,Dropbox发布了Datastore API的beta版本,通过这个API,原始的结构化数据可以在多个设备间的Dropbox内同步.CEO Drew Ho ...
- SOA相关资料整理分享
昨@幸福框架同学问能否推荐SOA一些资,.想想之前看过不少资料文档,就整理分享下,有需要的可以参考下. 文章链接 理解面向服务的体系结构中企业服务总线场景和解决方案,第 1 部分 SOA 和 web ...
- 干货!表达式树解析"框架"(3)
最新设计请移步 轻量级表达式树解析框架Faller http://www.cnblogs.com/blqw/p/Faller.html 这应该是年前最后一篇了,接下来的时间就要陪陪老婆孩子了 关于表达 ...
- MySQL外键之级联
简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...
- UIwebView 和 H5交互详情
背景: 最近公司准备上一个只有原生登录界面 + H5网页 ,并且支持ios7.0 以上系统的混合app;这可把我难住了,原生的UI界面我可以正写反写各种style把界面搭建起来.而要这个app的难点在 ...
- spring定时任务之quartz
在Spring中,使用JDK的Timer类库来做任务调度功能不是很方便,关键它不可以象cron服务那样可以指定具体年.月.日.时和分的时间.你只能将时间通过换算成微秒后传给它.如任务是每天执行一次,则 ...
- SQL 必知必会
本文介绍基本的 SQL 语句,包括查询.过滤.排序.分组.联结.视图.插入数据.创建操纵表等.入门系列,不足颇多,望诸君指点. 注意本文某些例子只能在特定的DBMS中实现(有的已标明,有的未标明),不 ...
- SQL 中 EXISTS 与 NOT EXISTS
带有 EXISTS 操作符的子查询不返回任何数据,只产生逻辑真值 'true' 或逻辑假值 'false'.带有 EXISTS 操作符的子查询都是相关子查询. 相关子查询:子查询的条件依赖父查询. E ...