0%

ubuntu1604-clion-debug-openjdk8

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已经安装好,可以跳过这一步。
  • 点击创建新的虚拟机

image-20211227202359890

  • 点击下一步

image-20211227202442187

  • 选择ubuntu1604的镜像,并点击下一步

image-20211227202526745

  • 设置全名、用户名、密码

image-20211227202618998

  • 设置虚拟机名称,镜像存储位置

image-20211227202745836

  • 设置最大磁盘大小(至少20G),点击下一步

image-20211227202801304

  • 点击完成

image-20211227202814295

  • ubuntu1604镜像在加载中

image-20211227202848291

image-20211227202904355

image-20211227202925687

  • 输入密码进行登录

image-20211227203713974

image-20211227204147187

配置ubuntu1604环境

切换国内源

  • 鼠标右键打开终端

image-20211227204546225

1
由于ubuntu系统自带的软件安装源,安装比较慢,最好切换成国内源。本次采用阿里源。

可以参考文章: ubuntu切换国内源

  • 更新ubuntu1604镜像
1
sudo vi /etc/apt/sources.list

image-20211227204903004

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

image-20211227204749703

  • 输入:wq进行保存
    image-20211227204819017

  • 执行更新

1
sudo apt-get update

image-20211227205018925

  • 软件升级
1
sudo apt-get upgrade

image-20211227205133847

安装vim

  • 为了编辑文件方便,安装vim
1
sudo apt-get install vim

image-20211228212037629

  • 如果出现依赖问题可以执行下面命令
1
sudo apt --fix-broken install

image-20211228212055082

image-20211227205410842

image-20211227205532078

设置共享文件夹

1
ll /mnt

image-20211227210001930

1
可以看到默认mnt下是没有文件的,为了将window和ubuntu虚机之间文件共享,需要在Vmware虚机中设置一下。

可以参考文章: VMware:Ubuntu虚拟机/mnt/hgfs 下没有共享文件夹

  • 点击虚拟机,然后点击设置

img

  • 选项中点击共享文件夹,设置成总是启用,点击确定

image-20211227210407943

  • 点击下一步

image-20211227210424088

  • 设置虚机ubuntu1604和window共享文件夹的目录,点击下一步

image-20211227210454464

  • 点击完成

image-20211227210518672

  • 点击确定

image-20211227210533893

  • 执行下面命令,可以看到/mnt下出现了共享文件夹
1
2
sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,nonempty 
执行完如果当前目录为/mnt,需要再次重新进入才会看到

image-20211227210817962

  • 可以看到共享文件夹下有需要编译需要的文件

image-20211229222248705

编译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

image-20211227212608712

image-20211227212701781

image-20211227212749805

切换ubuntu1604 gcc版本

1
2
可以看到openjdk-8u40需要gcc4.3,这是非常重要的一步,不少同学编译不通过很多都是编译器版本不对的问
题。本次安装使用4.4版本,亲测可以。

如果在同一个环境中安装多个gcc环境,可以参考: Ubuntu配置gcc版本

image-20211228222328920

  • 查看命令帮助
1
update-alternatives --help

image-20211227215543616

  • 添加软件源
1
2
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update

image-20211227215702442

image-20211227215730080

  • 安装 4.4 版本的 gcc 和 g++
1
sudo apt install gcc-4.4 g++-4.4

image-20211227215957698

查看当前gcc版本

1
2
gcc --version
ll /usr/bin/gcc*

image-20211227220025161

image-20211227220101632

  • 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

image-20211227220245477

源码配置

  • 源码配置
1
2
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"

image-20211227220515625

  • 执行命令后提示缺少依赖,进行安装

image-20211227220849932

1
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev

image-20211227221131708

  • 修改后可以安装

image-20211227223717497

  • 再次执行,出现提示缺少依赖
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"

image-20211227224236785

  • 接着安装
1
sudo apt-get install libcups2-dev

image-20211228215228696

  • 再次执行,还是提示缺依赖
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"

image-20211228215000632

  • 再次安装依赖

    1
    sudo apt-get install libfreetype6-dev

image-20211228215154324

  • 再次执行,还是提示缺依赖
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

