Статьи

Отладка OpenJDK

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

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

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

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

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

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

1
bash get_source.sh

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

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

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

1
2
3
4
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 и через дюжину минут вы увидите:

1
Finished building OpenJDK for target 'default'

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

1
2
3
handle SIGSEGV pass noprint nostop
handle SIGUSR1 pass noprint nostop
handle SIGUSR2 pass noprint nostop

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

1
set logging on

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

1
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:

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

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

1
make

и дождаться окончания компиляции. Теперь вы можете проверить, все ли работает правильно, вызвав ./java -version в каталоге build / linux-x86_64-normal-server-slowdebug / jdk / bin .

Тебе следует увидеть:

1
2
3
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)

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

Ссылка: Отладка OpenJDK от нашего партнера по JCG Якуба Кубрински в блоге Java (B) Log .