《LINUX教學:CentOS上編譯OpenJDK8源碼及在Eclipse上調試HotSpot虛擬機源碼》要點:
本文介紹了LINUX教學: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
更多詳情見請繼續閱讀下一頁的出色內容:
_baidu_page_break_tag_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文件,測試法式如下:
01.package com.hotspot.test;?
02.public class Test {?
03.? ? public static void main(String[] args){?
04.? ? ? ? System.out.println("hotspot test!");?
05.? ? }?
06.}
而運行正常,天生了Test.class文件,如下圖:
4-2、改動hotspot工程調試參數
在前面的5-3配置源碼調試的配置上作如下改動;
Arguments選項卡:
com.hotspot.test/Test(注意在前面加上包名,然后是運行類)
Environment選項卡, 修轉變量:
CLASSPATH=.:/root/workspace/TestHotspot/bin (java工程生成的bin目錄,不包含包名目錄)
保留后,點擊調試運行hotspot工程,可以看到正常運行了上面的java工程文件,如下:
注意,如果有包名情況下,配置紕謬,調試運行會報"錯誤: 找不到或無法加載主類 **";到這里,我們可以對hotspot虛擬機源碼進行調試了……
本文永遠更新鏈接地址:
更多LINUX教程,盡在維易PHP學院專欄。歡迎交流《LINUX教學:CentOS上編譯OpenJDK8源碼及在Eclipse上調試HotSpot虛擬機源碼》!