Debug info unavailable 解决之道

从事Java的小伙伴们估计都有断点代码的习惯,可以很方便的查看运行期代码中一些变量的值。
但是JDK中有些类你会发现是无法断点的,即使你在IDE中关联了src.zip依然不好使。这是为什么呢?

答案:

Java classes which are part of the JDK are compiled without debug
info for the size and performance reasons. If you want debug info in
these classes, you’ll either need to install a development version of
the JDK where the classes are built with the debug info or rebuild the
parts of JDK you want to debug from source with the debug info enabled
and configure the new JDK with these versions of classes in jars.
This thread provides the instructions how to rebuild JDK classes in rt.jar from the source code with debugging information.
P.S. This question is not specific to IntelliJ IDEA.

翻译如下
由于大小和性能的原因,作为JDK一部分的Java类被编译时没有调试信息。
如果您需要这些类中的调试信息,则需要安装开发版本的JDK,其中类是使用调试信息构建的,或者在启用调试信息的情况下重新构建要从源代码调试的JDK的各个部分
带有这些版本的jar的新JDK。
此线程提供了有关如何使用调试信息从源代码重建rt.jar中的JDK类的说明。
附: 这个问题不是特定于IntelliJ IDEA的。

下面给出几种解决办法(推荐方法3,开发工程师建议自己都照着实战下,相信你会有收获的)

1.使用Intellij idea 13及以上版本

idea13及以上会有一个变量表,即使在没有编译类的调试信息时也会显示局部变量。

官网说明:
Show Local Variables in Debugger even with no Debug Info
Posted on October 17, 2013 by Andrey Cheptsov
December is just around the corner, and this means IntelliJ IDEA 13 is
coming—with many cool new features and enhancements! One of these
enhancements is the new debugger feature which shows local variables
even when there is no debug information for the compiled classes. This
is especially helpful when debugging third-party libraries or JDK
sources compiled without corresponding debug information.

To test the new feature let’s go to Settings → Compiler → Java
Compiler and turn off Generate debugging info (don’t forget to restore
it afterwards):

官网介绍链接:
https://blog.jetbrains.com/idea/2013/10/show-local-variables-in-debugger-even-with-no-debug-info/

效果图:

2.下载使用带有debug信息的JDK。

找到这个下载地址也是费了一番周折的,为了让其它人少走冤枉路,直接贡献出来吧
http://download.java.net/jdk6/6u27/promoted/b03/binaries/jdk-6u27-ea-bin-b03-windows-i586-debug-27_may_2011.jar
PS:这种方式只能下载和特定版本号的,另外下载地址经常变,建议使用第3种方案

3.编译自己的JDK

准备工作:

  1. set JAVA_HOME=D:\programwork\jdk1.6.0_25
  • 1

复制%JAVA_HOME%\src.zip到D:\data\temp\jdk_debug\并解压到src目录

  1. d:
  2. cd D:\data\temp\jdk_debug\
  3. copy %JAVA_HOME%\src.zip D:\data\temp\jdk_debug\
  4. :: 先要安装下winrar
  5. start winrar x src.zip src\
  • 1
  • 2
  • 3
  • 4
  • 5

将要重新编译的java文件记录到file.txt中

  1. cd D:\data\temp\jdk_debug\src
  2. dir /B /S /X *.java>file.txt
  • 1
  • 2

开始编译jdk源码,编译的class存放到D:\data\temp\jdk_debug\classes目录下

  1. %JAVA_HOME%\bin\javac ^
  2. -verbose -nowarn -g ^
  3. -J-Xms512m -J-Xmx1024m ^
  4. -encoding utf-8 ^
  5. -bootclasspath %JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\jre\lib\jce.jar;%JAVA_HOME%\jre\lib\jsse.jar;%JAVA_HOME%\jre\lib\resources.jar;%JAVA_HOME%\jre\lib\charsets.jar;%JAVA_HOME%\jre\lib\deploy.jar ^
  6. -sourcepath D:\data\temp\jdk_debug\src ^
  7. -classpath D:\data\temp\jdk_debug\src ^
  8. -d D:\data\temp\jdk_debug\classes ^
  9. @file.txt > log.txt 2>&1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

