debuggingjdk源码不能监视variables是什么
我正在debuggingJDK源代码,如:
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
variablesif (isHighSurrogate(c1))
之前进入variables。 但是,当我debugging手表c1
variables时,它显示:
我真的已经尝试添加rt.jar源代码,它真的可以进入JDK源的断点,如:
但是为什么c1
variables不能显示?
一般来说,为了能够在通过JDK源代码的过程中观察variables,需要使用debugging信息编译类文件,即使用javac -g
进行javac -g
。
所以最好的办法是find一个已经编译过的debugging信息(我找不到JDK 7的东西),或者你可以尝试编译源代码。
根据这篇文章 (请注意,我没有尝试过),你不需要编译所有的来源,只需要你需要的。 把你新编译的类放在$jdk/jre/lib/
ext / endorsed
目录下,新的类将被用在原来的rt.jar
。
我相信应该让你开始。
更新:其实我刚刚尝试过这个过程,并不难。 在Windows上testing,JDK 1.7.0_11。 所有的命令都是从命令行调用的:
- 创build你的工作文件夹。 我select了
d:\
root文件夹 - 在你的工作文件夹内创build源文件夹,即
jdk7_src
和输出文件夹jdk_debug
- 从您的
JDK_HOME
文件夹中获取JDK_HOME
文件并将其解压缩到jdk7_src
- select你要编译的东西,删除其余的东西。 对于他们所有人,你可能需要额外的步骤。 我select了这些文件夹:
-
java
-
javax
-
org
-
- 从
JDK_HOME\jre\lib
获取文件rt.jar
并放入工作文件夹(这只是为了方便,不要在命令行中指定太大的文件名)。 - 执行命令:
dir /B /S /X jdk7_src\*.java > filelist.txt
创build一个名为filelist.txt
的文件,其中包含将要编译的所有java文件的列表。 这将作为javac
input - 使用以下命令执行
javac
:
javac -J-Xms16m -J-Xmx1024m -sourcepath d:\jdk7_src -cp d:\rt.jar -dd:\jdk_debug -g @filelist.txt >> log.txt 2>&1
这将编译所有文件jdk_debug
文件夹,并将在您的工作文件夹中生成一个log.txt
文件。 检查日志内容。 你应该得到一堆警告,但没有错误。 - 进入
jdk_debug
文件夹并运行命令:jar cf0 rt_debug.jar *
。 这将生成您的新的运行时库与degug信息。 - 将该新的jar复制到
JDK_HOME\jre\lib\endorsed
文件夹中。 如果endorsed
文件夹不存在,请创build它。
在Eclipse中debugging你的程序。 请注意variables是如何正常命名的(不再有arg0,arg1等)。 快乐debugging:)
CS的JRE \ LIB \认可的解决scheme是伟大的。 使用Eclipse更容易构build:创build一个Java项目,将javax *,java *放入src并让Eclipse编译。 然后导出jar子。
这篇文章http://www.thejavageek.com/2016/04/03/debug-jdk-source-code/描述相同,但在简单和很好的方式。; 你只用eclipse做东西(编译,制作jar)。
只是如此, 认可的覆盖机制已被弃用,并且将在以后的版本中被删除 ( http://docs.oracle.com/javase/8/docs/technotes/guides/standards/ )。
使用这个pom.xml
来获取带有debugging信息的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
我复制到endorsed
目录的rt.jar
是原始的rt.jar
但原来的类被我新生成的类所取代。
- 为什么Java编译器不能为不可达的语句产生无法访问的语句错误?
- Spring RedirectAttributes:addAttribute vs addFlashAttribute
- 注解@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)有什么用? 为什么生成types是身份?
- 在Mac OS X上安装了Java 7,但terminal仍在使用版本6
- Javagenerics:List,List <Object>,List <?>
- 可靠的数据服务
- 各种数据结构的时间复杂度是多less?
- 为什么使用hex常量?
- Android:context.getDrawable()的替代方法