为了更好的理解和学习 Java 和 Hotspot 虚拟机,于是在 OSX Mojave 编译 & 源码调试 openJdk 8,中间遇到了很多问题,记录分享一下。

  • Xcode 版本
  • 源码中不规范写法
  • slowdebug 中官方无解的 crash

准备

  • Xcode 9.1
  • xcode-select --install
  • Homebrew
  • brew install mercurial
  • XQuartz
  • JDK 8
  • brew install freetype

:这里使用老版本的 Xcode,因为 Xcode 10 后,libstd 废除,改用 libc++,导致编译错误。

下载源码

hg clone http://hg.openjdk.java.net/jdk8/jdk8 JDK8
cd JDK8
bash ./get_source.sh

编译相关设置

创建 envsetup.sh 文件。

touch envsetup.sh

写入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# 设定语言选项,必须设置
export LANG=C
# Mac平台,C编译器不再是GCC,是clang
export CC=gcc
# 跳过clang的一些严格的语法检查,不然会将N多的警告作为Error
export COMPILER_WARNINGS_FATAL=false
# 链接时使用的参数
export LFLAGS='-Xlinker -lstdc++'
# 是否使用clang
export USE_CLANG=true
# 使用64位数据模型
export LP64=1
# 告诉编译平台是64位,不然会按32位来编译
export ARCH_DATA_MODEL=64
# 允许自动下载依赖
export ALLOW_DOWNLOADS=true
# 并行编译的线程数,编译时间长,为了不影响其他工作,我选择为2
export HOTSPOT_BUILD_JOBS=4
export ALT_PARALLEL_COMPILE_JOBS=4
# 是否跳过与先前版本的比较
export SKIP_COMPARE_IMAGES=true
# 是否使用预编译头文件,加快编译速度
export USE_PRECOMPILED_HEADER=true
# 是否使用增量编译
export INCREMENTAL_BUILD=true
# 编译内容
export BUILD_LANGTOOLS=true
export BUILD_JAXP=false
export BUILD_JAXWS=false
export BUILD_CORBA=false
export BUILD_HOTSPOT=true
export BUILD_JDK=true
# 编译版本
export SKIP_DEBUG_BUILD=true
export SKIP_FASTDEBUG_BUILD=false
export DEBUG_NAME=debug
# 避开javaws和浏览器Java插件之类的部分的build
export BUILD_DEPLOY=false
export BUILD_INSTALL=false
# 加上产生调试信息时需要的 objcopy
export OBJCOPY=gobjcopy

然后执行 source envsetup.sh

configure

1
2
3
4
bash ./configure \
--with-target-bits=64 \
--with-debug-level=slowdebug --enable-debug-symbols \
ZIP_DEBUGINFO_FILES=0

make

编译!

make all

测试

编译结束后,会看到如下图输出:

1
2
3
4
5
$ cd build/macosx-x86_64-normal-server-slowdebug/jdk/bin
$ ./java -version
openjdk version "1.8.0-internal-debug"
OpenJDK Runtime Environment (build 1.8.0-internal-debug-kevin_2019_04_20_21_08-b00)
OpenJDK 64-Bit Server VM (build 25.0-b70-debug, mixed mode)

这里 slowdebug 会出现 crash,需要注释掉如下代码:

导入 Clion

File->ImportProject,导入 Hotspot 目录。
Clion 会生成 CMakeList 文件。不用理会,无脑 next。

源码调试

在 Clion 中,Edit configuration

下一步点击 debug 按钮:

Happy Hacking!

参考