jvm

编译调试openjdk8

搭建openkdj8编译调试环境

Posted by HuangCanCan on September 5, 2020

编译openjdk8

编译环境

  • 操作系统:Ubuntu16
  • boot jdk:jdk7(我用的是openjdk7)
  • 编译的jdk:openjdk8
  • 看源码工具:Clion

下载地址:

ubuntu openjdk1.7 openjdk1.8 openjdk1.8源代码

以下编译openjdk的步骤只是其中之一。openjdk 解压后目录下有一个README-builds.html文件,该文件是官方提供的构建步骤,每个环境都有,请大家参考。

构建编译环境

因为OpenJDK的各个组成部分有的是使用C++编译,有的是使用Java自身实现的,比如调试工具:jps、jstat等,还有一些核心jar包,如rt.jar、tools.jar等。所以编译这些Java代码需要一个可用的JDK,官方称这个JDK为“Bootstrap JDK”,所以boot jdk需要比你编译的jdk版本低,因此需要安装jdk1.7。

1.安装启动jdk1.7

# 下载的jdk1.7文件:openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz

## 在usr下创建java目录,将jdk1.7.tar.gz包放到该目录下
mkdir /usr/java

## 解压
tar -xzvf openjdk-7u75-b13-linux-x64-18_dec_2014.tar.gz

## 将解压后的文件目录更改为jdk1.7_7u75
mv openjdk-7u75-b13 jdk1.7_7u75

## 在profile文件底部里加入
vi /etc/profile

export JAVA_HOME=/usr/java/jdk1.7_7u75
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

## 退出vi编辑器,使环境变量设置立即生效
## 修改的配置文件载入系统
source /etc/profile


##验证jdk是否安装成功,输出信息证明安装成功
java -version
javac -version

2.安装依赖

sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfreetype6-dev libasound2-dev ccache

3.配置编译

1)解压OpenJDK源码

## 将下载好的openjdk8源码放到/usr/local/openjdk/openjdk8路径下,并解压
###解压.zip文件
unzip openjdk-8u41-src-b04-14_jan_2020.zip

2)配置

## 进入openjdk目录下和configure同一级,执行以下命令
## 配置
sudo bash ./configure --with-target-bits=64 --with-boot-jdk=/usr/java/jdk1.7_7u75 --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0

说明下第一条命令configure用到的参数作用:

–with-target-bits=64 :指定生成64位jdk; –with-boot-jdk=/usr/java/jdk1.7.0_80/:启动jdk的路径; –with-debug-level=slowdebug:编译时debug的级别,有release, fastdebug, slowdebug 三种级别; –enable-debug-symbols ZIP_DEBUGINFO_FILES=0:生成调试的符号信息,并且不压缩;

执行完命令输出:

看到这个画面就证明配置成功了,就可以编译了

3)编译

## 编译
sudo make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0

执行完命令输出:

看到这个画面就证明编译成功,就可以用了

4)验证

## 进入该目录下
cd build/linux-x86_64-normal-server-slowdebug/images/j2sdk-image/bin/

## 
./java -version

输出:

调试openjdk8

使用我们编译好的openjdk8(设置环境变量)

进入家目录 cd ~ ,里面有一个.bashrc文件

/home/hcc/.bashrcbash 的配置文件,保存个人的一些个性化设置,如命令别名、路径等。一般会在.bash_profile文件中显式调用.bashrc。登陆 linux 启动 bash时首先会去读取 ~/.bash_profile文件,这样 ~/.bashrc也就得到执行了,你的个性化设置也就生效了。

.bash_profile只在会话开始时被读取一次,而.bashrc则每次打开新的终端时,都要被读取。

.bashrc 理解 bashrc 和 profile

每一次终端连接Linux都会调用这个.bashrc文件,所以把环境变量设置到该文件里

## 打开.bashrc文件设置环境变量
export JAVA_HOME=/home/hcc/CLionProjects/openjdk8/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk
export PATH=$JAVA_HOME/bin:$PATH

##立刻加载修改的文件
source ~/.bashrc

可以看到openjdk版本是我们编译的openjdk8,不是jdk7

证明我们编译的openjdk8能否正常使用?

编写一个Test.java文件,使用我们编译好的openjdk8。

## 1.创建Test.java文件
vim Test.java

## 输入以下代码
public class Test{
        public static void main(String[] args){
                System.out.print("Hello My custom compile JVM");
        }
}

## 2.编译Test.java文件
javac Test.java

## 3.运行Test类,输出Hello My custom compile JVM。证明能够正常使用
java Test 

工具调试openjdk8

工具:clion(clion的安装及使用此处省略)

openjdk8源码导入clion

启动clion,选择下面红色框框

到这步完成以后,会帮我们自动创建一个CMakeLists.txt文件。如果不去修改虚拟机里的代码重新编译,就不用管它。但是发现工程load失败了

所以差了支持包:

###ubuntu运行下面命令:
sudo apt-get install gnustep
sudo apt-get install gnustep-devel 


###其他Linux系统(centos)安装运行下面的命令
yum install gcc-objc gcc-objc++ libobjc

重新加载工程, 点击File->Reload Cmake Project,如下不在报错,加载成功,

接下来,编辑配置

全部点击ok后,我们就可以对openjdk源码进行调试了。但是还需要删除Build

要跟踪具体的Java代码在虚拟机中是如何执行的,目前HotSpot在主流的操作系统上,都采用模板解释器来执行字节码,它与即时编译器一样,最终执行的汇编代码都是运行期间产生的,无法直接设置断点,所以HotSpot增加了以下参数来方便开发人员调试解释器:

## 调试HotSpot时需要加入如下参数
## 当遇到序号为<n>的字节码指令时,便会中断程序执行,进入断点调试,调试 解释器部分代码时,把这两个参数加到Java命令的参数后面即可。
-XX:+TraceBytecodes -XX:StopInterpreterAt=<n>

完成以上配置后,一个可调试的HotSpot工程就完全建立起来了。

HotSpot虚拟机启动器的执行入口是 Java.c 的JavaMain()方法,可以设置断点单步跟踪。

断点启动

至此,调试openjdk8就完成了。