Изучаем серию JVM с нуля (5): Создание среды чтения исходного кода HotSpot

Java
Изучаем серию JVM с нуля (5): Создание среды чтения исходного кода HotSpot

предисловие

На эту статью есть три основные причины:

  • Первый аспект - потому что в предыдущих статьях,Время запуска загрузчика классов процесса инициализацииЭти два фрагмента контента перемежаются большим количеством исходного кода HotSpot, обязательно будут небольшие партнеры.Я хочу сам следовать исходному коду HotSpot, поэтому я напишу здесь специальную статьюСреда чтения исходного кода HotSpotСтатьи для тех, кому это нужно

  • Далее, это будет обсуждаться в более поздней статьеПроцесс создания объекта, алгоритм сборки мусора, безопасная точка и безопасная зона GC, сборщик мусораВ ожидании серии контента, она неизбежно будет задействованаИсходный код точки доступатак что лучше поставить его сейчасНастроена среда чтения исходного кода, затем шаг за шагом следуйте идеям статьи.

  • Последний аспект также является проблемой:Вы действительно не заинтересованы в JVM?

Итак, без лишних слов, давайте готовиться к сборке! ! !

Готов к работе

Первая ссылка: подготовка программного обеспечения

Я здесь для своей среды, вы можете построить ее в соответствии со своей средой, причина та же.

  • ОС: система Mac
  • IDE: Клион
  • Исходный код: OpenJDK8

Вторая ссылка: построение среды

IDE Clion

Сначала вам нужно установить Clion, потому что виртуальная машина HotSpot написана на C++,Ссылка здесь, нажмите на меня

Доступна тестовая IDE Clion

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

image.png

Затем мы нажимаем «Создать», скриншот отчета о найденных неисправностях ниже, введитеmissing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrunЭта строка кода ошибки, Baidu заявила, что она отсутствуетИнструменты командной строкиИнструменты, затем загрузите этот инструмент

image.png

Установить инструменты командной строки

Перейдите на сайт разработчиков Apple:Пожалуйста, нажмите здесь, чтобы войти, чтобы загрузить, установите файл PKG после загрузки

image.png

image.png

После установки открыл Clion, обнаружил, что исходная ошибка местами выделена серым цветом, и объяснил, что исправил

image.png

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

image.png

Загрузите исходный код openjdk

IDE готова, следующим шагом будет подготовка исходного кода openjdk, т.к.官网下载网速太慢,容易文件下不全, я нашел поддерживаемую сообществом версию openjdk-jdk8u прямо в Интернете

https://github.com/AdoptOpenJDK/openjdk-jdk8u

Третья ссылка: скомпилировать исходный код

После загрузки последнего исходного кода OpenJDK вам нужно скомпилировать его

Готов к компиляции Инструменты

// 加速编译
brew install ccache  
// 字体引擎,编译过程中会被依赖到
brew install freetype 
brew install autoconf
// 分布式版本控制
brew install mercurial

Настроить BOOT_JDK很重要,不然编译会报出各种千奇百怪的问题

Перед компиляцией нужно настроить что-то под названием BOOT_JDK, версия которого на один уровень ниже скомпилированной версии, то есть для компиляции OpenJDK8 нужно установить JDK7 как средуOpenJDK7 или OracleJDK7 могут быть

Установить скомпилированнуюb很重要,解决头文件费了将近两天,最后发现安装这玩意就好了,我吐血了

На самом деле, причина этого шага заключается в том, чтобы решить проблему, заключающуюся в том, что многие заголовочные файлы не могут быть найдены при компиляции исходного кода openjdk.

Требования для установки: требуется python3+,brew install python3

Затем вам нужно установить PIP, инструкции по установке:curl bootstrap.pypa.io/get-pip.py | python3

наконец прошлоустановка pip скомпилированаbВот и все, команда:pip install compiledb

Настроить переменные среды

vi ~/.bash_profile

Вставьте следующую информацию о конфигурации внизу файла .bash_profile:

# 设定语言选项,必须设置
export LANG=C
# Mac平台,C编译器不再是GCC,而是clang
export CC=clang
export CXX=clang++
export CXXFLAGS=-stdlib=libc++
# 是否使用clang,如果使用的是GCC编译,该选项应该设置为false
export USE_CLANG=true
# 跳过clang的一些严格的语法检查,不然会将N多的警告作为Error
export COMPILER_WARNINGS_FATAL=false
# 链接时使用的参数
export LFLAGS='-Xlinker -lstdc++'
# 使用64位数据模型
export LP64=1
# 告诉编译平台是64位,不然会按照32位来编译
export ARCH_DATA_MODEL=64
# 允许自动下载依赖
export ALLOW_DOWNLOADS=true
# 并行编译的线程数,编译时长,为了不影响其他工作,可以选择2
export HOTSPOT_BUILD_JOBS=4
export PARALLEL_COMPILE_JOBS=2 #ALT_PARALLEL_COMPILE_JOBS=2
# 是否跳过与先前版本的比较
export SKIP_COMPARE_IMAGES=true
# 是否使用预编译头文件,加快编译速度
export USE_PRECOMPILED_HEADER=true
# 是否使用增量编译
export INCREMENTAL_BUILD=true
# 编译内容
export BUILD_LANGTOOL=true
export BUILD_JAXP=true
export BUILD_JAXWS=true
export BUILD_CORBA=true
export BUILD_HOTSPOT=true
export BUILD_JDK=true
# 编译版本
export SKIP_DEBUG_BUILD=true
export SKIP_FASTDEBUG_BULID=false
export DEBUG_NAME=debug
# 避开javaws和浏览器Java插件之类部分的build
export BUILD_DEPLOY=false
export BUILD_INSTALL=false

