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

введите описание изображения здесь

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

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

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

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

Согласно этому сообщению (обратите внимание, что я не пробовал), вам не нужно собирать все источники, только те, которые вам нужны. Поместите ваши вновь скомпилированные classы в $jdk/jre/lib/ ext / endorsed , вместо этого будут использоваться новые classы в исходном rt.jar .

Я считаю, что вам нужно начать.

Обновление: На самом деле я только что пробовал этот процесс, и это совсем не сложно. Протестировано в Windows, JDK 1.7.0_11. Все команды вызываются из командной строки:

  1. Создайте рабочую папку. Я выбрал папку d:\ root
  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. Выполните команду 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 в вашей рабочей папке. Проверьте содержимое журнала. Вы должны получить кучу предупреждений, но без ошибок.
  8. Зайдите в папку jdk_debug и запустите команду: jar cf0 rt_debug.jar * . Это сгенерирует вашу новую библиотеку времени выполнения с информацией о деgradleации.
  9. Скопируйте эту новую банку в папку JDK_HOME\jre\lib\endorsed . Если endorsed папка не существует, создайте ее.

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

Отладка JDK

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

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

Как вы знаете, одобренный механизм переопределения устарел и будет удален в будущем выпуске ( http://docs.oracle.com/javase/8/docs/technotes/guides/standards/ ).

Используйте этот pom.xml для получения источников JDK 1.8.0_111 с информацией об отладке:

  4.0.0 JDK sources with debug information ex.jdk.debug jdk-debug-sources 1.8.0_111  UTF-8    com.oracle jdk-rt 1.8.0_111      org.apache.maven.plugins maven-compiler-plugin 3.6.0  true lines,vars,source 1.8 1.8  com/sun/java/swing/** com/sun/source/util/**       

Вам нужно будет выполнить ручную установку исходного 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 но с исходными classами, замененными моими новыми classами.

В случае, если кому-то это нужно с tomcat . Вам нужно настроить аргумент VM Djava.endorsed.dirs и поместить в него собранный jdk jar. Вы можете сделать это решение cs или экспортировать с помощью eclipse (все Java Compiler ClassFile Generation, используемые отладчиком, должны быть активными)

Перейдите в раздел «Выполнение конфигураций»> «Аргументы»> «Аргументы VM»

Djava.endorsed.dirs = “/ файл / папку / апач-кот-ххх / одобрил”

  • как скачать изображение с любой веб-страницы в java
  • Импорт внешнего файла .jar в проект Android
  • Вопрос о блокировке Java
  • Передача нескольких файлов Java через сокет
  • ЗАПРОС, ОПРЕДЕЛЕННЫЙ с помощью API-интерфейса Google Адресов для веб-сервера, используемого в приложении для Android
  • String.format () для форматирования double в java
  • Как можно обнаружить режим самолета на Android?
  • AlertDialog изнутри BroadcastReceiver ?? Это можно сделать?
  • Как сохранить текущую дату / время, когда я добавлю новое значение в базу данных Firebase Realtime
  • Как работает Activity.finish () в Android?
  • Получение программной версии ОС на Android программно
  • Interesting Posts

    LINQ: Строка строки Entity содержит любой массив строк

    Совместное использование или синхронизация домашних папок между компьютерами Mac

    Как получить конфигурацию преобразователя прокси-сервера виртуальной машины VM

    Аутентификация строк в TableView из модели

    Сохранить вывод экрана (программы) в файл

    Как перечислить файлы рекурсивно и отсортировать их по времени модификации?

    Добавить эскизы изображений к макету в сетке?

    Каков наилучший способ развертывания приложения JavaFX, создания JAR и автономных приложений и собственных установщиков

    Как я могу округлить значение float до двух постсимвольных позиций?

    Почему этот код Parallel.ForEach заморозит программу?

    Android – как получать трансляции намерения ACTION_SCREEN_ON / OFF?

    Ошибка кодового знака: профиль Provisioning не найден.

    Звук центрального процессора звучит громко. Когда он запускается

    Скрипт Powershell для экспорта всех устройств в диспетчере устройств в виде дерева или списка?

    Как отправить ввод на консоль, как если бы пользователь печатал?

    Давайте будем гением компьютера.