首頁 > 軟體

CentOS上編譯OpenJDK8原始碼及在Eclipse上偵錯HotSpot虛擬機器原始碼

2020-06-16 17:13:07

想深入了解Java的執行機制,我們有必要了解HotSpot虛擬機器;下面我們先在CentOS6.4 64位元系統上編譯OpenJDK8原始碼,然後用gdb斷點偵錯hotspot原始碼,最後再設定在eclipse上偵錯hotspot原始碼;

1、編譯OpenJDK8原始碼

1-1、獲取OpenJDK8原始碼

最新OpenJDK8原始碼下載頁面:

http://download.java.net/openjdk/jdk8

這裡下載openjdk-8-src-b132-03_mar_2014.zip:

http://www.java.net/download/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zip

在CentOS上解壓:

unzip openjdk-8-src-b132-03_mar_2014.zip

1-2、設定編譯環境

解壓後看到,構建編譯說明:README-builds.html

1)、make版本

OpenJDK8可以使用"config && make"編譯構建,不再使用Ant和ALT_ *環境變數來設定構建;

不過需要GNU make 3.81或更新的版本(檢視:make -version);

2)、安裝引導JDK:

構建JDK8需要使用JDK7 Update 7或更高版本的版本作為引導(Bootstrap)JDK,但不應使用JDK8作為引導JDK;

JDK7下載:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

這裡下載jdk-7u80-Linux-x64.rpm;

下載放到主機上後,直接:

yum localinstall jdk-7u80-linux-x64.rpm

安裝的目錄:/usr/java/jdk1.7.0_80/

3)、安裝編譯工具類庫:

yum groupinstall "Development Tools"

yum install libXtst-devel libXt-devel libXrender-devel

yum install cups-devel

yum install freetype-devel

yum install alsa-lib-devel

還可以再安裝ccache,能加快編譯速度,特別是需要多次編譯時;

這些在configure時,都有提示,缺什麼就安裝什麼;

1-3、構建編譯

--with-boot-jdk:指定引導JDK所在目錄,以防其他安裝的JDK影響(本機上以前安裝了JDK8,並設定了JAVA_HOME指向JDK8);

--with-target-bits:指定編譯64位元系統的JDK;

為可以進行原始碼偵錯,再指定下面三個引數:

--with-debug-level=slowdebug:指定可以生成最多的偵錯資訊;

--enable-debug-symbols ZIP_DEBUGINFO_FILES=0:生成偵錯的符號資訊,並且不壓縮;

命令如下:

cd openjdk

bash ./configure --with-target-bits=64 --with-boot-jdk=/usr/java/jdk1.7.0_80/ --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0

make all ZIP_DEBUGINFO_FILES=0

命令結果如下:

生成的檔案都在openjdk/build目錄,測試:

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

2、gdb斷點進入原始碼偵錯hotspot

2-1、編譯class

[root@localhost test]# vim Test.java
[root@localhost test]# cat Test.java
    public class Test{
    public static void main(String[] args){
        System.out.println("hello world !");
    }
    }
[root@localhost test]# /root/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/javac Test.java
[root@localhost test]# /root/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Test
    hello world !

2-2、進入gdb測試

用gdb測試上面編譯的class檔案;

然後在 init.cpp的第95行打個斷點,

接著執行,可以看到停在了/root/openjdk/hotspot/src/share/vm/runtime/init.cpp:95;

執行過程如下:

  [root@localhost test]# gdb --args /root/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Test
    (gdb) break init.cpp:95   
    (gdb) run
    (gdb) l
    (gdb) quit

可以對比init.cpp原始碼檔案:

2-3、注意,如果不能進入斷點

出現以下類似資訊:

Missing separate debuginfo for /root/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/lib/amd64/server/libjvm.so

因為前面configure沒指定"--enable-debug-symbols ZIP_DEBUGINFO_FILES=0"沒生成偵錯的符號資訊,或生成後被壓縮為"libjvm.diz"了,所有無法找到;

可以去到"libjvm.so"所在目錄,然後解壓:unzip libjvm.diz

解壓出來:libjvm.debuginfo

更多詳情見請繼續閱讀下一頁的精彩內容http://www.linuxidc.com/Linux/2017-06/144713p2.htm


IT145.com E-mail:sddin#qq.com