centos7源码编译openjdk11,并使用Clion调试openjdk11源码
源码下载
1 | git clone https://github.com/openjdk/jdk.git |
切换到openjdk11分支
1 | git checkout jdk-11+24 |
执行验证
1 | git status |

编译工具安装
1 | sudo yum groupinstall "Development Tools" |
准备openjdk10作为N-1版本启动引导
https://jdk.java.net/archive/

解压

执行安装脚本
1 | bash configure --with-boot-jdk=/home/hou/jdk-10.0.1 |
提示报错1

checking for X11/extensions/shape.h… configure: error: Could not find all X11 headers (shape.h Xrender.h XTest.h Intrinsic.h). You might be able to fix this by running ‘sudo yum install libXtst-devel libXt-devel libXrender-devel libXi-devel’.
执行安装
1 | sudo yum install libXtst-devel libXt-devel libXrender-devel libXi-devel |
再次执行安装脚本
1 | bash configure --with-boot-jdk=/home/hou/jdk-10.0.1 |
提示报错2

checking cups/ppd.h presence… configure: error: Could not find cups! You might be able to fix this by running ‘sudo yum install cups-devel’.
执行安装
1 | sudo yum install cups-devel |
再次执行安装脚本
1 | bash configure --with-boot-jdk=/home/hou/jdk-10.0.1 |
提示报错3

configure: error: Could not find fontconfig! You might be able to fix this by running ‘sudo yum install fontconfig-devel’.
执行安装
1 | sudo yum install fontconfig-devel |
再次执行安装脚本
1 | bash configure --with-boot-jdk=/home/hou/jdk-10.0.1 |
提示报错4

configure: error: Could not find alsa! You might be able to fix this by running ‘sudo yum install alsa-lib-devel’.
执行安装
1 | sudo yum install alsa-lib-devel |
再次执行安装脚本
1 | bash configure --with-boot-jdk=/home/hou/jdk-10.0.1 |
提示构建成功

执行make,生成镜像
1 | make images |

创建成功

验证安装
1 | ./build/*/images/jdk/bin/java -version |

执行成功
启用调试模式
1 | bash configure --with-boot-jdk=/home/hou/jdk-10.0.1 --disable-warnings-as-errors --with-debug-level=slowdebug --with-jvm-variants=server |
1 | disable-warnings-as-errors选项是禁止把warning 当成error |
1 | make images |
编译成功

执行测试
1 | ./build/*/images/jdk/bin/java -version |

下载Clion导入源码项目
设置自定义编译目标

配置编译命令

配置clean命令

分别配置对应的选项

编辑配置

选中编译的java命令,并执行version

启动运行

启动调试
打断点在java.c上

执行调试

点击继续运行

可以看到运行成功

可以看到报错1

由于HotSpot JVM内部使用了SEGV等信号来实现一些功能(如NullPointerException、safepoints等),所以调试过程中,GDB可能会误报Signal: SIGSEGV (Segmentation fault). 解决办法是,在用户目录下创建.gdbinit,让GDB捕获SEGV等信号:
1 | vim ~/.gdbinit |
将以下内容追加到文件中并保存:
1 | handle SIGSEGV pass noprint nostop |
重新运行就没有相关报错了
