Подтвердить что ты не робот

Источник отладки jdk не может просматривать переменную, что она

Я отлаживаю источник 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)). Однако, когда я отлаживаю часовую переменную c1 он отображает:

enter image description here

Я действительно попытался добавить источник rt.jar, и он действительно может перейти в точку останова источника JDK, например: enter image description here

но почему переменная c1 не может отображать?

4b9b3361

Ответ 1

Вообще говоря, чтобы иметь возможность смотреть переменные при переходе через исходный код JDK, вам нужны файлы классов, которые должны быть скомпилированы с информацией об отладке, то есть скомпилировать с помощью javac -g.

Итак, лучше всего либо найти уже скомпилированную версию с отладочной информацией (я не могу найти что-либо для JDK 7), либо вы можете попробовать скомпилировать источник для себя.

В соответствии с этот пост (обратите внимание, что я не пробовал) вам не нужно собирать все источники, только те, которые вам нужны. Поместите ваши вновь скомпилированные классы в каталог $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 *. Это создаст вашу новую библиотеку времени выполнения с информацией о деградации.
  • Скопируйте эту новую банку в папку JDK_HOME\jre\lib\endorsed. Если папка endorsed не существует, создайте ее.

Отлаживайте свою программу в Eclipse. Обратите внимание, как переменные называются нормально (не более arg0, arg1 и т.д.). Счастливая отладка:)

JDK debug

Ответ 2

c-s jre\lib\одобренное решение отлично. Проще построить с помощью Eclipse: создать проект Java, поместить javax *, java * в src и разрешить компиляцию Eclipse. Затем экспортируйте банку.

Ответ 3

Эта статья http://www.thejavageek.com/2016/04/03/debug-jdk-source-code/ описывает то же самое, но простым и приятным способом. Вы делаете материал (компилируете, делаете банку), используя только eclipse.

Ответ 4

Как вы знаете, одобренный механизм переопределения устарел и будет удален в будущей версии (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, но с исходными классами, замененными моими новыми классами.