Скомпилируйте OpenJDK12 на MacOS и выполните отладку с помощью CLion.

JVM

Недавно я просматривал содержание оптимизации синхронизированной блокировки, и некоторые места кажутся неудобными, так что просто скомпилируйте исходный код, чтобы посмотреть.

Компиляция на окнах

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

MAC-среда

macos.png
macos.png

Подготовить

Получить исходный код

Исходный код OpenJDK управляется Mercurial. Если вы загружаете его через репозиторий, вам необходимо установить Mercurial. Для его установки мы используем менеджер пакетов homebrew.

brew install mercurial

Если на вашем компьютере не установлен доморощенный, вы можете использовать следующую команду для его установки

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

После завершения установки используйте следующую команду для клонирования исходного кода.

cd ~/jvm
hg clone https://hg.openjdk.java.net/jdk/jdk12

После выполнения команды исходный код openjdk не загружается

Поскольку я не использую метод hg, вы можете обратиться к статье The Flash для этой части.woo woo Краткое описание.com/afraid/oh oh 7 oh 91766…

Конечно, я настоятельно не рекомендую вам использовать метод Mercurial для загрузки, этот метод будет долго ждать, и он также требует внешней сети для обеспечения безопасности. Рекомендую скачать прямо со страницыПакет сжатия исходного кода OpenJdk12)

openjdk12-source-code.png
openjdk12-source-code.png

Например, я скачал файл в формате gz (неважно, какой формат вы выберете).

Если вы используете Chrome, вы можете включить многопоточную загрузку, и скорость будет значительно улучшена.

Bootstrap JDK

Поскольку некоторые компоненты OpenJDK написаны на C++, а некоторые — на Java, для компиляции этих кодов Java требуется доступный JDK, который официально называется «Bootstrap JDK». Вообще говоря, он должен быть больше, чем скомпилированный JDK. Доступ к первой версии, использующей здесь OpenJDK11, можно получить по этому URL-адресу.jdk.java.net/archive/скачать Не забудьте загрузить OpenJDK11 для платформы Mac.

Версия Bootstrap JDK, которую я использую, выглядит следующим образом

openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)

Установить зависимости

# 用于生成shell脚本的工具,可以使软件包在不同的系统下都可以编译
brew install autoconf

# 字体引擎
brew install freetype

XCode и инструменты командной строки для Xcode

Эти два SDK предоставляют компиляторы, необходимые для OpenJDK, и внешние команды, используемые в Makefile. Обычно он устанавливается на компьютер.

Многие ошибки компиляции в Интернете вызваны проблемами версии XCode, в результате чего возникают ошибки, и я тоже столкнулся с этой ямой.

configure: error: No xcodebuild tool and no system framework headers found, use --with-sysroot or --with-sdk-name to provide a path to a valid SDK

/Users/.../.../xxx.sh: line 82: 5: Bad file descriptor

configure exiting with result code 1

Наконец-то скачал с официального сайта.developer.apple.com/download/mo…Установил версию XCode 9.4.1, чтобы сделать это.

Чтобы загрузить xcode, вам необходимо войти в систему. Если у вас нет учетной записи, вы можете подать заявку на ее создание.

Я решил загрузить и установить Xcode вручную. Вы можете загрузить только инструменты командной строки (macOS 10.13) для Xcode 9.4.1 и установить его, чтобы посмотреть, сможет ли он решить вашу проблему. несколько G)

download-xcode.png
download-xcode.png

скомпилировать jdk

После того, как исходный код загружен, я распаковываю его и помещаю в этот/Users/naver/jvm/jdk12-06222165c35fкаталог, следующие команды выполняются в этом каталоге.

bash configure  --with-boot-jdk='/usr/local/jdk-11.0.2.jdk/Contents/Home' --with-debug-level=slowdebug --with-target-bits=64 --disable-warnings-as-errors --enable-dtrace --with-jvm-variants=server

--with-boot-jdk: укажите путь Bootstrap JDK.--with-debug-level: Уровень компиляции, необязательные значения: релиз, fastdebug, slowdebug и оптимизированный, значение по умолчанию — релиз, если мы хотим отладить, нам нужно установить его на fastdebug или slowdebug, рекомендуется установить его на slowdebug--with-target-bits: Укажите, следует ли компилировать 32-разрядную или 64-разрядную виртуальную машину.--disable-warnings-as-errors: чтобы избежать прерывания процесса компиляции из-за предупреждений--enable-dtrace: открыть инструмент производительности--with-jvm-variants: Скомпилируйте виртуальную машину в определенном режиме, обычно компилируйте серверный режим здесь.--with-conf-name: Укажите имя конфигурации компиляции. Если не указано, будет сгенерировано имя конфигурации по умолчанию macosx-x86_64-server-slowdebug. Здесь я использую конфигурацию генерации по умолчанию.

Во многих сценариях компиляция OpenJDK будет использовать--enable-ccacheпараметр для ускорения скорости компиляции через ccache, но я его не использовал, так как текущая скорость компиляции на самом деле не медленная, и если добавить этот параметр, то при импорте в CLion будет много красных подсказок, что вроде не влияет на использование. , но выглядит не очень удобно

