jvm源码编译调试

390 阅读4分钟

环境说明

jdk版本jdk8,因官网推荐的hg下载速度非常不友好,
使用以下地址,另外用github镜像传送门
boot-jdkjdk7u70
osubuntu 18.04
make4.1

前置安装

gcc安装

openjdk官网build教程中,有如下说明

The minimum accepted version of gcc is 5.0. Older versions will generate a warning by configure and are unlikely to work.

The JDK is currently known to be able to compile with at least version 11.2 of gcc.

In general, any version between these two should be usable.

gcc的安装方法也可查看其官方教程

  1. 先将ubuntu内置的gcc移除

    sudo apt remove gcc
    
  2. 下载gcc

    找一个国内的镜像仓库,找到对应的版本gcc压缩包下载,本文下载的是9.5.0版本

    cd /usr/loca/share
    wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.gz
    
  3. 解压

    tar -zxvf gcc-9.5.0.tar.gz
    cd gcc-9.5.0
    
  4. 下载依赖库

    ./contrib/download_prerequisites
    # zlib
    apt install zlib1g-dev
    
  5. configure

    ./configure --prefix=/usr/local/share/gcc-9.5.0/build --enable-threads=posix --disable-checking --enable--long-long --with-system-zlib --enable-language=c,c++ --disable-multilib
    

    命令相关参数可查看官网教程对configure的说明

  6. make

    make
    make install
    
  7. 命令更新

    #删除内置命令
    rm -rf /usr/bin/gcc /usr/local/bin/gcc /usr/bin/g++ /usr/local/bin/g++
    #建立新的软链
    ln -s /usr/local/share/gcc-9.5.0/build/bin/gcc /usr/bin/gcc
    ln -s /usr/local/share/gcc-9.5.0/build/bin/gcc /usr/local/bin/gcc
    ln -s /usr/local/share/gcc-9.5.0/build/bin/g++ /usr/bin/g++
    ln -s /usr/local/share/gcc-9.5.0/build/bin/g++ /usr/local/bin/g++
    
  8. test

    验证是否安装成功,返回具体版本信息即可

    gcc -v
    

gdb安装

  1. 先将ubuntu内置的gdb移除

    apt remove gdb
    # texinfo依赖
    apt install texinfo
    
  2. 下载gcc

    找一个国内的镜像仓库,找到对应的版本gdb压缩包下载,本文下载的是9.2版本

    cd /usr/loca/share
    wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gdb/gdb-9.2.tar.gz
    
  3. 解压

    tar -zxvf gdb-9.2.tar.gz
    cd gdb-9.2
    
  4. 新建目录并执行configure gdb安装要求不能在源码目录,这个没搞懂

    mkdir -p /usr/local/share/gdb/build
    cd /usr/local/share/gdb build
    /usr/local/share/gdb-9.2/configure --prefix=/usr/local/share/gdb/build
    
    
  5. make

    make
    make install
    
  6. 命令更新

    rm -rf /usr/bin/gdb /usr/local/bin/gdb
    ln -s /usr/local/share/gdb/build/bin/gdb /usr/bin/gdb
    ln -s /usr/local/share/gdb/build/bin/gdb /usr/local/bin/gdb
    
  7. test

    验证是否安装成功,返回具体版本信息即可

    gdb -v
    

boot-jdk安装

下载jdk7,官网下载linux版本即可,不需要进行相关配置,假如放的位置如下:

/usr/local/share/jdk7

jdk编译前置库安装

  1. FreeType
    apt install libfreetype6-dev
    
  2. CUPS
    apt install libcups2-dev
    
  3. X11
    apt install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev
    
  4. ALSA
    apt install libasound2-dev
    
  5. libffi
    apt install libffi-dev
    
  6. Autoconf
    apt install autoconf
    

源码编译

  1. 目录创建

    mkdir -p /data/code
    #授权
    chown -R qinghua:qinghua /data/code
    #切到qinghua用户
    su qinghua
    
  2. 源码下载

    源码在git仓库中,需要用到git命令

    #没有git的话,执行以下安装命令
    sudo apt install git
    #此处使用github镜像仓库下载
    git clone https://hub.nuaa.cf/AdoptOpenJDK/openjdk-jdk8u.git
    
  3. configure

    cd openjdk-jdk8u
    #给予可执行权限
    chmod u+x configure
    ./configure --with-boot-jdk=/usr/local/share/jdk7
    
  4. make

    make all
    

    可能会存在着如下报错

    os_linux.cpp 4999:15 "%s" argument require is null
    

    编译os_linux.cpp文件,改成如下:

    if(exception_name(sig, buf, 0_BUFLEN) != NULL) {
        tty->print("Warning: %s handler", exception_name(sig, buf, 0_BUFLEN));
    }
    

    更改后,再执行

    make all
    
  5. 验证是否成功

    # 进入build目录
    cd ./build/linux-x86_64-normal-server-release/jdk/bin
    ./java -version
    

调试

使用vscode来调试

launch.json文件如下:

{
    "configurations": [
        {
            //debug name
            "name": "hotspot linux debug",
            "type": "cppdbg",
            "request": "launch",
            //待测试的程序,即编译成功的java命令
            "program": "/data/code/jdk8u/build/linux-x86_64-normal-server-release/jdk/bin/java",
            "args": [
                //java class文件名
                //Hello.class必须在下面的指定的environment中的CLASSPATH目录下
                "Hello"
            ],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [
                {"name":"JAVA_HOME","value":"/data/code/jdk8u/build/linux-x86_64-normal-server-release/jdk"},
                {"name":"CLASSPATH","value":".:/data/code/java"}
            ],
            "externalConsole": false,
            "MIMode": "gdb"
        }
    ],
    "version": "2.0.0"
}

点击 run and debug 按钮,点击对应的debug配置开始debug。

总结

  1. 对于前置库、软件等程序安装,我们直接以root用户来安装,对于jdk的编译调试,我们使用普通用户即可
  2. 调试时,为能进行更详细的debug,在编译jdk时,可做如下指定
    ./configure --with-boot-jdk=/usr/local/share/jdk7 --with-debug-level=slowdebug with-jvm-variants=server
    

注:之前在22.04版本的ubuntu安装过一次,但是一直无法调试,一直报一个什么"interpreter-exec console ... set env ..."的错误,没解决,放弃并换用18.04版本,成功编译并调试。