栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ubuntu1604使用Clion调试openjdk8

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ubuntu1604使用Clion调试openjdk8

ubuntu1604使用Clion调试openjdk8
  • ubuntu1604使用Clion调试openjdk8
  • **安装虚机**
  • **虚机中安装ubuntu1604**
  • **配置ubuntu1604环境**
    • 切换国内源
    • 安装vim
    • 设置共享文件夹
  • **编译openjdk**
    • 准备编译文件
    • 切换ubuntu1604 gcc版本
    • 源码配置
    • 源码编译
  • **Clion 调试openjdk**
    • 安装Clion
    • 使用bear重新编译openjdk
    • 使用Clion调试openjdk
  • **参考文章**

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/690861.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号