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)
Давайте попробуем отладку. Добавьте точку останова строки, начните отладку, и … наконец она зеленая! Повеселись!