确认编译后的class文件

  1. cd D:\data\temp\jdk_debug\classes
  2. dir
  3. 驱动器 D 中的卷是 新加卷
  4. 卷的序列号是 4EAC-5950
  5. D:\data\temp\jdk_debug\classes 的目录
  6. 2018/01/16 11:30 <DIR> .
  7. 2018/01/16 11:30 <DIR> ..
  8. 2018/01/16 11:30 <DIR> com
  9. 2018/01/16 11:30 <DIR> java
  10. 2018/01/16 11:30 <DIR> javax
  11. 2018/01/16 11:30 <DIR> org
  12. 2018/01/16 11:30 <DIR> sunw
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

找到%JAVA_HOME%\jre\lib\rt.jar文件(先备份一下),用winrar打开,将刚才编译产生的classes文件替换掉原来rt.jar中的即可

然后再在idea中进行断点即可看到效果了

参考文章:
https://stackoverflow.com/questions/1539282/intellij-debug-info-unavailable-how-to-fix
https://stackoverflow.com/questions/1313922/step-through-jdk-source-code-in-intellij-idea
https://stackoverflow.com/questions/1313922/step-through-jdk-source-code-in-intellij-idea/1313928#1313928?newreg=523c47ae584e400185929a87f267f17f


其它版本测试时遇到的问题

jdk7
执行%JAVA_HOME%\bin\javac…有45个类编译始终报错,有45个错误,错误示示例:
D:\data\temp\jdk_debug\src\com\sun\java\swing\plaf\gtk\GTKLookAndFeel.java:45: 错误: 找不到符号
import sun.awt.UNIXToolkit;
^
符号: 类 UNIXToolkit
位置: 程序包 sun.awt

遇到这种情况建议删除D:\data\temp\jdk_debug\src下面的com\sun目录然后重新编译就可以成功了
rd /s/q D:\data\temp\jdk_debug\src\com\sun
dir /B /S /X D:\data\temp\jdk_debug*.java>file.txt

再次执行javac命令即可
%JAVA_HOME%\bin\javac ^
-verbose -nowarn -g ^
-J-Xms512m -J-Xmx1024m ^
-encoding utf-8 ^
-bootclasspath
%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\jre\lib\jce.jar;%JAVA_HOME%\jre\lib\jsse.jar;%JAVA_HOME%\jre\lib\resources.jar;%JAVA_HOME%\jre\lib\charsets.jar;%JAVA_HOME%\jre\lib\deploy.jar
^
-sourcepath D:\data\temp\jdk_debug\src ^
-classpath D:\data\temp\jdk_debug\src ^
-d D:\data\temp\jdk_debug\classes ^
@file.txt > log.txt 2>&1

jdk8
问题同jdk7,解决办法也同jdk7

重新编译jdk源码后的对比图

编译前

编译后,细心的你一定会发现,鼠标放置到变量上会显示具体的值的,另外在下方的variables面板中可以看到各个变量运行期的值的

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hl_java/article/details/79078886

