Источник отладки 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
не может отображать?
Ответы
Ответ 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
- Выберите, что вы будете компилировать и удалите остальные. Для всех вас могут потребоваться дополнительные шаги. Я выбрал папки:
- Из вашего
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
, но с исходными классами, замененными моими новыми классами.