Иногда отладки 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 . |