OpenJDK1.8源码编译、调试
1、写在前面
根据我个人的经验,构建JDK最好的操作系统是Linux。
并且,由于各个不同JDK版本对于依赖环境的版本不一致(可能出现某个jdk版本只能在某个固定的linux版本才可以构建成功),为了避免环境污染,使用虚拟机是最好的解决方案。
当然,在宿主机构建也不是不可以,但难度比较大,例如在我的环境下(MacOS12.4)JDK8、JDK12均无法成功构建,但最新的版本的JDK(22)却很容易就成功了。
具体的成功构建JDK版本对应的操作系统&环境的表格,可以参考官方wiki。
还有一个很重要的说明:
每一个版本的JDK都有一个README.md,建议构建的同学先看一遍这个构建说明,里面详细描述了构建当前版本JDK所需要的依赖、构建JDK参数的说明以及构建JDK可能出现的错误。
2、环境准备
2.1、工具说明
虚拟机:VirtuaBox
编译环境:Ubuntu 14.04(虚拟机)下载地址 我这边选用的是ubuntu-14.04-server-amd64.iso 因为不需要图形化界面。
JDK源码:点击跳转
Boot JDK(7u80):点击跳转
调试工具:vs code
2.2、虚拟机安装&配置
2.2.1、使用VirtuaBox安装Ubuntu 14.04
- 
选择镜像 
 ![image]() 
- 
设置登录用户 
 ![image]() 
- 
设置内存和cpu核心数 
 这里初始可以设置大一点,因为构建jdk还是需要一点性能的。构建完成之后可以再缩回去。我这里给了6c6g
 ![image]() 
- 
设置硬盘 
 ![image]() 
- 
点击finish 
 ![image]() 
- 
开始安装 
 ![image]() 
这里有一步需要键盘操作,回车即可

安装完成之后,先使用VirtuaBox的界面,登录之前创建好的用户

由于这个窗口很小,且一些操作不方便,这里先把openssh-server给安装了,后面可以使用别的命令行工具远程登录。

直接安装的话会出现这个提示,这里需要先处理一下ubuntu的基本配置。
设置root账号密码

使用root账户解决上面那个问题,参考来源
nano /etc/sudoers
处理好之后,再安装openssh-server

设置端口转发(用作ssh登录和vs code remote 调试),我这里配置的是虚拟机的22端口转发到宿主机的12222。

至此,虚拟机初始化就完成了。
2.2.2、Ubuntu环境准备
前面的准备,已经把ubuntu的ssh开启了,接下来我们直接使用终端远程登录即可。我这里用的是Iterm

- 
下载jdk1.7的linux包,下载完成后配置jdk1.7环境,配置完成之后运行 java -version 
 ![image]() 
- 
git clone jdk源码,切换分支,选择tag jdk8-b120。 
 ![image]() 
基本工作准备好之后,就可以开始执行构建了。
- 配置阿里源(可选)
 由于默认的源由于网络原因,下载依赖会很慢,这里推荐将源修改为阿里或其他的,参考地址
3、配置&构建JDK
按照jdk源码目录下的READM-builds.html文件中的编译引导:
The very first step in building the OpenJDK is making sure the system itself has everything it needs to do OpenJDK builds. Once a system is setup, it generally doesn't need to be done again.
Building the OpenJDK is now done with running a configure script which will try and find and verify you have everything you need, followed by running make, e.g.
bash ./configure
make all
Where possible the configure script will attempt to located the various components in the default locations or via component specific variable settings. When the normal defaults fail or components cannot be found, additional configure options may be necessary to help configure find the necessary tools for the build, or you may need to re-visit the setup of your system due to missing software packages.
NOTE: The configure script file does not have execute permissions and will need to be explicitly run with bash, see the source guidelines.
如果你使用的是跟我同一个虚拟机镜像,则可能需要先安装下面这些依赖:
sudo apt-get install build-essential
sudo apt-get install zip
sudo apt-get install libfreetype6-dev
sudo apt-get install libasound2-dev
按照编译引导,先执行
bash ./configure 
执行过后,如果有缺失的依赖,就会在输出信息中提醒你,并引导你去安装,安装完成之后继续执行这个命令。这个过程会反复进行多次,直到所有依赖都准确无误的安装完成了。
如果你使用的跟我是同一个虚拟机镜像,则可能会出现一个情况:

这个时候哪怕你按照提示安装了,再执行也还是会出现相同的错误,需要加上配置参数执行:
bash ./configure --with-freetype-include=/usr/include/freetype2 --with-freetype-lib=/usr/lib/x86_64-linux-gnu
正常执行完成之后,你将会得到类似下面的信息打印:

这里会简单输出当前的配置信息,例如使用构建的核心数和内存大小,boot jdk版本,debug版本等。
配置完成之后,就可以执行构建了,运行:
make images 
就开始编译了,编译的时长根根据机器性能决定,所以当时设置虚拟机的时候,说尽量先给大一点,这里编译就会更快。
编译完成后会输出如下信息:

至此,JDK8就编译完成了。验证一下

可以看到,咱们自己编译出来的java命令已经可以运行了。
4、调试JDK8
这里选用的是vs code的remote能力进行的调试,当然clion也有类似的功能,但clion对机器的内存有要求 > 4g,同学们可以根据自己需要选择对应的调试工具。
4.1、Vs Code配置
打开vs code,安装remote插件

安装完成之后,打开侧边栏的remote菜单栏

配置好远程服务器的信息,配置好之后直接点击服务器对应的 -> 即可打开远程服务器上的项目

随后会提示输入密码,如果不想输入密码,设置免密登录即可(强烈建议!!!)。

如果是第一次打开,则会进行初始化

初始化完成之后,打开左边的文件栏

打开JDK源码所在目录,可以看到类似下面的页面。

至此,工作区就配置好了,但在进行调试之前,还需要设置vscode对c++调试的支持,也就是下载插件

4.2 正式debug
安装好之后,我们开始配置vs的运行参数。点击左侧debug菜单

配置好launch.json,这里是使用编译出来的java 运行一下 -version
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/linux-x86_64-normal-server-release/jdk/bin/java",
            "args": ["-version"],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

点击运行

如果是完全按照我的环境来配置的同学,这里可能会报错:

因为没有安装gdb,安装即可
sudo apt-get install gdb
再运行一次,成功进入断点

断点所在位置:java.c 的JavaMain方法,找到之后打上。
跳过断点,输出版本信息

至此,整个JDK1.8调试的初始工作就完成了,开始愉快的调试吧。
 
                     
                    
                 
                    
                








 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号