写点什么

不同版本 OpenJDK 源码调试方案

作者:BeyondLife
  • 2023-10-30
    江苏
  • 本文字数:2512 字

    阅读完需:约 8 分钟

不同版本OpenJDK 源码调试方案

背景

  1. 了解 JDK 中 Native 方法执行的底层实现机制

  2. 剖析 JVM 层面的内存申请计算逻辑

  3. 最近遇到的垃圾回收相关的问题底层设计策略

环境

芯片:Apple M2 Pro

系统:macOS 13.2.1

内存:32G

内核:Darwin Kernel Version 22.3.0

硬件架构:macOS_aarch64

JDK 版本的选择

不同版本的 jdk 支持编译的平台和依赖工具版本https://wiki.openjdk.org/display/Build/Supported+Build+Platforms在当前环境上我们最终选择的 JDK 版本:


编译环境依赖项

  1. Boot JDK

  2. 启动 jdk 版本一般为当前编译的 jdk 版本的同版本或者小一个版本号,如:jdk17 或者 jdk16

  3. 免费 jdk 选择渠道

  4. AdoptOpenJDK (https://adoptium.net/

  5. openJDK (https://hg.openjdk.org/)

  6. Zulu OpenJDK (https://www.azul.com

  7. 本次选择版本 AdoptOpenJDK-Temurin-17.0.8.1

  8. Toolchain

  9. Xcode

  10. 安装方式,通过 app store 下载安装

  11. 安装后版本查看版本


xcode-select --version#xcode-select version 2396
复制代码


  1. freetype


#查看 freetype 的版本列表brew search freetype
#安装特定的版本brew install freetype@<version>
#选择版本 2.13.2brew install freetype@2.13.2
复制代码


  1. gcc


#查看 gcc 的版本列表brew search gcc#安装特定的版本brew install gcc@<version>
#选择版本 13.2.0brew install gcc@2.13.2
复制代码


  1. autoconf


#查看 gcc 的版本列表brew search autoconf#安装特定的版本brew install autoconf@<version>
#选择版本 2.71brew install autoconf@2.71
复制代码


  1. 待编译的 JDK 源码下载


https://github.com/openjdk/jdk17u-dev
复制代码

实践

编译

configure 生成构建系统配置的脚本或命令

bash configure --disable-warnings-as-errors --with-debug-level=slowdebug --with-jvm-variants=server# disable-warnings-as-errors选项是禁止把warning 当成error# --with-debug-level=slowdebug。用来设置编译的级别,可选值为release、fastdebug、slowde-bug,越往后进行的优化措施就越少,带的调试信息就越多。#默认值为release。slowdebug 含有最丰富的调试信息,没有这些信息,很多执行可能被优化掉,我们单步执行时,可能看不到一些变量的值。所以最好指定slowdebug 为编译级别。# with-jvm-variants 编译特定模式的HotSpot虚拟机,可选值:server、client、minimal、core、zero、custom
复制代码


make 构建

sudo make cleanchomd -R 777 ./*sudo make images
复制代码


生成 compile-commands 用于导入到 CLion

make CONF=macosx-aarch64-server-slowdebug compile-commands
复制代码


调试

工具选择

可以选择 CLion 或者 VSCode 工具

版本的选择

版本选择不对,毁终身,就是因为原来是 22 版本导致调试断点就是进不去源码,最后换了 CLion 版本就好了


  • CLion 2022.2.5



  • CLion 2023.2.2


CLion 导入源码

导入

  1. File -> Open -> /Users/salk/code/c_proj/opensource/jdk17u-dev-master/build/macosx-aarch64-server-slowdebug/compile_commands.json -> Open as Project

  2. Change Project Root 添加源码



  1. 执行上图中的 Reload Makefile Project

配置

  1. Custom Build Targets 设置

  2. make 设置



  1. clean 设置



  1. Custom Build Application 设置



调试

基本命令调试


远程调试




异常处理



如果进入 LLDB 断点,可以在 LLDB 命令行中输入 pro hand -p true -s false SIGILL SIGSEGV SIGBUS

VSCode 导入源码

  1. 直接打开项目路径


  1. 安装插件


3.配置 Debug 参数



  1. 执行断点调试


远程调试

实际项目大部分还在使用 jdk8 ,开发环境系统无法进行低版本 jdk 版本编译调试,所以选择了远程调试的方案调试 jdk8 的 jdk 源码

环境准备

系统版本:CentOS Linux release 8.5.2111

JDK 源码版本:jdk8u (http://hg.openjdk.java.net/jdk8u/jdk8u

依赖安装

#安装 mercurial或者hgyum install hg -yyum install mercurial -y
# 下载源码hg clone http://hg.openjdk.java.net/jdk8u/jdk8u /opt/jdk8u
#更新代码hg pullcd /opt/jdk8u/# 执行脚本 ,这一步比较慢,有时候会会有网络超时,可以写个sh脚本多次执行sh get_source.sh

复制代码


配置编译环境

#安装jdk7wget https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.htmltar -zxf jdk-7u80-linux-x64.tar.gz -C /opt/
# 安装编译所需工具包yum install -y unzip zip libXtst-devel libXt-devel libXrender-devel cups-devel freetype-devel alsa-lib-devel fontconfig-develyum groupinstall -y "Development Tools"#执行编译cd /opt/jdk8u/chmod +x configure./configure --with-boot-jdk=/opt/jdk1.7.0_80/


复制代码


编译

make all ZIP_DEBUGINFO_FILES=0 ENABLE_FULL_DEBUG_SYMBOLS=1
复制代码


测试

cd /opt/jdk8u/build/linux-x86_64-normal-server-release/jdk/bin./java -version
复制代码


远程调试服务端设置

安装 cmake
#备份mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup#更新镜像源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo

yum remove -y cmake gdbyum install -y gcc gcc-c++ make wget
#安装 cmake,yum源安装的版本较低cd /opt/wget https://cmake.org/files/v3.14/cmake-3.14.5.tar.gztar -zxf cmake-3.14.5.tar.gzcd cmake-3.14.5./bootstrap && make && make installln -s /usr/local/bin/cmake /usr/bin/cmakecmake -version
复制代码


安装 gdb
# 安装 gdb# 这里可以找到 gdb 镜像站点 https://www.gnu.org/software/gdb/download/# 这里下载 texinfo 新版本 http://ftp.gnu.org/gnu/texinfo/yum install -y texinfocd /opt/wget https://mirrors.ustc.edu.cn/gnu/gdb/gdb-8.2.1.tar.gztar -zxf gdb-8.2.1.tar.gzcd gdb-8.2.1# 默认安装在 /usr/local/share/,可执行文件在 /usr/local/bin/./configure && make && make installln -s /usr/local/bin/gdb /usr/bin/gdbgdb -ver
复制代码


本地调试工具设置

本例次用 CLion 开发工具(版本:2023.2.2)

创建一个空的项目

导入服务器上的 jdk 源码

设置远程调试





调试

服务端执行

gdbserver :1234 /opt/jdk8u/build/linux-x86_64-normal-server-release/jdk/bin/java -jar ./demo-0.0.1-SNAPSHOT.jar
复制代码


本地设置


这一步等待时间比较长可能是几分钟到十几分钟不等,不要终止!!!!

本地断点调试


发布于: 刚刚阅读数: 5
用户头像

BeyondLife

关注

还未添加个人签名 2018-05-03 加入

十年开发老兵,多年搜索及推荐领域技术和业务积累目前主要研究低代码平台设计及开发模式,关注三高架构设计方案及系统实现,微服务治理实践及DDD领域驱动设计方案,目前致力于研究低代码平台的最佳实践方案

评论

发布
暂无评论
不同版本OpenJDK 源码调试方案_Openjdk_BeyondLife_InfoQ写作社区