ubuntu1604使用Clion调试openjdk8 作为java开发工程师,大家都知道源码中有很多naive方法,这些方法看不到源码,底层jdk源码使用c语言编写。Oracle Jdk是闭源的看不到源码,OpenJdk是Oracle Jdk的开源版本,据说,两者代码基本一致。因此本篇博客给大家介绍如何使用clion编译器调试openjdk源码。
整个过程还是遇到了各种各样的困难,为了使广大读者少走弯路,将编译通过的经验总结在这个帖子,希望大家多多指教。
为了能够更好的复现结果,防止因环境或者其他原因导致编译失败,先请大家一步一步跟着我的步骤执行。
所需软件 (可以自行在官网下载)
链接:https://pan.baidu.com/s/1ppPLww7cp32vCdFvchbTEg
提取码:35hc
安装虚机 1 2 对于window环境的读者可以安装虚拟,在虚机的环境下安装ubuntu1604系统。如果已经是ubuntu1604系统则忽 略此步骤。此步骤比较简单,请使用百度等搜索引擎自行安装。
供参考文章:安装VMware Workstation Pro v16
虚机中安装ubuntu1604 可以参考文章: VMware下安装ubuntu 16.04
1 2 虚拟已经安装好后,在虚机上安装ubuntu1604,这步也比较简单,可以使用百度等搜索引擎自行安装。也可按照如下 步骤进行安装。如果ubuntu1604已经安装好,可以跳过这一步。
配置ubuntu1604环境 切换国内源
1 由于ubuntu系统自带的软件安装源,安装比较慢,最好切换成国内源。本次采用阿里源。
可以参考文章: ubuntu切换国内源
1 sudo vi /etc/apt/sources.list
1 2 3 4 5 6 7 8 9 10 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进行保存
执行更新
安装vim
1 sudo apt-get install vim
1 sudo apt --fix-broken install
设置共享文件夹
1 可以看到默认mnt下是没有文件的,为了将window和ubuntu虚机之间文件共享,需要在Vmware虚机中设置一下。
可以参考文章: VMware:Ubuntu虚拟机/mnt/hgfs 下没有共享文件夹
设置虚机ubuntu1604和window共享文件夹的目录,点击下一步
1 2 sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,nonempty 执行完如果当前目录为/mnt,需要再次重新进入才会看到
编译openjdk 准备编译文件 1 2 3 4 5 6 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版本 1 2 可以看到openjdk-8u40需要gcc4.3,这是非常重要的一步,不少同学编译不通过很多都是编译器版本不对的问 题。本次安装使用4.4版本,亲测可以。
如果在同一个环境中安装多个gcc环境,可以参考: Ubuntu配置gcc版本
1 update-alternatives --help
1 2 sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt update
1 sudo apt install gcc-4.4 g++-4.4
查看当前gcc版本
1 2 gcc --version ll /usr/bin/gcc*
update-alternatives 命令的 --install
用来添加版本条目
使用 --display
显示条目下的版本信息
也可使用 --list
显示版本信息
可以使用 --set
设定命令的默认版本.
1 2 3 4 5 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
源码配置
1 2 cd /home/test /jdk/openjdkbash 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"
1 sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
1 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"
1 sudo apt-get install libcups2-dev
1 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"
再次安装依赖
1 sudo apt-get install libfreetype6-dev
1 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"
1 sudo apt-get install libasound2-dev
再次执行,发现可以执行成功,还是提示最好在安装一个软件
1 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"
1 sudo apt-get install ccache
1 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"
源码编译
1 DEBUG_BINARIES=true make all ZIP_DEBUGINFO_FILES=0 DISABLE_HOTSPOT_OS_VERSION_CHECK=ok
经过一段时间的编译后,执行成功,不同机器执行时间不同,请等待
进入jdk目录查看已经编译好的文件,执行java可以出现java版本,说明已经编译成功
Clion 调试openjdk 安装Clion
1 2 3 cd clion-2012.2.2cd bin/./clion.sh
使用bear重新编译openjdk 因为openjdk是make编译的,Clion对Cmake构建的项目比较友好,使用Make
构建的项目,CLion
仍然可以通过Compilation Database
来导入项目。因此使用bear工具生成Compilation Database。
1 sudo apt-get install bear
将原来编译好的openjdk重命名为openjdk2
1 2 3 cd openjdkbear 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插件
设置name为make
Program为make
Arguments为all
Workingdirectory为openjdk的根目录
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删除掉
内容如下
1 2 handle SIGSEGV pass noprint nostop handle SIGBUS pass noprint nostop
可以看到Clion执行命令成功,至此Clion debug openjdk结束
参考文章 参考文章1: 安装VMware Workstation Pro v16
参考文章2: VMware下安装ubuntu 16.04
参考文章3: Ubuntu 20.04换国内源 清华源 阿里源 中科大源 163源
参考文章4: VMware:Ubuntu虚拟机/mnt/hgfs 下没有共享文件夹
参考文章5:Linux 下使用 update-alternatives 管理gcc多版本命令
参考文章6:OpenJDK 编译调试指南(Ubuntu 16.04 + MacOS 10.15)
参考文章7: libx11-dev安装不上