CentOS上編譯OpenJDK8源碼 以及 在eclipse上調試HotSpot虛擬機源碼

CentOS上編譯OpenJDK8源碼 以及 在eclipse上調試HotSpot虛擬機源碼

       想深入瞭解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

3、在eclipse上調試hotspot源碼

3-1、下載eclipse,安裝C/C++插件

      到官網選擇一個合適的eclipse下載:https://www.eclipse.org/downloads/eclipse-packages/?osType=linux&release=undefined

      這裏下載的是eclipse-java-neon-1a-linux-gtk-x86_64.tar.gz:https://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/1a/eclipse-java-neon-1a-linux-gtk-x86_64.tar.gz&mirror_id=1207

      這個還沒有開發C++的功能,所有解壓打開eclipse後,還需要到"help -> Eclipse Maketplace",搜索"c++"找到Eclipse C++ IDE..安裝;

      安裝後,就可以轉到C++開發視圖界面了,如下:

3-2、導入hotspot工程

      File-> New -> Existing Code as Makefile Project

在界面中:

      Project Name:hotspot(這個可以自己選擇)

      Existing Code Location:/root/openjdk/hotspot

      Toolchain:選Linux GCC,然後按Finish.     

3-3、配置源碼調試     

      右鍵工程 -> Debug As -> Debug Configurations -> 右鍵左邊的C/C++ Application -> New -> 進入Main選項卡;

在選項卡中:

      Project:hotspot(選擇導入的hotspot工程)

      C/C++ Application:/root/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java(編譯生成的openjdk虛擬機入口)

      Disable auto build:因爲不再在eclipse裏面編譯hotspot源碼,所以這裏選上它;

      然後切換到Arguments選項卡, 輸入Java的參數, 我們這裏運行上面的Main類, 於是這裏填上 "Test"也就是我們要執行的Java程序

      然後切換到Environment選項卡, 添加變量:

JAVA_HOME=/root/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/(編譯生成JDK所在目錄)

CLASSPATH=.:/root/test (Test類文件所在目錄)

      點擊下面的Apply保存;

3-4、斷點Debug

      在hotspot源碼工程中找到init.cpp, 在95行打個斷點;

      運行上面配置的Debug, 可以看到順利調到了斷點;

      如圖:

      注意,如果不能進入斷點看前面"2-3";

4、配置hotspot調試運行eclipse的java工程

4-1、新建java工程(測試)

      新建java工程,在工程新建包,在包中新建Test.java文件,測試程序如下:

    package com.hotspot.test;
    public class Test {
         public static void main(String[] args){
             System.out.println("hotspot test!");
         }
    }

      而運行正常,生成了Test.class文件,如下圖:

4-2、修改hotspot工程調試參數

      在前面的5-3配置源碼調試的配置上作如下修改;

      Arguments選項卡:

      com.hotspot.test/Test(注意在前面加上包名,然後是運行類)

      Environment選項卡, 修改變量:

      CLASSPATH=.:/root/workspace/TestHotspot/bin (java工程生成的bin目錄,不包括包名目錄) 

      保存後,點擊調試運行hotspot工程,可以看到正常運行了上面的java工程文件,如下:


    

注意,如果有包名情況下,配置不對,調試運行會報"錯誤: 找不到或無法加載主類 **";

到這裏,我們可以對hotspot虛擬機源碼進行調試了……

 

【參考資料】

1、openjdk文檔:openjdk/README-builds.html

2、在Ubuntu14下構建Hotspot並使用Eclipse調試:http://blog.csdn.net/faadfafasd/article/details/50539615

發佈了57 篇原創文章 · 獲贊 248 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章