java debug jdk(转载)的更多相关文章

  1. Debug JDK变量显形

    本文面向的朋友 本文主要说明在使用Eclipse Debug JDK时,看不到变量值的解决办法. 如果您看到上面绿色字体表示不敢兴趣,请一定果断back,如果您不爽,请在下面使劲的拍. Debug J ...

  2. linux配置JDK(转载)

    转载自:http://blog.csdn.net/xinxin19881112/article/details/46816385 Linux CentOS 6.6安装JDK1.7 目录 1.下载JDK ...

  3. 【原】解决Debug JDK source 无法查看局部变量的问题方案(重新编译rt.jar包)

    一.问题阐述 首先我们要明白JDK source为什么在debug的时候无法观察局部变量,因为在jdk中,sun对rt.jar中的类编译时,去除了调试信息,这样在eclipse中就不能看到局部变量的值 ...

  4. java笔试面试(转载)

    Java面试笔试题大汇总(最全+详细答案) 2016-02-01 15:23 13480人阅读 评论(8) 收藏 举报  分类: Java面试题(1)  声明:有人说, 有些面试题很变态,个人认为其实 ...

  5. 关于java中jdk的环境变量配置

    关于java中jdk的环境变量配置 烦死人,在网上找了很长时间.最终找到了一个方法!现在将其总结帮助后来人. 方法/步骤   1 下载好jdk,并按照提示一步步安装,最后记下jdk所在的安装位置,这里 ...

  6. How to Install JAVA 8 (JDK/JRE 8u111) on Debian 8 & 7 via PPA

    Oracle JAVA 8 Stable release has been released on Mar,18 2014 and available to download and install. ...

  7. Java的cmd配置(也即Java的JDK配置及相关常用命令)——找不到或无法加载主类 的解决方法

    Java的cmd配置(也即Java的JDK配置及相关常用命令) ——找不到或无法加载主类  的解决方法 这段时间一直纠结于cmd下Java无法编译运行的问题.主要问题描述如下: javac 命令可以正 ...

  8. Java多线程学习(转载)

    Java多线程学习(转载) 时间:2015-03-14 13:53:14      阅读:137413      评论:4      收藏:3      [点我收藏+] 转载 :http://blog ...

  9. Java 序列化 JDK序列化总结

    Java 序列化 JDK序列化总结 @author ixenos Java序列化是在JDK 1.1中引入的,是Java内核的重要特性之一.Java序列化API允许我们将一个对象转换为流,并通过网络发送 ...

随机推荐

  1. CSS小代码汇总整理

    /**实现斑马线的表格*/table.flexme tbody tr:nth-child(2n){background-color:#D6E7FC;} /*返回偶数序的子元素*/table.flexm ...

  2. MAC地址 初识

    MAC地址 即物理地址/硬件地址 地址长度为48位,6字节. 格式为:00-23-5A-15-99-42 一个网卡对应一个MAC地址(比如笔记本,有线网卡有一个MAC地址,无线网卡也有一个MAC地址) ...

  3. PCB genesis短槽加引导孔实现方法

    一.何为短槽 短槽通常定义:槽长小于2倍槽宽      如:槽长1.8mm,槽宽1.0mm 二.为什么要加短槽加引孔呢 短槽孔在钻孔时孔易偏斜导致槽长偏短, 当槽长宽比越小,则受力越不均匀,在钻第2个 ...

  4. 了解MySQL的字符集

    在数据库中,字符乱码属于常见.多发问题.鉴于本人水平顶多只能归于不入流之类,写这篇文章时内心诚惶诚恐,实在担心误导大家.内容仅供参考,若有错误,请各位及时指出,我也好学习提高! MySQL的字符集有4 ...

  5. Hadoop Hive概念学习系列之hive里的优化和高级功能(十四)

    在一些特定的业务场景下,使用hive默认的配置对数据进行分析,虽然默认的配置能够实现业务需求,但是分析效率可能会很低. Hive有针对性地对不同的查询进行了优化.在Hive里可以通过修改配置的方式进行 ...

  6. reactnative(2) - Navigator 使用案例

    'use strict'; import React, { Component } from 'react'; import { AppRegistry, ScrollView, StyleSheet ...

  7. java heap 异常

    近期,项目每运行一周之后就会堆异常, java.lang.OutOfMemoryError: Java heap space,导致应用中断. 解决办法:将堆内存修改大一点. 从性能优化工具中可以看到修 ...

  8. 【转】Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

    概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Ja ...

  9. Linux(centOS7.2)+node+express初体验

    赶着阿里云服务器老用户服务器半折的好时机,手痒买了一个低配. 想着对于低配用Linux应该比较好(无可视化界面) 于是选择安装了centOs7.2: 我是通过SecureCRT进行远程连接的(如何操作 ...

  10. 如何让win32 c++窗口不出现在任务栏

    把窗口作为某一个窗口的子窗口,然后设置WS_POPUP就可以了.使用CreateWindow时的第三个参数设置为WS_CHILD|WS_POPUP.