背景
了解 JDK 中 Native 方法执行的底层实现机制
剖析 JVM 层面的内存申请计算逻辑
最近遇到的垃圾回收相关的问题底层设计策略
环境
芯片: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 版本:
编译环境依赖项
Boot JDK
启动 jdk 版本一般为当前编译的 jdk 版本的同版本或者小一个版本号,如:jdk17 或者 jdk16
免费 jdk 选择渠道
AdoptOpenJDK (https://adoptium.net/)
openJDK (https://hg.openjdk.org/)
Zulu OpenJDK (https://www.azul.com)
本次选择版本 AdoptOpenJDK-Temurin-17.0.8.1
Toolchain
Xcode
安装方式,通过 app store 下载安装
安装后版本查看版本
xcode-select --version
#xcode-select version 2396
复制代码
freetype
#查看 freetype 的版本列表
brew search freetype
#安装特定的版本
brew install freetype@<version>
#选择版本 2.13.2
brew install freetype@2.13.2
复制代码
gcc
#查看 gcc 的版本列表
brew search gcc
#安装特定的版本
brew install gcc@<version>
#选择版本 13.2.0
brew install gcc@2.13.2
复制代码
autoconf
#查看 gcc 的版本列表
brew search autoconf
#安装特定的版本
brew install autoconf@<version>
#选择版本 2.71
brew install autoconf@2.71
复制代码
待编译的 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 clean
chomd -R 777 ./*
sudo make images
复制代码
生成 compile-commands 用于导入到 CLion
make CONF=macosx-aarch64-server-slowdebug compile-commands
复制代码
调试
工具选择
可以选择 CLion 或者 VSCode 工具
版本的选择
版本选择不对,毁终身,就是因为原来是 22 版本导致调试断点就是进不去源码,最后换了 CLion 版本就好了
CLion 导入源码
导入
File -> Open -> /Users/salk/code/c_proj/opensource/jdk17u-dev-master/build/macosx-aarch64-server-slowdebug/compile_commands.json -> Open as Project
Change Project Root 添加源码
执行上图中的 Reload Makefile Project
配置
Custom Build Targets 设置
make 设置
clean 设置
Custom Build Application 设置
调试
基本命令调试
远程调试
异常处理
如果进入 LLDB 断点,可以在 LLDB 命令行中输入 pro hand -p true -s false SIGILL SIGSEGV SIGBUS
VSCode 导入源码
直接打开项目路径
安装插件
3.配置 Debug 参数
执行断点调试
远程调试
实际项目大部分还在使用 jdk8 ,开发环境系统无法进行低版本 jdk 版本编译调试,所以选择了远程调试的方案调试 jdk8 的 jdk 源码
环境准备
系统版本:CentOS Linux release 8.5.2111
JDK 源码版本:jdk8u (http://hg.openjdk.java.net/jdk8u/jdk8u)
依赖安装
#安装 mercurial或者hg
yum install hg -y
yum install mercurial -y
# 下载源码
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u /opt/jdk8u
#更新代码
hg pull
cd /opt/jdk8u/
# 执行脚本 ,这一步比较慢,有时候会会有网络超时,可以写个sh脚本多次执行
sh get_source.sh
复制代码
配置编译环境
#安装jdk7
wget https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
tar -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-devel
yum 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 gdb
yum install -y gcc gcc-c++ make wget
#安装 cmake,yum源安装的版本较低
cd /opt/
wget https://cmake.org/files/v3.14/cmake-3.14.5.tar.gz
tar -zxf cmake-3.14.5.tar.gz
cd cmake-3.14.5
./bootstrap && make && make install
ln -s /usr/local/bin/cmake /usr/bin/cmake
cmake -version
复制代码
安装 gdb
# 安装 gdb
# 这里可以找到 gdb 镜像站点 https://www.gnu.org/software/gdb/download/
# 这里下载 texinfo 新版本 http://ftp.gnu.org/gnu/texinfo/
yum install -y texinfo
cd /opt/
wget https://mirrors.ustc.edu.cn/gnu/gdb/gdb-8.2.1.tar.gz
tar -zxf gdb-8.2.1.tar.gz
cd gdb-8.2.1
# 默认安装在 /usr/local/share/,可执行文件在 /usr/local/bin/
./configure && make && make install
ln -s /usr/local/bin/gdb /usr/bin/gdb
gdb -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
复制代码
本地设置
这一步等待时间比较长可能是几分钟到十几分钟不等,不要终止!!!!
本地断点调试
评论