Создать базу данных компиляции

При настройке CLion напрямую импортируйте скомпилированный исходный код jdk, вы обнаружите, что все файлы заголовков окрашены в красный цвет, а приглашение не может быть найдено из-за проблемы с CMakeLists.txt, созданным CLion.Если вы хотите решить эту проблему , вам нужно изменить этот файл, очевидно, я не буду его исправлять.

Наконец, используя базу данных компиляции (blog.jet brains.com/C Lion/2020/…) Сборка OpenJDK в CLion решила проблему.

make CONF=macosx-x86_64-server-slowdebug compile-commands

После выполнения этой команды файл compile_commands.json будет создан в папке ${source_root}/build/macosx-x86_64-server-slowdebug.compile_commands_json.png

компилировать

Перед импортом CLion его нужно скомпилировать, так как некоторые модули используют предварительно скомпилированные заголовки.Если не скомпилировать, CLion выдаст сообщение о том, что в процессе индексации не могут быть найдены различные файлы.

make CONF=macosx-x86_64-server-slowdebug

контрольная работа

open-jdk-version.png
open-jdk-version.png

Пока что это доказывает, что мы скомпилировали JDK12.

Отладка CLion

импортировать проект

Настройте цепочки инструментов перед импортом проекта (запись «Настройки»)

toolchains.png
toolchains.png

После настройки Toolchains перейдитеFile -> Openфункция, выбранная${source_root}/build/macosx-x86_64-server-slowdebug/compile_commands.json,As a projectОткройте, чтобы файл базы данных компиляции был импортирован, а затем CLion начал индексировать.

В это время вы обнаружите, что не можете видеть исходный код, поэтому вам нужно изменить корневой каталог проекта ниже, черезTools -> Compilation Database -> Change Project Rootвыберите каталог с исходным кодом, т. е.${source_root}, чтобы вы могли видеть исходный код в CLion.

${source_root} относится к /Users/naver/jvm/jdk12-06222165c35f

Настройка перед отладкой

нуждаться вPreferences --> Build, Exceution, Deployment --> Custom Build TargetsНастроить цель сборки

build.png
build.png
clean.png
clean.png

Поскольку я уже настроил его здесь, страница редактирования отображается здесь.Для первой конфигурации нажмите +, чтобы добавить ее.

Благодаря этим двум конфигурациям наш jdk будет перекомпилироваться перед каждой сборкой, а повторная отладка может выполняться непосредственно после изменения кода jvm.

конфигурация отладки

debug_config.png
debug_config.png

Исполняемый: выберите${source_root}/build/macosx-x86_64-server-slowdebug/jdk/bin/javaили другие файлы, которые вы хотите отладить, например javac; Перед запуском: Есть баг, когда добавляется ниже.Если убрать, то не будет заходить в Build каждый раз при выполнении, что экономит время, но на самом деле метод инкрементной компиляции OpenJDK, каждый Build очень быстрый , так что это зависит от личного выбора.

debug

существует${source_root}/src/java.base/share/native/libjli/java.cТочка останова на строке 401, нажмите «Отладка», а затем F9, чтобы отпустить, не случайно вы столкнетесь со следующей проблемой.

debug-sigsegv.png
debug-sigsegv.png

Поскольку мы используем LLDB для отладки, выполнение следующих команд под LLDB при входе в первую точку останова может избежать таких проблем.

pro hand -p true -s false SIGSEGV SIGBUS
lldb-pro-hand.png
lldb-pro-hand.png

Наконец, вы можете видеть, что вывод java -version выглядит следующим образом.

java-version.png
java-version.png

Однако очень проблематично вводить такое предложение каждый раз при отладке, поэтому мы можем использовать следующую команду в файле **~/.lldbinit** для автоматической установки точки останова при каждой отладке, а затем ввестиpro hand -p true -s false SIGSEGV SIGBUS, и, наконец, продолжить выполнение последующего процесса, содержимое файла выглядит следующим образом (где путь файла main.c заменяется на себя)

breakpoint set --file /Users/naver/jvm/jdk12-06222165c35f/src/java.base/share/native/launcher/main.c --line 98 -C "pro hand -p true -s false SIGSEGV SIGBUS" --auto-continue true

Совместная отладка с Java-программами

Приведенная выше демонстрация на самом деле показывает, как отлаживать java-версию, так как же отлаживать ее, используя написанный вами java-код в качестве записи программы?

Во-первых, java-код выглядит следующим образом (я написал его с идеей):

java-code.png
java-code.png

Конфигурация в CLion следующая

debug-java-code.png
debug-java-code.png

Результаты приведены ниже:

debug-java-code-result.png
debug-java-code-result.png

Справочная документация

>Скомпилируйте openjdk1.9 под Mac и интегрируйте динамическую отладку clion. Компиляция и отладка OpenJDK с помощью CLion на MacOS

Следуй за мной, чтобы не потеряться

Твое внимание - величайшее поощрение для меня, если ты брат, обрати внимание на меня (собачья голова спасет тебе жизнь)gzh.png