重新编译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 ...
随机推荐
- snmp学习笔记
snmp5.5 client 包含头文件 #include <net-snmp/net-snmp-config.h> #include <net-snmp/net-snmp-incl ...
- ABP理论学习之MVC控制器(新增)
返回总目录 本篇目录 介绍 AbpController基类 本地化 异常处理 响应结果的包装 审计日志 授权 工作单元 其他 介绍 ABP通过Abp.Web.Mvc nuget包集成了ASP.NET ...
- iOS开发系列--视图切换
概述 在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单.在iOS开发中常用的视图切换有三种,今天我们将一一介绍: UITabBarController ...
- 深入挖掘.NET序列化机制——实现更易用的序列化方案
.NET框架为程序员提供了“序列化和反序列化”这一有力的工具,使用它,我们能很容易的将内存中的对象图转化为字节流,并在需要的时候再将其恢复.这一技术的典型应用场景包括[1] : 应用程序运行状态的持久 ...
- WCF basicHttpBinding之Message Security Mode
原创地址:http://www.cnblogs.com/jfzhu/p/4067873.html 转载请注明出处 前面的文章<WCF Security基本概念>介绍了WCF的securit ...
- Android开发学习之路-SnackBar使用心得
SnackBar是DesignSupportLibrary中的一个重要的控件,用于在界面下面提示一些关键信息,跟Toast不同的地方是SnackBar允许用户向右滑动消除它,同时,也允许在SnackB ...
- iOS-C基础
iOS开发系列--C语言之基础知识 概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(i ...
- spring定时任务之quartz
在Spring中,使用JDK的Timer类库来做任务调度功能不是很方便,关键它不可以象cron服务那样可以指定具体年.月.日.时和分的时间.你只能将时间通过换算成微秒后传给它.如任务是每天执行一次,则 ...
- 【深入浅出Linux网络编程】 "开篇 -- 知其然,知其所以然"
[深入浅出Linux网络编程]是一个连载博客,内容源于本人的工作经验,旨在给读者提供靠谱高效的学习途径,不必在零散的互联网资源中浪费精力,快速的掌握Linux网络编程. 连载包含4篇,会陆续编写发出, ...
- 【Win 10应用开发】Adaptive磁贴模板的XML文档结构
在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...