重新编译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 ...
随机推荐
- SqlServer游标简介
游标实例: Declare MyCusror Cursor Scroll For Select * From Master_Goods Order By GoodsID Ope ...
- IOS第二天-新浪微博 - 添加搜索框,弹出下拉菜单 ,代理的使用 ,HWTabBar.h(自定义TabBar)
********HWDiscoverViewController.m(发现) - (void)viewDidLoad { [super viewDidLoad]; // 创建搜索框对象 HWSearc ...
- win 8 换 win7 注意事项
win8 换win7 硬盘格式修改一下gpt 格式转换为mbr模式 当进入到要选择安装到某一个盘时,由于磁盘的类型不同,会提示:“选中的磁盘采用GPT分区形式无法安装系统”.这时需要重新设置分区形式( ...
- js表达式与语句的区别
http://www.2ality.com/2012/09/expressions-vs-statements.html http://www.jb51.net/article/31298.htm 表 ...
- .NET中那些所谓的新语法之四:标准查询运算符与LINQ
开篇:在上一篇中,我们了解了预定义委托与Lambda表达式等所谓的新语法,这一篇我们继续征程,看看标准查询运算符和LINQ.标准查询运算符是定义在System.Linq.Enumerable类中的50 ...
- WebForms VS. MVC(翻译)
(本文翻译自CodeProject上阿三写的一篇文章,原文地址:http://www.codeproject.com/Articles/528117/WebForms-vs-MVC,讲了有关ASP.A ...
- HTML、CSS、JS对unicode字符的不同处理
unicode字符的不同表示法 unicode字符在html.css和js中的表示方法均不相同,下面分别作介绍. 原文发表于这里 css表示法 首先来一段很常见的bootstrap的字体图标代码: . ...
- Node.js Base64 Encoding和Decoding
如何在Node.js中encode一个字符串呢?是否也像在PHP中使用base64_encode()一样简单? 在Node.js中有许多encoding字符串的方法,而不用像在JavaScript中那 ...
- IOS系列swift语言之课时二
今天我们要讲的就是函数[对于函数,在最后面还有几道题,喜欢的博友可以看了自己做一下,和我交流一下] 当然这与我们的c语言还是有一定的共同之处的,对于有一些c语言或者是java基础的童鞋,我觉得是很容易 ...
- Android Drawable 那些不为人知的高效用法
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43752383,本文出自:[张鸿洋的博客] 1.概述 Drawable在我们平时的 ...