【第22期】观点:IT 行业加班,到底有没有价值?

调试JDK源码,无法追踪显示局部变量的解决方案

原创 2016年08月30日 16:53:38
  • 什么原因导致我们无法调试源码的时候无法追踪局部变量的值?

    1.因为在我们通常在oracle官网下载的jdk源码包的时候,官网默认对rt.jar中类编译的时候,默认去除了调试信息,使得jar包的体积变得较小,因此我们在本地调试jdk源码的时候不会显示局部变量的值

    2.我们看一下现象:
    这里写图片描述
    从图中可以看出,局部变量值不可获得
    3.解决方案很明显了,我们只要手动重新编译一下jdk的源码包,带上调试信息即可

  • 解决方案-windows系统

    1.首先我们找到jdk的根目录,进入找到源码包src.jar,解压该文件,一般我们只需要调试java,javax,org三个目录下的源码,如果你需要调试其他包下面的源码,请保留相应目录,删除剩余目录即可。解压后的路径为:jdk根目录/jdk_src

    2.打开命令行,进入到jdk根目录,键入:
    dir /B /S /X jdk_src*.java > filelist.txt //目的是列出我们刚刚解压出的所有java文件绝对路径清单

    3.重新编译我们需要的源码,加入调试信息,首先进入jdk根目录,创建jdk_debug目录,打开命令行,进入到jdk根目录,键入:
    javac -J-Xms16m -J-Xmx1024m -sourcepath jdk_src -cp jre\lib\rt.jar -d jdk_debug -g @filelist.txt >>log.txt 2>&1 //这里需要注意,我们需要用当前版本jdk的去编译,不要跨版本编译(eg.1.7去编译1.8的jdk),命令大致解释如下:我们编译刚刚在jdk_src目录下列在filelist中的java类到jdk_debug目录下,并把输出日志打在log.txt文件中

    4.在jdk_debug目录下打开命令行,键入:
    jar cf0 rt_debug.jar * 打包该目录下的文件到rt_debug.jar

    5.把这个生成的rt_debug.jar包复制到JDK_HOME\jre\lib\endorsed。如果没有endorsed目录,自己创建一下。

    6.再去尝试调试源码,发现局部变量可以追踪了

  • 解决方案-mac系统

    1.方法类似相同,只有第二点有区别,键入:
    ls -R ./jdk_src -R|sed s#^#pwd# |grep ‘.java$’ >filelist.txt

  • 备注

    1.intellij idea 15.*以上的版本默认支持局部变量的debug追踪功能,可以不进行jdk源码的重新编译

    参考资料:
    (http://stackoverflow.com/questions/18255474/debug-jdk-source-cant-watch-variable-what-it-is)
    (http://blog.csdn.net/appleprince88/article/details/21873807)

转载请申明出处

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

NC开发笔记——二开知识点

用友集团ERP客户化开发系列丛书 NC客户化开发进阶 培训教程 V2.0版 本教程是用友软件股份有限公司内部培训资料,只限于用友公司内部开发应用,任何人未经过事先书面许可不得扩...

编程新手导论(转载)

第二部分 导论,这一部分主要是关于编程的导论, (要懂得一点思想具备一点常识)《设计,编码,,与软工》(编程与思想)这一章解释了三种思想,原语,抽象,组合,,和软件开发的二个重要过程,,软件工程的相关概念,是编程入门的关键 (要懂得一点领域内的数学)《数学与算法》(编程与数学)计算机整个就是架构在数学上的,跟计算机平台实现,算法设计,,架构密切相关,,真正要深入编程,,,对数学的学习是必须的,,千万不要相

Java基础面试题

1、面向对象的特征有哪些方面   1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

常见异常解析

ConcurrentHashMap与CopyOnWriteArrayList比较。 博客分类: Java ConcurrentHashMap ConcurrentHashMap引入了Segment,每个Segment又是一个hashtable,相当于是两级Hash表,然后锁是在Segment一级进行的,提高了并发性。缺点是对整个集合进行操作的方法如 size() 或 isEmpty()的实现很困难,基本无法得到精准的数据。Segment的read不加锁,只有在读到null的情况(一般不会有null的,只有在其他线程操作Map的时候,所以就用锁来等他操作完)下调用

《Java编程思想》学习笔记

1——面向对象和JVM基础  1.java中的4种访问制权限: (1).public:最大访问控制权限,对所有的类都可见。 (2).protect:同一包可见,不在同一个包的所有子类...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)