开发者社区 > 博文 > OpenJDK8编译调试
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

OpenJDK8编译调试

  • 京东交易提升研发团队
  • 2021-01-15
  • IP归属:未知
  • 69960浏览

    本文目标

    构建带有调试信息的OpenJDK

    使用图形化界面调试OpenJDK

    环境

    OS: Ubuntu 18.04.5 LTS  

    内核:4.15.0-130-generic

    要编译的JDK: jdk8


    步骤

    1、下载要编译的JDK8版本

    1.1、筛选tag: 打开github:https://github.com/openjdk/jdk/,筛选一下下一步需要构件的版本的tag


     

    1.2、下载代码

        可以使用git clone。也可以点击点击Download Zip,这里使用Download Zip的方式。

        注意:如果选择git clone注意只需要clone这个tag的就行。如果clone所有的代码量比较大,会很慢。



    这里把下载的代码放到:/home/parallels/workspace/openjdk 目录下


    1.3、解压

    执行 unzip jdk-jdk8-b120.zip 命令解压,得到如下目录:


    2、下载boot JDK

        JDK里面除了c、c++的代码以外还有很多java的代码,需要用一个能使用的JDK来编译(这个JDK就叫做boot JDK)。一般都是选择一个要构建版本的上一个发布版本。比如咱们要构建JDK8,就需要下载一个JDK7的release版本作为 boot JDK。

        2.1、下载地址如下:https://jdk.java.net/  选择这个7进去



        勾选:Accept License Agreement,并且下载linux版本的



    这里把下载的boot jdk放到


     2.2、解压

    执行命令解压

    tar xvf jdk_ri-7u75-b13-linux-x64-18_dec_2014.tar.gz 

    得到如下目录:



    3、构建JDK

    3.1、环境检测

    切换目录到 

    cd /home/parallels/workspace/openjdk/jdk-jdk8-b120

    执行构建命令

    sh ./configure --with-target-bits=64 --with-jvm-variants=server --with-debug-level=slowdebug --disable-zip-debug-info --with-boot-jdk=/export/soft/java-se-7u75-ri/

    参数解释:

    --with-target-bits=64: 构建64的JDK

    --with-jvm-variants=server :构建server模式的JDK

    --with-debug-level=slowdebug: slowdebug带有更多的调试信息

     --disable-zip-debug-info:禁止压缩调试信息,可以方便调试

    --with-boot-jdk=/export/soft/java-se-7u75-ri/ :表示boot jdk的路径,就是刚才下载的jdk7的路径


    可能遇到的问题:

    这个步骤会检测当前的操作系统以及一些依赖的组件是否存在。如果依赖的组件不存在会在命令行给出提示,根据提示安装就可以

    这里要注意的一个是如果提示:sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev

    这时候只需要把: libX11-dev中的X改为小写的x再执行命令就可以了执行的时候会包如下错误:



     解决了问题后,再次执行 

    sh ./configure --with-target-bits=64 --with-jvm-variants=server --with-debug-level=slowdebug --disable-zip-debug-info --with-boot-jdk=/export/soft/java-se-7u75-ri/ 

    这个过程可能要循环好几次:遇到组件未安装-->根据提示安装--->再运行上面的命令--->根据提示安装。


    命令执行成功的结果如下: 会输出要构建的信息



    3.2、make构建

    安装 bear

    bear主要是用来生成 compilation database。用来给后续Clion使用,如果使用gdb调试不适用Clion的图形化调试可以不用bear

    sudo apt-get install bear

    执行make命令

    bear make all

    这个过程遇到的问题比较多,以下一一说明。

    错误1:操作系统检测失败

    报错信息:

    *** This OS is not supported: Linux Lincoln 4.15.0-130-generic #134-Ubuntu SMP Tue Jan 5 20:46:26 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

    make[5]: *** [check_os_version] Error 1

    /home/parallels/workspace/openjdk/jdk-jdk8-b120/hotspot/make/linux/Makefile:234: recipe for target 'check_os_version' failed

    解决方法:

    vi hotspot/make/linux/Makefile

    修改:

    SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3%

    SUPPORTED_OS_VERSION = 2.4% 2.5% 2.6% 3% 4% 5%


    错误2:make语法不兼容

    报错信息:

    /usr/bin/make: invalid option -- '8'

    /usr/bin/make: invalid option -- '-'

    /usr/bin/make: invalid option -- '1'

    /usr/bin/make: invalid option -- '2'

    /usr/bin/make: invalid option -- '0'

    /usr/bin/make: invalid option -- '/'

    /usr/bin/make: invalid option -- 'a'

    /usr/bin/make: invalid option -- '/'

    /usr/bin/make: invalid option -- 'c'

    解决方法:

    vi hotspot/make/linux/makefiles/adjust-mflags.sh

    添加一个大写I


    错误3:gcc版本太高

    错误信息:

    generation.hpp:421:17: error: invalid suffix on literal; C++11 requires a space between literal and string macro [-Werror=literal-suffix]

    ....省略

    left operand of shift expression (-1 << 1)is negative [-fpermissive]

    解决方法:

    根据官方文档()http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html,构建jdk8需要gcc 4.3。

    本机的是7.5.0。所以需要降低版本


    安装gcc和g++ 4.9版本

    修改apt源:

    sudo vi /etc/apt/sources.list

    添加以下内容到文件末尾:

    #install gcc 4.9

    deb http://dk.archive.ubuntu.com/ubuntu/ xenial main

    deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe

    更新源:

    sudo apt-get update

    安装4.9版本:

    sudo apt install gcc-4.9

    sudo apt install g++-4.9

    管理多版本gcc:

    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 50
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 50
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 20
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 20

    切换到4.9版本:

    sudo update-alternatives --config gcc


    sudo update-alternatives --config g++


    注意:切换完gcc的版本后需要重新运行之前命令

    sh ./configure --with-target-bits=64 --with-jvm-variants=server --with-debug-level=slowdebug --disable-zip-debug-info --with-boot-jdk=/export/soft/java-se-7u75-ri/

    再执行

    make clean

    bear make all

    错误4:忽略警告

    错误信息:

    cc1plus: all warnings being treated as errors

    解决方法:

    vi hotspot/make/linux/makefiles/gcc.make

    注释掉如下这行



    bear make all执行成功输出如下:



    3.3、查看构建结果

    以下都是在/home/parallels/workspace/openjdk/jdk-jdk8-b120目录下查找

    jdk文件

    build/linux-x86_64-normal-server-slowdebug/jdk 目录下就是构建的完成JDK,可以设置为JAVA_HOME作为java使用

    执行一下命令可以验证下

    ./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java -version


    Compilation database

    目录下有一个compile_commands.json文件,CLion导入的工程的时候会使用


    4、Clion中使用

    4.1、导入工程:

    选择之前生成的:compile_commands.json ,选择open as project




    Clion 索引文件需要几分钟(我这里是虚拟机配置不高,需要67分钟左右)



    4.2、生成Run Configurations and Build Targets

     选择:File | Settings

    第④步点击三个点



    点击 "+"




    再次点击 "+"




    选择刚才创建的make 和 make clean



    4.3、Custom Run/Debug configurations




    4.4、打断点

    找到arguments.cpp 如下位置打个断点,点击debug。

    从图中还可以看出来,java.c是java的入口



    如果大家编译的时候遇到问题,可以留言讨论。




    共0条评论