Статьи

Отладка OpenJDK

knowyourmeme.com/photos/531557 спасибо @mihn

Иногда отладки Java-кода недостаточно, и нам нужно перешагнуть через

нативную часть Java. Я потратил некоторое время, чтобы достичь надлежащего состояния моего JDK, поэтому краткое описание, вероятно, будет полезно для тех, кто начинает свое путешествие. Я буду использовать новый OpenJDK 9!

Сначала вы должны получить основной репозиторий, набрав:

hg clone http://hg.openjdk.java.net/jdk9/jdk9 openjdk9

Затем в каталоге openjdk9 введите:

bash get_source.sh

Это загрузит все источники в вашу локальную файловую систему.

Теоретически компилирование openjdk не представляет особой проблемы, но есть некоторые (хммм …) странные поведения, если вы хотите использовать его для отладки.

Сначала, конечно, нам нужно вызвать
./configure, чтобы подготовить определенные make-файлы для нашей системы. Мы можем прочитать в
документации, что мы должны добавить
флаг
—enable-debug для подготовки
сборки
fastdebug . Если в вашей системе не установлены надлежащие библиотеки или инструменты, то сейчас подходящий момент для установки зависимостей (настройка вывода ясно укажет на любые недостатки). После настройки и запуска команды make вы можете столкнуться с такой проблемой:

warning _FORTIFY_SOURCE requires compiling with optimization (-O)
Generating buffer classes
Generating exceptions classes
cc1plus: all warnings being treated as errors

Круто 🙂 Это происходит только на некоторых конкретных установках Linux (к сожалению, включая Fedora 20 :)). Чтобы решить эту проблему, мы должны удалить
флаг
_FORTIFY_SOURCE . Просто прокомментируйте (#) строки, содержащие _FORTIFY_SOURCE в следующих файлах:

  • Точка / марка / Linux / Makefiles / gcc.make
  • общие / Autoconf / flags.m4

Затем вы можете приступить к созданию проекта JDK и через дюжину минут вы должны увидеть.

Finished building OpenJDK for target 'default'

Теперь пришло время импортировать проект в IDE. Так как мы все еще ждем хорошей C ++ IDE от JetBrains, мы должны использовать NetBeans или даже Eclipse. После выполнения нескольких шагов необходимо настроить команды отладки (например, даже для
java -version ). Начните отладку, и …
SIGSEGV получил. Давайте решим это, создав
файл
.gdbinit в домашнем каталоге пользователя, содержащий следующие строки:

handle SIGSEGV pass noprint nostop
handle SIGUSR1 pass noprint nostop
handle SIGUSR2 pass noprint nostop

Начните отладку еще раз — теперь лучше! Давайте продолжим, добавив точку останова строки. Начать отладку, и … не работает … 🙁 Я расширил
.gdbinit , добавив.

set logging on

Еще одна отладочная попытка и в gdb.txt я увидел такую ​​строку:

No source file named hotspot/src/share/vm/memory/genCollectedHeap.cpp

Я был почти уверен, что
—enable-debug добавит
флаг
-g в компилятор gcc, но, похоже, я ошибся. Я потратил несколько часов на поиски и поиски решения проблемы путем изменения конфигурации GDB, конфигурации NetBeans и т. Д. До сих пор не получилось. К счастью,
Михал Варецки указал мне, что, вероятно, OpenJDK во время отладочных сборок архивирует все debuginfo и, если вы хотите отлаживать (конечно, подготовленная отладочная сборка из-за каких-то других целей?). После разборки make-файлов я нашел многообещающую
disable-zip-debug-infoфлаг. Итак, давайте включим это в наш вызов configure. Также поверьте мне, сложно отлаживать оптимизированный код в C ++ (вы можете попробовать, но вы столкнетесь со странными событиями, такими как отладчик пошаговых строк в неправильном порядке (например, запуск метода со строки 4, возврат к 2, затем к 5 и к 3). :)). Поэтому мы выберем
параметр
slowdebug, чтобы избежать оптимизации кода. Вся правильная команда configure:

bash ./configure --with-debug-level=slowdebug --with-target-bits=64 --disable-zip-debug-info

Теперь мы можем вызвать:

make

и дождаться окончания компиляции. Теперь вы можете проверить , все ли работает правильно, вызывая
./java -version в 

сборке / Linux-x86_64-нормаль-сервера slowdebug / JDK / бен каталог

Вы должны увидеть:

openjdk version "1.9.0-internal-debug"
OpenJDK Runtime Environment (build 1.9.0-internal-debug-kuba_2014_08_20_14_02-b00)
OpenJDK 64-Bit Server VM (build 1.9.0-internal-debug-kuba_2014_08_20_14_02-b00, mixed mode)

Давайте попробуем отладку. Добавьте точку останова строки, начните отладку, и … наконец она зеленая! Повеселись!