系统相关
首页 > 系统相关> > Ubuntu快速搭建单步调试openjdk环境

Ubuntu快速搭建单步调试openjdk环境

作者:互联网

版本
操作系统 Ubuntu 20.04.2 LTS
编译的jdk jdk8
boot jdk jdk7
看源码的工具 Clion

安装引导 JDK。 所有 OpenJDK 构建都需要访问以前发布的 JDK,称为引导 JDK。 一般规则是引导 JDK 必须是 JDK 先前主要版本的实例。
比如,构建JDK 8需要使用更新为7或更高版本的JDK 7版本。
JDK 8开发人员不应使用JDK 8作为引导JDK,以确保使用JDK 7构建的系统部分不会引入JDK 8依赖项。

摘自 http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html#setup

一、准备源码环境一条龙

1.1 下载要编译的源码

git clone https://github.com/AdoptOpenJDK/openjdk-jdk8u

如果 GitHub 下载太慢也可以选择 Gitee 镜像,我把 openjdk 源码放在 ~/CLionProjects 文件夹下:

geekziyu@geekziyu-ubuntu-1:~$ cd ~/CLionProjects
geekziyu@geekziyu-ubuntu-1:~/CLionProjects$ git clone -b jdk8-b120 https://gitee.com/mirrors/openjdk.git

1.2 下载和解压jdk7

我选择把 jdk 安装在 /opt/lib/jdk 文件夹,你可以选择直接安装在 ~ 即用户文件夹下。

geekziyu@geekziyu-ubuntu-1:~$ cd /opt/lib/jdk
geekziyu@geekziyu-ubuntu-1:/opt/lib/jdk$ sudo wget https://repo.huaweicloud.com/java/jdk/7u80-b15/jdk-7u80-linux-x64.tar.gz
geekziyu@geekziyu-ubuntu-1:/opt/lib/jdk$ sudo tar -zxvf jdk-7u80-linux-x64.tar.gz
geekziyu@geekziyu-ubuntu-1:/opt/lib/jdk$ sudo mv jdk1.7.0_80/ jdk7/

1.3 配置环境变量

geekziyu@geekziyu-ubuntu-1:~$ vim ~/.bashrc

在文件末尾追加以下内容:

export JAVA_HOME=/opt/lib/jdk/jdk7
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH

保存并退出,然后执行:
geekziyu@geekziyu-ubuntu-1:~$ source ~/.bashrc

1.4 安装依赖

geekziyu@geekziyu-ubuntu-1:~$ sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfreetype6-dev libasound2-dev ccache

编译的时候需要用到

1.5 configure & make

geekziyu@geekziyu-ubuntu-1:~$ cd ~/CLionProjects/openjdk

geekziyu@geekziyu-ubuntu-1:~/CLionProjects/openjdk$ ls -al | grep configure
-rw-r--r-- 1 csdn sudo 1235 8月 12 09:05 configure

因为,默认情况下configure不是可执行文件,执行命令为文件所有者增加可执行权限
geekziyu@geekziyu-ubuntu-1:~/CLionProjects/openjdk$ chmod u+x configure

geekziyu@geekziyu-ubuntu-1:~/CLionProjects/openjdk$ ls -al | grep configure
-rwxr--r-- 1 csdn sudo 1235 8月 12 09:05 configure

geekziyu@geekziyu-ubuntu-1:~/CLionProjects/openjdk$ sudo ./configure --with-target-bits=64 --with-boot-jdk=/opt/lib/jdk/jdk7 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0

看到以下这个画面就证明配置成功了,就可以编译了。如果不是,就得一步步把问题解决了再重新配置

我尝试用 gcc-9 版本编译,结果有很多我无法解决的编译问题,所以我还是把版本降到了 gcc-5 如需要了解《Ubuntu20.04 使用apt安装gcc-5》点击此处
如果切换了 gcc,你也需要重新执行上面的 ./configure ... 操作,同时建议执行一个 make clean 再进行 make all

geekziyu@geekziyu-ubuntu-1:~/CLionProjects/openjdk$ sudo make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0 WARNINGS_ARE_ERRORS=-Wno-all

首次编译经过漫长的时间之后,出现下图,恭喜你编译成功了!

1.6 关于 readdir_r is deprecated 问题

error: ‘int readdir_r(DIR*, dirent*, dirent**)’ is deprecated [-Werror=deprecated-declarations]

以下摘自《JVM-Ubuntu18.04.1下编译OpenJDK8》

查阅网上资料说是这是因为 glibc >= 2.24 的情况下,方法 readdir_r is deprecated,不支持了,通过 getconf GNU_LIBC_VERSION 检查发现 Ubuntu 20.04.4 LTS 版本为 glibc 2.31,而且也有很多人在OpenJDK上报了BUG,链接 https://bugs.openjdk.java.net/browse/JDK-8179887,6/7/8/9都不打算修复此问题,会在11修复这个BUG,所以当前只能通过其他的方式来解决,解决方案如下:

在 ./hotspot/make/linux/makefiles/gcc.make文件中找到 WARNINGS_ARE_ERRORS=-Werro,注释该段或改成 WARNINGS_ARE_ERRORS=-Wno-all。再编译就会忽略掉警告,直到编译完成。
当然,我是选择直接把这个选项追加到 make all 命令的末尾。

二、CLion单步调试

CLion这个IDE不支持Makefile,仅支持cmake,比较麻烦。因此可以在项目目录 /home/geekziyu/CLionProjects/openjdk 中添加一个 CMakeLists.txt 文件,下面仅供参考:

cmake_minimum_required(VERSION 3.16)
project(hotspot8)

file(GLOB_RECURSE SOURCE_FILES "*.cpp" "*.hpp" "*.c" "*.h")

include_directories("/home/geekziyu/CLionProjects/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/include/")
include_directories("/home/geekziyu/CLionProjects/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/include/linux")
include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/prims")
include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm")
include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/precompiled")
include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/runtime")
include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/utilities")
include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/classfile")
include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/oops")
include_directories("/home/geekziyu/CLionProjects/openjdk/jdk/src/solaris/bin")
include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/cpu/x86/vm")
include_directories("/home/geekziyu/CLionProjects/openjdk/hotspot/src/share/vm/interpreter")

add_executable(hotspot8 ${SOURCE_FILES})

接着,从顶部菜单栏找到 Run | Edit Configurations... 点击后打开 Run/Debug Configurations 对话框

点击左上角 + 添加 CMake Application

  1. Target 这个不重要,我选择了 All Targets
  2. Executable 选择编译后的源码中的 java 程序,我的路径为 /home/geekziyu/CLionProjects/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java
  3. Program arguments 如下所示,注意替换编译后的 Java class文件路径和待启动的 Class类名
-XX:-PrintInterpreter
-XX:-UseTLAB
-XX:-TraceBytecodes
-Xms10m
-Xmx10m
-XX:-UseTLAB
-XX:+UseG1GC
-XX:-UseConcMarkSweepGC
-XX:-PrintGCDetails
-XX:-TraceBytecodes
-cp
"/home/geekziyu/IdeaProjects/helloworld/target/classes"
com.example.Main
  1. Before Launch 中的 Build 被我移除了

参考文档

JVM专家教你快速搭建单步调试openjdk环境,最新版(值得收藏)

标签:geekziyu,jdk,openjdk,ubuntu,CLionProjects,Ubuntu,单步,home
来源: https://www.cnblogs.com/kendoziyu/p/16546105.html