image-20211228215336863

  • 再次执行,发现可以执行成功,还是提示最好在安装一个软件
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"

image-20211228215411204

  • 再次执行安装
1
sudo apt-get install ccache

image-20211228215448693

  • 再次执行发现已经没有任何错误提示了
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"

image-20211228215513329

源码编译

  • 执行编译命令
1
DEBUG_BINARIES=true make all ZIP_DEBUGINFO_FILES=0 DISABLE_HOTSPOT_OS_VERSION_CHECK=ok

image-20211228215852638

  • 经过一段时间的编译后,执行成功,不同机器执行时间不同,请等待

image-20211228222113018

  • build为编译目录

image-20211228225710144

  • 进入debug目录

image-20211228225826819

  • 进入jdk目录查看已经编译好的文件,执行java可以出现java版本,说明已经编译成功

image-20211228225925901

Clion 调试openjdk

安装Clion

  • 解压Clion

image-20211229194507047

image-20211229194548956

  • 运行clion.sh
1
2
3
cd clion-2012.2.2
cd bin/
./clion.sh

image-20211229194733842

  • 点击同意,并继续

image-20211229194753316

  • 点击不发送

image-20211229194808340

  • 点击试用免费

image-20211229194843978

  • 点击继续

image-20211229194915289

  • 可以看到Clion已经安装好

image-20211229194935073

使用bear重新编译openjdk

  因为openjdk是make编译的,Clion对Cmake构建的项目比较友好,使用Make构建的项目,CLion仍然可以通过Compilation Database来导入项目。因此使用bear工具生成Compilation Database。

  • 安装bear
1
sudo apt-get install bear

image-20211229200250917

  • 将原来编译好的openjdk重命名为openjdk2

image-20211230214254096

  • 再次解压,出现openjdk目录

image-20211230214103437

  • 一定要使用重新解压后的openjdk,使用bear重新编译openjdk

    注意一定要重新编译,否则compile_commands.json将不会有内容。

1
2
3
cd openjdk
bear make all
DEBUG_BINARIES=true bear make all ZIP_DEBUGINFO_FILES=0 DISABLE_HOTSPOT_OS_VERSION_CHECK=ok

image-20211230214329853

  • 构建成功

image-20211229202451273

  • compile_commands.json已经有内容

image-20211230203612822

使用Clion调试openjdk

  • 使用Clion打开compile_commands.json

image-20211229202705072

image-20211229202734461

  • 作为一个工程打开

image-20211229202752759

  • 等待项目加载成功

image-20211229203946249

  • 如果希望动态编译openjdk需要下载File Watches插件

image-20211229204038625

  • 点击设置

image-20211229204242358

  • 编辑编译目标,点击添加

image-20211229204444086

  • 命名为debug,点击Build后面的三个点

image-20220102160222878

  • 设置name为make
  • Program为make
  • Arguments为all
  • Workingdirectory为openjdk的根目录

image-20211229204731788

  • 点击clean后面的三个点

image-20220102160259332

  • name为make clean
  • Program为make
  • Argments为clean
  • Working directory为openjdk根目录

image-20211229204821163

  • Toolchain设置为Default
  • Build为make
  • clean为make clean

image-20211229204929912

  • 点击添加配置,点击添加

image-20211229205018081

  • 点击编译应用

image-20211229205045626

  • Target设置为刚才设置的debug
  • Executable设置为编译openjdk中的bin目录下的java
  • Program directory设置为-version,以作测试
  • 为了防止项目每次启动都build,先将Build删除掉

image-20211229205228474

  • Build已经删除掉

image-20211229205241947

  • 执行debug按钮显示段错误

    如果使用的调试器是gdbUbuntu下默认),调试的时候可能会发现gdb报错:Signal: SIGSEGV (Segmentation fault)

image-20211229205356282

  • 解决办法是,在用户家目录创建.gdbinit

image-20211229205511600

内容如下

1
2
handle SIGSEGV pass noprint nostop 
handle SIGBUS pass noprint nostop

image-20211229205535245

  • 可以看到Clion执行命令成功,至此Clion debug openjdk结束

image-20211229205627237

参考文章

参考文章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安装不上