本文目标
构建带有调试信息的OpenJDK
使用图形化界面调试OpenJDK
环境
OS: Ubuntu 18.04.5 LTS
内核:4.15.0-130-generic
要编译的JDK: jdk8
步骤
1、下载要编译的JDK8版本
1.1、筛选tag:
打开github:https://github.com/openjdk/jdk/,筛选一下下一步需要构件的版本的tag
1.2、下载代码
可以使用git clone。也可以点击点击Download Zip,这里使用Download Zip的方式。
注意:如果选择git clone注意只需要clone这个tag的就行。如果clone所有的代码量比较大,会很慢。
这里把下载的代码放到:/home/parallels/workspace/openjdk 目录下
1.3、解压
执行 unzip jdk-jdk8-b120.zip 命令解压,得到如下目录:
2、下载boot JDK
JDK里面除了c、c++的代码以外还有很多java的代码,需要用一个能使用的JDK来编译(这个JDK就叫做boot JDK)。
一般都是选择一个要构建版本的上一个发布版本。比如咱们要构建JDK8,就需要下载一个JDK7的release版本作为 boot JDK。
2.1 下载地址
JDK Builds from Oracle 选择这个7进去
勾选:Accept License Agreement,并且下载linux版本的
这里把下载的boot jdk放到
2.2 解压
执行命令解压
tar xvf jdk_ri-7u75-b13-linux-x64-18_dec_2014.tar.gz
得到如下目录:
3、构建JDK
3.1、环境检测
切换目录到
cd /home/parallels/workspace/openjdk/jdk-jdk8-b120
执行构建命令
sh ./configure --with-target-bits=64 --with-jvm-variants=server --with-debug-level=slowdebug --disable-zip-debug-info --with-boot-jdk=/export/soft/java-se-7u75-ri/
参数解释:
--with-target-bits=64: 构建64的JDK
--with-jvm-variants=server :构建server模式的JDK
--with-debug-level=slowdebug: slowdebug带有更多的调试信息
--disable-zip-debug-info:禁止压缩调试信息,可以方便调试
--with-boot-jdk=/export/soft/java-se-7u75-ri/ :表示boot jdk的路径,就是刚才下载的jdk7的路径
这个步骤可能遇到的问题:
这个步骤会检测当前的操作系统以及一些依赖的组件是否存在。如果依赖的组件不存在会在命令行给出提示,根据提示安装就可以。
这里要注意的一个是如果提示:sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
这时候只需要把: libX11-dev中的X改为小写的x再执行命令就可以了。
解决了问题后,再次执行
sh ./configure --with-target-bits=64 --with-jvm-variants=server --with-debug-level=slowdebug --disable-zip-debug-info --with-boot-jdk=/export/soft/java-se-7u75-ri/
这个过程可能要循环好几次:遇到组件未安装-->根据提示安装--->再运行上面的命令--->根据提示安装。
命令执行成功的结果如下: 会输出要构建的信息
3.2、make构建
安装 bear
bear主要是用来生成 compilation database。用来给后续Clion使用,如果使用gdb调试不适用Clion的图形化调试可以不用bear
sudo apt-get install bear
执行make命令
bear make all
这个过程遇到的问题比较多,以下一一说明。
错误0:忽略警告
错误信息:
cc1plus: all warnings being treated as errors
解决方法:
vi hotspot/make/linux/makefiles/gcc.make
注释掉如下这行
bear make all执行成功输出如下:
错误1:操作系统检测失败
报错信息:
*** This OS is not supported: Linux Lincoln 4.15.0-130-generic #134-Ubuntu SMP Tue Jan 5 20:46:26 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
make[5]: *** [check_os_version] Error 1
/home/parallels/workspace/openjdk/jdk-jdk8-b120/hotspot/make/linux/Makefile:234: recipe for target 'check_os_version' failed
解决方法:
vi hotspot/make/linux/Makefile
修改:
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3%
为
SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4% 5%
错误2:make语法不兼容
报错信息:
/usr/bin/make: invalid option -- '8'
/usr/bin/make: invalid option -- '-'
/usr/bin/make: invalid option -- '1'
/usr/bin/make: invalid option -- '2'
/usr/bin/make: invalid option -- '0'
/usr/bin/make: invalid option -- '/'
/usr/bin/make: invalid option -- 'a'
/usr/bin/make: invalid option -- '/'
/usr/bin/make: invalid option -- 'c'
解决方法:
vi hotspot/make/linux/makefiles/adjust-mflags.sh
添加一个大写I
错误3:gcc版本太高
错误信息:
generation.hpp:421:17: error: invalid suffix on literal; C++11 requires a space between literal and string macro [-Werror=literal-suffix]
....省略
left operand of shift expression ‘(-1 << 1)’ is negative [-fpermissive]
解决方法:
根据官方文档()http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html,构建jdk8需要gcc 4.3。
本机的是7.5.0。所以需要降低版本
安装gcc和g++ 4.9版本
修改apt源:
sudo vi /etc/apt/sources.list
添加以下内容到文件末尾:
#install gcc 4.9
deb http://dk.archive.ubuntu.com/ubuntu/ xenial main
deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe
更新源:
sudo apt-get update
安装4.9版本:
sudo apt install gcc-4.9
sudo apt install g++-4.9
管理多版本gcc:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20
切换到4.9版本:
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
注意:切换完gcc的版本后需要重新运行之前命令
sh ./configure --with-target-bits=64 --with-jvm-variants=server --with-debug-level=slowdebug --disable-zip-debug-info --with-boot-jdk=/export/soft/java-se-7u75-ri/
再执行
make clean
bear make all
3.3、查看构建结果
以下都是在/home/parallels/workspace/openjdk/jdk-jdk8-b120目录下查找
jdk文件
build/linux-x86_64-normal-server-slowdebug/jdk 目录下就是构建的完成JDK,可以设置为JAVA_HOME作为java使用
执行一下命令可以验证下
./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -version
4、Clion中使用
步骤3构建完成后,在目录下有一个compile_commands.json文件,CLion导入工程需要这个文件。
4.1、导入工程:
选择之前生成的:compile_commands.json ,选择open as project
Clion 索引文件需要几分钟(我这里是虚拟机配置不高,需要6,7分钟左右)
4.2、生成Run Configurations and Build Targets
选择:File | Settings
第④步点击三个点
点击 "+"
再次点击 "+"
选择刚才创建的make 和 make clean
4.3、Custom Run/Debug configurations
4.4、打断点调试
找到arguments.cpp 如下位置打个断点,点击debug。
从图中还可以看出来,java.c是java的入口