debug jdk source无法监视变量是什么

Ami*_*bha 40 java

我正在调试JDK源代码:

 public static int codePointAt(CharSequence seq, int index) {
        char c1 = seq.charAt(index++);
        if (isHighSurrogate(c1)) {
            if (index < seq.length()) {
                char c2 = seq.charAt(index);
                if (isLowSurrogate(c2)) {
                    return toCodePoint(c1, c2);
                }
            }
        }
        return c1;
    }
Run Code Online (Sandbox Code Playgroud)

我想c1在进入之前看到变量if (isHighSurrogate(c1)).但是,当我调试监视c1变量时,它会显示:

在此输入图像描述

我真的尝试过添加rt.jar源代码,它确实可以进入JDK源代码的断点,如: 在此输入图像描述

但为什么c1变量无法显示?

c.s*_*.s. 73

一般来说,为了能够在单步执行JDK源代码时观察变量,您需要使用调试信息编译类文件,即使用编译javac -g.

所以你最好的办法是找到一个带有调试信息的已编译版本(我找不到JDK 7的任何内容),或者你可以尝试自己编译源代码.

根据这篇文章(请注意,我没有尝试过)你不需要编译所有的资源,只需要你需要的资源.将新编译的类放在$jdk/jre/lib/ext /endorsed目录中,将使用新类而不是原始类rt.jar.

我相信这应该让你开始.

更新:其实我刚刚尝试过这个过程,并不难.在Windows上测试,JDK 1.7.0_11.从命令行调用所有命令:

  1. 创建工作文件夹.我选择了d:\根文件夹
  2. 在工作文件夹中创建源文件夹ie jdk7_src和输出文件夹jdk_debug
  3. 从您的JDK_HOME文件夹中获取src.zip文件并将其解压缩jdk7_src
  4. 选择要编译的内容并删除其余内容.对于所有这些,您可能需要额外的步骤.我选择了这些文件夹:
    • java
    • javax
    • org
  5. 从您JDK_HOME\jre\lib获取文件rt.jar并放入工作文件夹(这只是为了方便在命令行中不指定太大的文件名).
  6. 执行命令:dir /B /S /X jdk7_src\*.java > filelist.txt创建一个以filelist.txt所有将要编译的java文件列表命名的文件.这将作为输入javac
  7. javac使用以下命令执行:
    javac -J-Xms16m -J-Xmx1024m -sourcepath d:\jdk7_src -cp d:\rt.jar -d d:\jdk_debug -g @filelist.txt >> log.txt 2>&1这将编译文件jdk_debug夹中的所有文件,并log.txt在工作文件夹中生成一个文件.检查日志内容.你应该得到一堆警告,但没有错误.
  8. 进入jdk_debug文件夹并运行命令:jar cf0 rt_debug.jar *.这将生成带有degug信息的新运行时库.
  9. 将新jar复制到该文件夹JDK_HOME\jre\lib\endorsed.如果该endorsed文件夹不存在,请创建它.

在Eclipse中调试程序.注意变量是如何正常命名的(不再是arg0,arg1等).快乐调试:)

JDK调试

  • 我刚刚在windows7中编译了jdk1.7.0-51的源代码,得到了45个错误"错误:无法找到符号".似乎需要包(sun.awt.*),但默认情况下不会在jdk源代码中找到它. (2认同)

web*_*rjn 14

cs的jre\lib\endorsed解决方案很棒.使用Eclipse更容易构建:创建Java项目,将javax*,java*放入src并让Eclipse编译.然后导出jar.