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

时间:2013-08-15 14:59:01

标签: 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;
    }

我希望在进入c1之前看到if (isHighSurrogate(c1))变量。 但是,当我调试watch c1变量时 它显示:

enter image description here

我真的尝试过添加rt.jar源代码,它真的可以进入JDK源代码的断点,如: enter image description here

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

5 个答案:

答案 0 :(得分:71)

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

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

根据this post(请注意我还没有尝试过),您不需要编译所有来源,只需要编译所需的来源。将新编译的类放在$jdk/jre/lib/ ext / endorsed目录中,将使用新类,而不是原始rt.jar中的类。

我相信应该让你开始。

更新:实际上我刚试过这个过程并不难。在Windows上测试,JDK 1.7.0_11。所有命令都是从命令行调用的:

  1. 创建工作文件夹。我选择了d:\根文件夹
  2. 在工作文件夹中创建源文件夹,即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. 的输入
  8. 使用以下命令执行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文件。检查日志内容。你应该得到一堆警告,但没有错误。
  9. 进入jdk_debug文件夹并运行命令:jar cf0 rt_debug.jar *。这将生成带有degug信息的新运行时库。
  10. 将新jar复制到文件夹JDK_HOME\jre\lib\endorsed。如果endorsed文件夹不存在,请创建它。
  11. 在Eclipse中调试程序。注意变量是如何正常命名的(不再是arg0,arg1等)。快乐的调试:)

    JDK debug

答案 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;