CentOS上編譯OpenJDK8源碼 以及 在eclipse上調試HotSpot虛擬機源碼php
想深刻了解Java的運行機制,咱們有必要了解HotSpot虛擬機;下面咱們先在CentOS6.4 64位系統上編譯OpenJDK8源碼,而後用gdb斷點調試hotspot源碼,最後再配置在eclipse上調試hotspot源碼;html
最新OpenJDK8源碼下載頁面:java
這裏下載openjdk-8-src-b132-03_mar_2014.zip:c++
http://www.java.net/download/openjdk/jdk8/promoted/b132/openjdk-8-src-b132-03_mar_2014.zipvim
在CentOS上解壓:bash
unzip openjdk-8-src-b132-03_mar_2014.zip
解壓後看到,構建編譯說明:README-builds.htmloracle
1)、make版本eclipse
OpenJDK8能夠使用"config && make"編譯構建,再也不使用Ant和ALT_ *環境變量來配置構建;jvm
不過須要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時,都有提示,缺什麼就安裝什麼;
--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
[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 !
用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源碼文件:
出現如下相似信息:
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
到官網選擇一個合適的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++開發視圖界面了,以下:
File-> New -> Existing Code as Makefile Project
在界面中:
Project Name:hotspot(這個能夠本身選擇)
Existing Code Location:/root/openjdk/hotspot
Toolchain:選Linux GCC,而後按Finish.
右鍵工程 -> 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保存;
在hotspot源碼工程中找到init.cpp, 在95行打個斷點;
運行上面配置的Debug, 能夠看到順利調到了斷點;
如圖:
注意,若是不能進入斷點看前面"2-3";
新建java工程,在工程新建包,在包中新建Test.java文件,測試程序以下:
package com.hotspot.test; public class Test { public static void main(String[] args){ System.out.println("hotspot test!"); } }而運行正常,生成了Test.class文件,以下圖:
在前面的5-3配置源碼調試的配置上做以下修改;
Arguments選項卡:
com.hotspot.test/Test(注意在前面加上包名,而後是運行類)
Environment選項卡, 修改變量:
CLASSPATH=.:/root/workspace/TestHotspot/bin (java工程生成的bin目錄,不包括包名目錄)
保存後,點擊調試運行hotspot工程,能夠看到正常運行了上面的java工程文件,以下:
注意,若是有包名狀況下,配置不對,調試運行會報"錯誤: 找不到或沒法加載主類 **";
到這裏,咱們能夠對hotspot虛擬機源碼進行調試了……
【參考資料】
一、openjdk文檔:openjdk/README-builds.html
二、在Ubuntu14下構建Hotspot並使用Eclipse調試:http://blog.csdn.net/faadfafasd/article/details/50539615