openjdk7之編譯和debug
編譯
下載源代碼
openjdk的源碼可以通過hg方式下載。
也可以從此處下載:openjdk源碼安裝引導JDK
因為JDK中有很多代碼是Java自身實現的,所以還需要一個已經安裝在本機上可用的JDK,叫做“Bootstrap JDK”。我所選用的Bootstarp JDK是JDK1.6.0_45。java version "1.6.0_45"Java(TM) SE Runtime Environment (build 1.6.0_45-b06)Java HotSpot(TM) Server VM (build 20.45-b01, mixed mode)
JDK1.6.0_45下載地址:jdk1.6.0_45.tar.gz
安裝編譯前的依賴環境
安裝gcc、g++、make等sudo apt-get install build-essential
安裝ant 1.7以上sudo apt-get install ant
安裝XRendersudo apt-get install libxrender-dev
sudo apt-get install xorg-dev
安裝alsasudo apt-get install libasound2-dev
Cupssudo apt-get install libcups2-dev
安裝零碎的工具包sudo apt-get install gawk zip libxtst-dev libxi-dev libxt-dev
配置編譯腳本
將你的openjdk解壓後,並進入該文件夾。比如我的是在/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk
下。新建一個build.sh,並添加如下內容:export LANG=C#將一下兩項設置為你的BootstrapJDK安裝目錄export ALT_BOOTDIR=/home/ddy/jdk1.6.0_45export ALT_JDK_IMPORT_PATH=/home/ddy/jdk1.6.0_45#允許自動下載依賴包export ALLOW_DOWNLOADS=true#使用預編譯頭文件,以提升便以速度export USE_PRECOMPILED_HEADER=true#要編譯的內容,我只選擇了LANGTOOLS、HOTSPOT以及JDKexport BUILD_LANGTOOLS=trueexport BUILD_JAXP=falseexport BUILD_JAXWS=falseexport BUILD_CORBA=falseexport BUILD_HOSTPOT=trueexport BUILD_JDK=true#要編譯的版本export SKIP_DEBUG_BUILD=falseexport SKIP_FASTDEBUG_BUILD=trueexport DEBUG_NAME=debug#避免javaws和瀏覽器Java插件等的buildBUILD_DEPLOY=false#不build安裝包BUILD_INSTALL=false#包含全部的調試信息export ENABLE_FULL_DEBUG_SYMBOLS=1#調試信息是否壓縮,如果配置為1,libjvm.debuginfo會被壓縮成libjvm.diz,將不能被debug。export ZIP_DEBUGINFO_FILES=0#用於編譯線程數export HOTSPOT_BUILD_JOBS=3#設置存放編譯結果的目錄#export ALT_OUTPUTDIR=/home/ddy/openjdk/7/buildunset CLASSPATHunset JAVA_HOMEmake sanityDEBUG_BINARIES=true make 2>&1
5.開始編譯
在openjdk目錄下,運行build.shchmod +x build.sh./build.sh
最後編譯耗時將近2分鐘。編譯完成輸出如下信息:
此時openjdk就編譯完成了,編譯的輸出在/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/build/
下。
進入/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/build/linux-amd64-debug/j2re-image/bin n
,執行./java -version
輸出的java版本信息將是帶著你的機器用戶名,我的輸出是:openjdk version "1.7.0-internal-debug"OpenJDK Runtime Environment (build 1.7.0-internal-debug-ddy_2017_06_10_22_30-b00)OpenJDK 64-Bit Server VM (build 24.0-b56-jvmg, mixed mode)
debug
編譯完成了之後,就可以對JDK源碼和HotSpot源碼等進行debug了。
JDK
首先是JDK源碼,在build目錄下編譯生成的jdk裏面的jar包都是可編譯的了,直接把eclipse的JDK或者JRE換成編譯成功的JDK或者JRE即可。
HotSpot
註意,如果不能進入斷點,出現以下類似信息:
Missing separate debuginfo for/root/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/lib/amd64/server/libjvm.so
是因為在編譯時因為編譯配置項不正確而沒有生成調試的符號信息,或生成後被壓縮為"libjvm.diz"了,所以無法找到。如果是因為沒有編譯時沒有生成調試信息,需要修改編譯配置並重新編譯。對於被壓縮的情況,可以去到"libjvm.so"所在目錄
然後解壓:unzip libjvm.diz
解壓出來:libjvm.debuginfo
如果在編譯時,把配置信息修改如下,則不會出現不能上述問題。
#包含全部的調試信息export ENABLE_FULL_DEBUG_SYMBOLS=1#調試信息是否壓縮,如果配置為1,libjvm.debuginfo會被壓縮成libjvm.diz,將不能被debug。export ZIP_DEBUGINFO_FILES=0
使用GDB
參考:CentOS上編譯OpenJDK8源碼 以及 在eclipse上調試HotSpot虛擬機源碼
使用eclipse
生成要運行的JAVA類
首先在/home/ddy/src/java-src
目錄下建立要運行的FileChannelTest.java,這個類在寫文件時調用了JDK的native方法,其代碼如下:
```java
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileChannelTest {
public static void main(String[] args) throws IOException {
FileChannel channel=new RandomAccessFile("test.txt","rw").getChannel();
ByteBuffer buffer=ByteBuffer.allocate(1000);
channel.write(buffer);
}
}然後對其進行編譯,運行:
bash
[email protected] ~ $ cd src/java-src/
[email protected] ~/src/java-src $ pwd
/home/ddy/src/java-src
[email protected] ~/src/java-src $ /home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/build/linux-amd64-debug/j2sdk-image/bin/javac FileChannelTest.java
```
下載eclipse,安裝C/C++插件
到官網選擇一個合適的eclipse下載,因為本人主要進行JAVA開發,所以下載的是j2EE版本,這個版本沒有C/C++的功能。不過可以安裝插件使其支持C/C++功能。"help -> Eclipse Maketplace",搜索"c++"找到Eclipse C++ IDE..安裝。安裝後,就可以轉到C++開發視圖界面了。導入hotspot工程
File-> New -> Makefile Project With Existing Code
在界面中:
Project Name:openjdk(這個可以自己選擇)
Existing Code Location:/root/openjdk
Toolchain:選Linux GCC,然後按Finish.配置源碼調試
init.cpp(/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/hotspot/src/share/vm/runtime目錄下) 95行
FileDispatchImpl.c(/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/jdk/src/solaris/native/sun/nio/ch目錄下) 107行
右鍵工程 -> Debug As -> Debug Configurations -> 右鍵左邊的C/C++ Application -> New -> 進入Main選項卡;
在選項卡中:
Project: openjdk(選擇導入的openjdk工程)
C/C++ Application:/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/build/linux-amd64-debug/j2sdk-image/bin/java
(編譯生成的openjdk虛擬機入口)
Disable auto build:因為不再在eclipse裏面編譯hotspot源碼,所以這裏選上它;然後切換到Arguments選項卡, 輸入Java參數, 這裏填上 "FileChannelTest"也就是我們要執行的JAVA程序。
然後切換到Environment選項卡, 添加變量:
JAVA_HOME=/home/ddy/openjdk-compile/openjdk-7u40-fcs-b43-26/openjdk/build/linux-amd64-debug/j2sdk-image
(編譯生成JDK所在目錄)CLASSPATH=.:/home/ddy/src/java-src
(FileChannelTest.java文件所在目錄)
點擊下面的Apply保存;斷點Debug
下面分別在源碼上打兩個斷點:
openjdk7之編譯和debug