# 最后需要干掉这两个环境变量(如果你配置过),不然会发生诡异的事件
unset JAVA_HOME
unset CLASSPATH

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

source ~/.bash_profile

Выполните команду подтверждения файла конфигурации

Войдите в загруженный каталог openjdk и выполните команду проверки файла конфигурации.注意:一定要切换到BOOT_JDK的版本下执行

sh configure --with-freetype-include=/usr/local/include/freetype2 --with-freetype-lib=/usr/local/lib/ --disable-zip-debug-info --disable-debug-symbols --with-debug-level=slowdebug --with-target-bits=64 --with-jvm-variants=server

Случай ошибки файла конфигурации выполнения

  1. После выполнения сообщается об ошибке на следующем рисунке, что означает, чтоНе удалось определить версию Xcode

image.png

解决办法: перейдите на сайт разработчиков Apple:Пожалуйста, нажмите здесь, чтобы войтиЗагрузите Xcode, соответствующий версии системы Mac, запомните после загрузки Xcode执行下面的命令, иначе все равно будет сообщено об ошибке на картинке выше

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
  1. Xcode 4 is required to build JDK 8вина

image.png

解决办法: найти файл конфигурации и открыть егоvim common/autoconf/generated-configure.sh, найдите место, где можно судить о версии, и закомментируйте этот абзац.

    #Fail-fast: verify we're building on Xcode 4, we cannot build with Xcode 5 or later
    XCODE_VERSION=`$XCODEBUILD -version | grep '^Xcode ' | sed 's/Xcode //'`XC_VERSION_PARTS=( ${XCODE_VERSION//./ } )
    if test ! "${XC_VERSION_PARTS[0]}" = "4"; then
     as_fn_error $? "Xcode 4 is required to build JDK 8, the version found was  $XCODE_VERSION. Use --with-xcode-path to specify the location of Xcode 4 or make Xcode 4 active by using xcode-select." "$LINENO" 5
    fi
#
  1. A gcc compiler is requiredПроблема

image.png

解决办法: найдите следующий код подтверждения и закомментируйте его,Обратите внимание, что есть два места, код одинаковый, по знакам на рисунке ниже, чтобы найти

image.png

    if test $? -ne 0; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5
$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&6;}
      { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&5
$as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&6;}
      as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5
    fi

Появится следующий рисунок, который доказывает, что проверка завершена.Примечание. Чтобы подтвердить версию Boot JDK

image.png

начать компиляцию每一次编译都要耗费很多的时间,所以建议把文中的错误都改了之后,再进行编译

воплощать в жизньcompiledb make WARNINGS_ARE_ERRORS="" CONF=macosx-x86_64-normal-server-slowdebug allкоманда для компиляции

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

  1. compiledb make CONF=macosx-x86_64-normal-server-slowdebug clean
  2. compiledb make WARNINGS_ARE_ERRORS="" CONF=macosx-x86_64-normal-server-slowdebug all
compiledb make WARNINGS_ARE_ERRORS="" CONF=macosx-x86_64-normal-server-slowdebug all

Скомпилированный случай ошибки

  1. fatal error: 'iostream' file not found的问题:solution: установить переменную среды
NEW_INCLUDE=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
export CFLAGS=-I$NEW_INCLUDE
export CXXFLAGS=-I$NEW_INCLUDE
  1. library not found for -lstdc++的问题: Решение: выполните следующие действия.
  • Клонировать инструмент:git clone https://github.com/quantum6/xcode-missing-libstdcpp(Примечание: содержимое этого файла будет программно связано с Xcode, поэтому этот каталог нельзя удалить)
  • Затем войдите в инструмент и выполните sh install.sh
  • Настроить переменные среды
NEW_LIB=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib
export LDFLAGS="-L${NEW_LIB}"
export LIBRARY_PATH=$NEW_LIB:$LIBRARY_PATH
  1. symbol(s) not found for architecture x86_64Проблема: Решение: найти файлjdk/src/macosx/native/sun/osxapp/ThreadUtilities.m, затем поставьтеinline void attachCurrentThread(void** env) 改为static inline void attachCurrentThread(void** env)
Undefined symbols for architecture x86_64:
  "_attachCurrentThread", referenced from:
      +[ThreadUtilities getJNIEnv] in ThreadUtilities.o
      +[ThreadUtilities getJNIEnvUncached] in ThreadUtilities.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

image.png

  1. clang: error: unknown argument: '-fpch-deps'Проблема, решение: редактироватьhotspot/make/bsd/makefiles/gcc.makeПрокомментируйте следующий код

image.png

ifeq ($(USE_CLANG),)
  ifneq ($(CC_VER_MAJOR), 2)
    DEPFLAGS += -fpch-deps
  endif
endif

image.png

  1. error: invalid argument '-std=gnu++98' not allowed with 'C'Проблема, Решение: Редактироватьcommon/autoconf/generated-configure.sh,поиск-std=gnu++98эта строка и комментарий

image.png

image.png

  1. Решите проблему сбоя после компиляции в режиме медленной отладки: после компиляции в режиме медленной отладки будет ошибка сбоя JVM после выполнения java -version. найти файлhotspot/src/share/vm/runtime/perfMemory.cppдокумент. Закомментируйте следующее:

image.png

  1. implicit declaration of function 'VerifyFixClassname' is invalid in C99Проблема: Решение: включить заголовочный файл или прямое внешнее объявлениеЛучше всего включить заголовочный файл, если вы не можете его найти, объявите его напрямую
extern jboolean VerifyFixClassname(char* name);
extern jboolean VerifyClassname(char* name, jboolean allowArrayClass);

image.png

  1. implicit declaration of function 'pthread_main_np' is invalid in C99Проблема: та же, что и вышеЛучше всего включить заголовочный файл, если вы не можете его найти, объявите его напрямую
extern jboolean pthread_main_np();

image.png

  1. implicitly declaring library function 'strchr' with type 'char *(const char *, int)'Проблема: та же, что и вышеЛучше всего включить заголовочный файл, если вы не можете его найти, объявите его напрямую
#include <stdio.h>
#include <string.h>

image.png

  1. implicit declaration of function 'time' is invalid in C99Проблема: та же, что и вышеЛучше всего включить заголовочный файл, если вы не можете его найти, объявите его напрямую
#include <time.h>

image.png

  1. implicit declaration of function 'JVM_ActiveProcessorCount' is invalid in C99Проблема: здесь напрямую изменено наjint ncpus = 4;
jint ncpus = 4;

image.png

Четвертая ссылка: импортировать исходный код в Clion и настроить его

Если появится интерфейс, показанный на рисунке ниже, это означает, что编译成功, после компиляции можно получить большое количествоNo such file or directory的警告。Не беспокойтесь об этом, следующим шагом будет импорт скомпилированного исходного кода в Clion.

image.png

image.png

из-за использованияскомпилированныйb пакет компилирует исходный код OpenJDK. Итак, после завершения компиляции мы можем увидеть еще один в корневом каталоге исходного кода.compile_commands.json文件. Импорт нашего проекта зависит от этого файла json.

image.png

Откройте Clion, затем нажмите «Открыть», чтобы открыть вышеуказанноеcompile_commands.json文件и выберите «Открыть как проект» во всплывающем диалоговом окне.

image.png

等待导入成功后, в Клионеpreferences->Build,Execution,Deployment->Custom Build Targets, нажмите на страницу изменения конфигурацииAdd Targetнастроить пользовательскийBuild Targets.

image.png

Введите имя самостоятельно, и Toolchain выберет значение по умолчанию.

image.png

Создайте новый инструмент, один make_jdk8, другой clean_jdk8,(Вы можете выбрать имя самостоятельно)

image.png

make_jdk8: где аргументы заполняются:CONF=macosx-x86_64-normal-server-slowdebug,Working directory则添加源码的根目录。

image.png

clean_jdk8: Заполните аргументы:CONF=macosx-x86_64-normal-server-slowdebug clean,Working directory则添加源码的根目录。

image.png

Затем завершите конкретную настройку Clutom Build Targets, конкретная конфигурация выглядит следующим образом:

image.png

Затем нажмите на главную страницу ClionAdd Configuration, добавить конфигурациюRun/Debug Configurations。

image.png

Пятая ссылка: начать отладку

После того, как все настроено, мы можем приступить к отладке кода. Сначала добавьте точку останова в create_vm файла jni.cpp.

image.png

На этом этапе отладка отладки настроена, и среда чтения исходного кода HotSpot завершена. Надеюсь, у всех все получится! ! !

болтовня

Наконец, если вы чувствуете какую-либо путаницу в статье, пожалуйста, оставьте комментарий как можно скорее.маленький новичокЕсли у меня что-то есть, ставьте лайк 👍 Подписывайтесь ❤️ Делитесь 👥 Мне это очень полезно! ! ! Если вы хотите получить огромные ресурсы JavaПростые в использовании плагины идей, шаблоны резюме, шаблоны проектирования, многопоточность, архитектура, стиль программирования, промежуточное ПО..., вы можете обратить внимание на публичный аккаунт WeChatЭнциклопедия Java, Наконец, спасибо за вашу поддержку! ! !