ubuntu1604使用Clion调试openjdk8
作为java开发工程师,大家都知道源码中有很多naive方法,这些方法看不到源码,底层jdk源码使用c语言编写。Oracle Jdk是闭源的看不到源码,OpenJdk是Oracle Jdk的开源版本,据说,两者代码基本一致。因此本篇博客给大家介绍如何使用clion编译器调试openjdk源码。
整个过程还是遇到了各种各样的困难,为了使广大读者少走弯路,将编译通过的经验总结在这个帖子,希望大家多多指教。
为了能够更好的复现结果,防止因环境或者其他原因导致编译失败,先请大家一步一步跟着我的步骤执行。
所需软件(可以自行在官网下载)
链接:https://pan.baidu.com/s/1ppPLww7cp32vCdFvchbTEg
提取码:35hc
安装虚机
1 | 对于window环境的读者可以安装虚拟,在虚机的环境下安装ubuntu1604系统。如果已经是ubuntu1604系统则忽 |
供参考文章:安装VMware Workstation Pro v16
虚机中安装ubuntu1604
可以参考文章: VMware下安装ubuntu 16.04
1 | 虚拟已经安装好后,在虚机上安装ubuntu1604,这步也比较简单,可以使用百度等搜索引擎自行安装。也可按照如下 |
- 点击创建新的虚拟机

- 点击下一步

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

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

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

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

- 点击完成

- ubuntu1604镜像在加载中



- 输入密码进行登录


配置ubuntu1604环境
切换国内源
- 鼠标右键打开终端

1 | 由于ubuntu系统自带的软件安装源,安装比较慢,最好切换成国内源。本次采用阿里源。 |
可以参考文章: ubuntu切换国内源
- 更新ubuntu1604镜像
1 | sudo vi /etc/apt/sources.list |

1 | deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse |

输入:wq进行保存

执行更新
1 | sudo apt-get update |

- 软件升级
1 | sudo apt-get upgrade |

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

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



设置共享文件夹
1 | ll /mnt |

1 | 可以看到默认mnt下是没有文件的,为了将window和ubuntu虚机之间文件共享,需要在Vmware虚机中设置一下。 |
可以参考文章: VMware:Ubuntu虚拟机/mnt/hgfs 下没有共享文件夹
- 点击虚拟机,然后点击设置

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

- 点击下一步

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

- 点击完成

- 点击确定

- 执行下面命令,可以看到/mnt下出现了共享文件夹
1 | sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other,nonempty |

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

编译openjdk
准备编译文件
1 | mkdir /home/test/jdk |



切换ubuntu1604 gcc版本
1 | 可以看到openjdk-8u40需要gcc4.3,这是非常重要的一步,不少同学编译不通过很多都是编译器版本不对的问 |
如果在同一个环境中安装多个gcc环境,可以参考: Ubuntu配置gcc版本

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

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


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

查看当前gcc版本
1 | gcc --version |


- update-alternatives 命令的
--install用来添加版本条目 - 使用
--display显示条目下的版本信息 - 也可使用
--list显示版本信息 - 可以使用
--set设定命令的默认版本.
1 | sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 44 |

源码配置
- 源码配置
1 | cd /home/test/jdk/openjdk |

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

1 | sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev |
- 注意libX11-dev中的X应该为小写的x
可以参考文章:libx11-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 |

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

- build为编译目录

- 进入debug目录

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

Clion 调试openjdk
安装Clion
- 解压Clion


- 运行clion.sh
1 | cd clion-2012.2.2 |

- 点击同意,并继续

- 点击不发送

- 点击试用免费
- 点击继续

- 可以看到Clion已经安装好

使用bear重新编译openjdk
因为openjdk是make编译的,Clion对Cmake构建的项目比较友好,使用Make构建的项目,CLion仍然可以通过Compilation Database来导入项目。因此使用bear工具生成Compilation Database。
- 安装bear
1 | sudo apt-get install bear |

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

- 再次解压,出现openjdk目录

一定要使用重新解压后的openjdk,使用bear重新编译openjdk
注意一定要重新编译,否则compile_commands.json将不会有内容。
1 | cd openjdk |

- 构建成功

- 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

内容如下
1 | handle SIGSEGV 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多版本命令