获得源代码
首先从 Github 获取 OpenJDK的源代码
1
|
$ git clone https://github.com/openjdk/jdk.git
|
安装必要的软件
- Xcode
- Xcode Command Line Tools
- 通过
xcode-select --install
命令安装
- GNU Autoconf
- 使用
brew install autoconf
命令安装
- freetype
- 使用
brew install freetype
命令安装
- boot JDK
- 构建 JDK 需要预先存在的JDK,这被称为“boot JDK”。
- 经验法则是,用于构建 JDK 主版本N的 boot JDK应该是主版本 N-1 的 JDK
- 建议使用 SDKMAN! 来安装维护 JDK 的多个版本
配置构建
通过运行 bash configure
命令来完成配置构建。这个脚本将检查你的系统,确保所有必要的依赖项都已经满足。如果一切顺利,该脚本将汇总build的配置、将使用的工具,以及 build 将使用的硬件资源:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
Configuration summary:
* Name: macosx-x86_64-server-release
* Debug level: release
* HS debug level: product
* JVM variants: server
* JVM features: server: 'cds compiler1 compiler2 dtrace epsilongc g1gc jfr jni-check jvmci jvmti management parallelgc serialgc services shenandoahgc vm-structs zgc'
* OpenJDK target: OS: macosx, CPU architecture: x86, address length: 64
* Version string: 22-internal-adhoc.mazhen.jdk (22-internal)
* Source date: 1689128166 (2023-07-12T02:16:06Z)
Tools summary:
* Boot JDK: openjdk version "20.0.1" 2023-04-18 OpenJDK Runtime Environment Temurin-20.0.1+9 (build 20.0.1+9) OpenJDK 64-Bit Server VM Temurin-20.0.1+9 (build 20.0.1+9, mixed mode, sharing) (at /Users/mazhen/.sdkman/candidates/java/20.0.1-tem)
* Toolchain: clang (clang/LLVM from Xcode 14.3.1)
* Sysroot: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX13.3.sdk
* C Compiler: Version 14.0.3 (at /usr/bin/clang)
* C++ Compiler: Version 14.0.3 (at /usr/bin/clang++)
Build performance summary:
* Build jobs: 12
* Memory limit: 16384 MB
|
构建 OpenJDK
一旦配置完成,你就可以开始构建 JDK 了。
这个命令将开始构建过程,在完成后生成一个 JDK 的 image。
验证构建
新构建的 JDK 在 ./build/*/images/jdk
目录下,运行命令查看JDK版本
1
2
3
4
|
$ ./build/macosx-x86_64-server-release/images/jdk/bin/java -version
openjdk version "22-internal" 2024-03-19
OpenJDK Runtime Environment (build 22-internal-adhoc.mazhen.jdk)
OpenJDK 64-Bit Server VM (build 22-internal-adhoc.mazhen.jdk, mixed mode, sharing)
|
在VS code中调试 OpenJDK
首先在 VS code 中安装 C++ extension for VS Code。在 VS cod 中配置C++ 开发环境可以参考这篇文档 Using Clang in Visual Studio Code。
使用 VS code 打开 OpenJDK的源代码,在恰当的位置设置好断点,点击右上角三角运行图标,选择“Debug C/C++ file”:
然后在弹出列表中选择“(lldb) Launch“:
第一次运行会弹出错误信息,我们选择打开 launch.json
,创建新的 debugger 配置。点击右下角的 “add configuration…“,在弹出的列表中选择 “C/C++: (lldb) Launch”
VS code会自动添加缺省的配置,我们需要修改的是 program 和 args,设置为上面build好的 OpenJDK,以及准备运行的Java程序。
1
2
3
4
5
6
|
"program": "${workspaceFolder}/build/macosx-x86_64-server-release/images/jdk/bin/java",
"args": [
"-cp",
"/Users/mazhen/Documents/works/javaprojects/samples/playground/target/classes",
"tech.mazhen.test.Main"
],
|
保存文件 launch.json
,然后重新开始调试。可以在断点处停止,但是不能定位源代码,报错如下:
1
|
Could not load source 'make/src/java.base/unix/native/libnio/ch/Net.c': 'SourceRequest' not supported..
|
为了正确的找到源代码,需要在launch.json
中配置 sourceFileMap,将源代码的编译时路径映射到本地源代码位置。完整的配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
{
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/macosx-x86_64-server-release/images/jdk/bin/java",
"args": [
"-cp",
"/Users/mazhen/Documents/works/javaprojects/samples/playground/target/classes",
"com.apusic.test.Main"
],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
"sourceFileMap": {
"make/": "${workspaceFolder}"
},
}
]
}
|
现在就可以在VS code 中正常调试OpenJDK的C++代码了。