我正在调试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;
}
我希望在进入c1
之前看到if (isHighSurrogate(c1))
变量。
但是,当我调试watch c1
变量时
它显示:
我真的尝试过添加rt.jar源代码,它真的可以进入JDK源代码的断点,如:
但为什么c1
变量无法显示?
答案 0 :(得分:71)
一般来说,为了能够在单步执行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 *
。这将生成带有degug信息的新运行时库。JDK_HOME\jre\lib\endorsed
。如果endorsed
文件夹不存在,请创建它。在Eclipse中调试程序。注意变量是如何正常命名的(不再是arg0,arg1等)。快乐的调试:)
答案 1 :(得分:13)
c-s的jre \ lib \ endorsed解决方案很棒。 使用Eclipse更容易构建:创建Java项目,将javax *,java *放入src并让Eclipse编译。然后导出jar。
答案 2 :(得分:0)
本文http://www.thejavageek.com/2016/04/03/debug-jdk-source-code/以简单而美观的方式描述了相同的内容。你只使用eclipse做东西(编译,制作jar)。
答案 3 :(得分:0)
您知道,不赞成使用已批准的覆盖机制,并将在以后的版本中删除(http://docs.oracle.com/javase/8/docs/technotes/guides/standards/)。
使用此pom.xml
获取带有调试信息的JDK 1.8.0_111
源:
<project>
<modelVersion>4.0.0</modelVersion>
<name>JDK sources with debug information</name>
<groupId>ex.jdk.debug</groupId>
<artifactId>jdk-debug-sources</artifactId>
<version>1.8.0_111</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>jdk-rt</artifactId>
<version>1.8.0_111</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<debug>true</debug>
<debuglevel>lines,vars,source</debuglevel>
<source>1.8</source>
<target>1.8</target>
<excludes>
<exclude>com/sun/java/swing/**</exclude>
<exclude>com/sun/source/util/**</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
您必须手动安装原始rt.jar
才能运行mvn clean install
mvn install:install-file -Dfile=rt.jar -DgroupId=com.oracle -DartifactId=jdk-rt -Dversion=1.8.0_111 -Dpackaging=jar
我复制到rt.jar
目录的endorsed
是原始rt.jar
,但原始类被我新生成的类替换。
答案 4 :(得分:0)
如果有人需要 tomcat 。您需要设置VM参数Djava.endorsed.dirs并将已编译的jdk jar放入其中。您可以执行此c-s的解决方案或使用eclipse导出(de debugger使用的所有Java Compiler ClassFile Generation都必须处于活动状态)
转到“运行配置”&gt;参数&gt; VM参数
Djava.endorsed.dirs =&#34; /你的/文件夹/ Apache的Tomcat的XXX /认可&#34;