題外話
最近在閱讀《深入理解Java虛擬機器》,其中有一小節實戰是自己編譯JDK,實際操作下來後遇到問題不少,為此特地記錄,也希望可以給大家帶來一些參考!
前置準備
平臺及工具:Windows 10 + WSL(ubuntu 20.04) + CLion(2021.2.2)
OpenJDK12下載地址:https://hg.openjdk.java.net/jdk/jdk12/
- 下載安裝解壓即可
編譯工具版本推薦:
-
GCC 7.4及以上
# Ubuntu上安裝GCC命令,該命令預設安裝9.3版本(2021年) sudo apt-get install build-essential
編譯依賴庫:
工具 | 庫名稱 | 安裝命令 |
---|---|---|
FreeType | The FreeType Project | sudo apt-get install libfreetype6-dev |
CUPS | Common UNIX Printing System | sudo apt-get install libcups2-dev |
X11 | X Window System | sudo apt-get install libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev |
ALSA | Advanced Linux Sound Architecture | sudo apt-get install libasound2-dev |
libffi | Portable Foreign Function Interface Library | sudo apt-get install libffi-dev |
Autoconf | Extensible Package of M4 Macros | sudo apt-get install autoconf |
Bootstrap JDK 準備:
-
OpenJDK11
sudo apt-get install openjdk-11-jdk
開始編譯
編譯FastDebug版,僅含Server模式的HotSpot虛擬機器命令:
bash configure --enable-debug --with-jvm-variants=server
# 嫌寫那麼多麻煩,直接用下面這個?,不過這個是生成release版本的,不利於debug
bash configure
configure命令會進行依賴項檢查,引數配置和構建輸出目錄結構等操作,所以依賴缺失會得到明確提示:
ZIP安裝命令:
sudo apt-get install zip
繼續檢查...繼續安裝缺失的依賴...
成功介面:
依賴檢查通過後,執行make images
命令執行整個OpenJDK的編譯,作用是編譯出整個JDK映象
不出所料,編譯報錯:
充分利用了搜尋引擎,以及認真閱讀了building.md
檔案後,發現應該是gcc的版本問題,預設安裝的是9,但實際需要的是7,於是把9給解除安裝了,重新安裝了個7
# 解除安裝命令
sudo apt-get remove gcc-9
# 安裝7
sudo apt-get install gcc-7
sudo apt-get install g++-7
# 如果上述命令安裝後,gcc --version能查出版本而不會報錯,就無需使用以下命令
# 或者已有7和9兩個版本,但預設用的是9,也可用以下命令修改為7
# 設定預設選項
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
sudo update-alternatives --config gcc
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
sudo update-alternatives --config g++
萬事俱備只欠東風。先make dist-clean
清理一波編譯生成的臨時檔案,接著一波流:
bash configure --enable-debug --with-jvm-variants=server
make images
漫長的等待後...沒有報錯!!!
測試一波:
./build/*/images/jdk/bin/java -version
編譯成功:
目錄結構:
在IDE工具上除錯
匯入JDK原始碼檔案,open file 選擇MakeFile
,有彈窗清除clean
,然後一直確認即可
等待匯入......
接著會發現幫你生成了一堆的targets
,將根目錄Mark Directory as 一下
然後選all
即可,開啟編輯,Executable選擇編譯出來的java
命令,Before launch移除Build
具體設定各項引數如圖:
找到java.c
檔案,打個斷點,直接Debug
啟動(開始你的表演):
配置-version
只是測試一下是不是真的能夠除錯了而已,如果想要除錯某個Java類呢
IDEA配合Clion遠端除錯
IDEA配置
- 新增Configuration,選擇Remote JVM Debug即可:
Clion配置
-
新增Configuration,選擇Custom Build Configuration
-
Target 需要新增一下,
-
make編譯配置
-
make clean配置
-
-
Executable依然選擇編譯出來的Java命令
-
Program arguments填寫:
-jar -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5008 xxx.jar
-
Working directory選擇:上述jar包生成位置
最終配置如圖:
參考資料
《深入理解Java虛擬機器:JVM高階特性與最佳實踐》(第三版)1.6實戰:自己編譯JDK