我正在调试 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;
}
并且我想在进入 if (isHighSurrogate(c1))
之前查看 c1
变量。
但是,当我调试监视 c1
变量时
它显示:
我确实尝试过添加rt.jar源,它确实可以单步执行JDK源的断点,例如:
但是为什么c1
变量无法显示?
最佳答案
一般来说,为了能够在单步执行 JDK 源代码时观察变量,您需要使用调试信息来编译类文件,即使用 javac -g
进行编译。 .
因此,您最好的选择是找到带有调试信息的已编译版本(我找不到 JDK 7 的任何内容),或者您可以尝试自己编译源代码。
根据this post (请注意,我还没有尝试过)您不需要编译所有源,只需编译您需要的源。将新编译的类放在 $jdk/jre/lib/
中ext/ endorsed
目录中,将使用新类代替原始 rt.jar
中的类.
我相信这应该可以帮助您开始。
更新:实际上我刚刚尝试过这个过程,一点也不难。在 Windows、JDK 1.7.0_11 上测试。所有命令都是从命令行调用的:
- 创建您的工作文件夹。我选择
d:\
根文件夹 - 在您的工作文件夹中创建源文件夹,即
jdk7_src
和输出文件夹jdk_debug
- 来自您的
JDK_HOME
文件夹获取src.zip
文件并解压到jdk7_src
- 选择您要编译的内容并删除其余内容。对于所有这些,您可能需要额外的步骤。我选择了文件夹:
-
java
-
javax
-
org
-
- 来自您的
JDK_HOME\jre\lib
获取文件rt.jar
并放入工作文件夹中(这只是为了方便不要在命令行中指定太大的文件名)。 - 执行命令:
dir /B /S /X jdk7_src\*.java > filelist.txt
创建一个名为filelist.txt
的文件以及将被编译的所有 java 文件的列表。这将作为javac
的输入给出 - 执行
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
文件在您的工作文件夹中。检查日志内容。您应该会收到一堆警告,但没有错误。 - 进入
jdk_debug
文件夹并运行命令:jar cf0 rt_debug.jar *
。这将生成带有调试信息的新运行时库。 - 将新 jar 复制到文件夹
JDK_HOME\jre\lib\endorsed
。如果endorsed
文件夹不存在,请创建它。
在 Eclipse 中调试您的程序。请注意变量的正常命名方式(不再是 arg0、arg1 等)。祝调试愉快:)
关于java - debug jdk源无法查看变量它是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45640810/