ubuntu1604使用Clion调试openjdk8
ubuntu1604使用Clion调试openjdk8
作为java开发工程师,大家都知道源码中有很多naive方法,这些方法看不到源码,底层jdk源码使用c语言编写。Oracle Jdk是闭源的看不到源码,OpenJdk是Oracle Jdk的开源版本,据说,两者代码基本一致。因此本篇博客给大家介绍如何使用clion编译器调试openjdk源码。
整个过程还是遇到了各种各样的困难,为了使广大读者少走弯路,将编译通过的经验总结在这个帖子,希望大家多多指教。
为了能够更好的复现结果,防止因环境或者其他原因导致编译失败,先请大家一步一步跟着我的步骤执行。
所需软件(可以自行在官网下载)
链接:https://pan.baidu.com/s/1ppPLww7cp32vCdFvchbTEg
提取码:35hc
安装虚机
对于window环境的读者可以安装虚拟,在虚机的环境下安装ubuntu1604系统。如果已经是ubuntu1604系统则忽
略此步骤。此步骤比较简单,请使用百度等搜索引擎自行安装。
供参考文章:安装VMware Workstation Pro v16
虚机中安装ubuntu1604
可以参考文章: VMware下安装ubuntu 16.04
虚拟已经安装好后,在虚机上安装ubuntu1604,这步也比较简单,可以使用百度等搜索引擎自行安装。也可按照如下
步骤进行安装。如果ubuntu1604已经安装好,可以跳过这一步。
- 点击创建新的虚拟机
- 点击下一步
- 选择ubuntu1604的镜像,并点击下一步
- 设置全名、用户名、密码
- 设置虚拟机名称,镜像存储位置
- 设置最大磁盘大小(至少20G),点击下一步
- 点击完成
- ubuntu1604镜像在加载中
- 输入密码进行登录
配置ubuntu1604环境
切换国内源
- 鼠标右键打开终端
由于ubuntu系统自带的软件安装源,安装比较慢,最好切换成国内源。本次采用阿里源。
可以参考文章: ubuntu切换国内源
- 更新ubuntu1604镜像
sudo vi /etc/apt/sources.list
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
-
输入:wq进行保存
-
执行更新
sudo apt-get update
- 软件升级
sudo apt-get upgrade
安装vim
- 为了编辑文件方便,安装vim
sudo apt-get install vim
- 如果出现依赖问题可以执行下面命令
sudo apt --fix-broken install
设置共享文件夹
ll /mnt
可以看到默认mnt下是没有文件的,为了将window和ubuntu虚机之间文件共享,需要在Vmware虚机中设置一下。
可以参考文章: VMware:Ubuntu虚拟机/mnt/hgfs 下没有共享文件夹
- 点击虚拟机,然后点击设置
- 选项中点击共享文件夹,设置成总是启用,点击确定
- 点击下一步
- 设置虚机ubuntu1604和window共享文件夹的目录,点击下一步
- 点击完成
- 点击确定
- 执行下面命令,可以看到/mnt下出现了共享文件夹
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,nonempty
执行完如果当前目录为/mnt,需要再次重新进入才会看到
- 可以看到共享文件夹下有需要编译需要的文件
编译openjdk
准备编译文件
mkdir /home/test/jdk
cp jdk-7u80-linux-x64.tar.gz /home/test/jdk/
cp openjdk-8u40-src-b25-10_feb_2015.zip /home/test/jdk/
cd /home/test/jdk/
tar -xzvf jdk-7u80-linux-x64.tar.gz
unzip openjdk-8u40-src-b25-10_feb_2015.zip
切换ubuntu1604 gcc版本
可以看到openjdk-8u40需要gcc4.3,这是非常重要的一步,不少同学编译不通过很多都是编译器版本不对的问
题。本次安装使用4.4版本,亲测可以。
如果在同一个环境中安装多个gcc环境,可以参考: Ubuntu配置gcc版本
- 查看命令帮助
update-alternatives --help
- 添加软件源
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
- 安装 4.4 版本的 gcc 和 g++
sudo apt install gcc-4.4 g++-4.4
查看当前gcc版本
gcc --version
ll /usr/bin/gcc*
- update-alternatives 命令的
--install
用来添加版本条目 - 使用
--display
显示条目下的版本信息 - 也可使用
--list
显示版本信息 - 可以使用
--set
设定命令的默认版本.
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 44
sudo update-alternatives --display gcc
sudo update-alternatives --list gcc
sudo update-alternatives --set gcc /usr/bin/gcc-4.4
gcc --version
源码配置
- 源码配置
cd /home/test/jdk/openjdk
bash configure --with-target-bits=64 --with-boot-jdk=/home/test/jdk/jdk1.7.0_80 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0 --with-extra-cxxflags="-Wno-error" --with-extra-cflags="-Wno-error"
- 执行命令后提示缺少依赖,进行安装
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
- 注意libX11-dev中的X应该为小写的x
可以参考文章:libx11-dev安装不上
- 修改后可以安装
- 再次执行,出现提示缺少依赖
bash configure --with-target-bits=64 --with-boot-jdk=/home/test/jdk/jdk1.7.0_80 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0 --with-extra-cxxflags="-Wno-error" --with-extra-cflags="-Wno-error"
- 接着安装
sudo apt-get install libcups2-dev
- 再次执行,还是提示缺依赖
bash configure --with-target-bits=64 --with-boot-jdk=/home/test/jdk/jdk1.7.0_80 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0 --with-extra-cxxflags="-Wno-error" --with-extra-cflags="-Wno-error"
-
再次安装依赖
sudo apt-get install libfreetype6-dev
- 再次执行,还是提示缺依赖
bash configure --with-target-bits=64 --with-boot-jdk=/home/test/jdk/jdk1.7.0_80 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0 --with-extra-cxxflags="-Wno-error" --with-extra-cflags="-Wno-error"
- 再次安装
sudo apt-get install libasound2-dev
- 再次执行,发现可以执行成功,还是提示最好在安装一个软件
bash configure --with-target-bits=64 --with-boot-jdk=/home/test/jdk/jdk1.7.0_80 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0 --with-extra-cxxflags="-Wno-error" --with-extra-cflags="-Wno-error"
- 再次执行安装
sudo apt-get install ccache
- 再次执行发现已经没有任何错误提示了
bash configure --with-target-bits=64 --with-boot-jdk=/home/test/jdk/jdk1.7.0_80 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0 --with-extra-cxxflags="-Wno-error" --with-extra-cflags="-Wno-error"
源码编译
- 执行编译命令
DEBUG_BINARIES=true make all ZIP_DEBUGINFO_FILES=0 DISABLE_HOTSPOT_OS_VERSION_CHECK=ok
- 经过一段时间的编译后,执行成功,不同机器执行时间不同,请等待
- build为编译目录
- 进入debug目录
- 进入jdk目录查看已经编译好的文件,执行java可以出现java版本,说明已经编译成功
Clion 调试openjdk
安装Clion
- 解压Clion
- 运行clion.sh
cd clion-2012.2.2
cd bin/
./clion.sh
- 点击同意,并继续
- 点击不发送
- 点击试用免费
- 点击继续
- 可以看到Clion已经安装好
使用bear重新编译openjdk
因为openjdk是make编译的,Clion对Cmake构建的项目比较友好,使用Make
构建的项目,CLion
仍然可以通过Compilation Database
来导入项目。因此使用bear工具生成Compilation Database。
- 安装bear
sudo apt-get install bear
- 将原来编译好的openjdk重命名为openjdk2
- 再次解压,出现openjdk目录
-
一定要使用重新解压后的openjdk,使用bear重新编译openjdk
注意一定要重新编译,否则compile_commands.json将不会有内容。
cd openjdk
bear make all
DEBUG_BINARIES=true bear make all ZIP_DEBUGINFO_FILES=0 DISABLE_HOTSPOT_OS_VERSION_CHECK=ok
- 构建成功
- compile_commands.json已经有内容
使用Clion调试openjdk
- 使用Clion打开compile_commands.json
- 作为一个工程打开
- 等待项目加载成功
- 如果希望动态编译openjdk需要下载File Watches插件
- 点击设置
- 编辑编译目标,点击添加
- 命名为debug,点击Build后面的三个点
- 设置name为make
- Program为make
- Arguments为all
- Workingdirectory为openjdk的根目录
- 点击clean后面的三个点
- name为make clean
- Program为make
- Argments为clean
- Working directory为openjdk根目录
- Toolchain设置为Default
- Build为make
- clean为make clean
- 点击添加配置,点击添加
- 点击编译应用
- Target设置为刚才设置的debug
- Executable设置为编译openjdk中的bin目录下的java
- Program directory设置为-version,以作测试
- 为了防止项目每次启动都build,先将Build删除掉
- Build已经删除掉
-
执行debug按钮显示段错误
如果使用的调试器是
gdb
(Ubuntu
下默认),调试的时候可能会发现gdb
报错:Signal: SIGSEGV (Segmentation fault)
。
- 解决办法是,在用户家目录创建
.gdbinit
内容如下
handle SIGSEGV pass noprint nostop
handle SIGBUS pass noprint nostop
- 可以看到Clion执行命令成功,至此Clion debug openjdk结束
参考文章
参考文章1: 安装VMware Workstation Pro v16
参考文章3: Ubuntu 20.04换国内源 清华源 阿里源 中科大源 163源
参考文章4: VMware:Ubuntu虚拟机/mnt/hgfs 下没有共享文件夹
参考文章5:Linux 下使用 update-alternatives 管理gcc多版本命令