本篇文章大量參考來源於 JVM(一) OpenJDK1.8源碼在Ubuntu16.04下的編譯 和 在Ubuntu14下構建Hotspot並使用Eclipse調試 除此之外記錄自己遇到的問題並且給出解決方案,廢話不多說,直接開始。
一.環境準備:
1. 安裝Bootstrap JDK,這裏我們使用OpenJDK7,運行如下命令
sudo apt-get install openjdk-7-jre
sudo apt-get install openjdk-7-jdk
遇到如下問題:package is not available
解決方案:添加repository,update後重新安裝
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-7-jre
sudo apt-get install openjdk-7-jdk
安裝完成後使用java -version驗證是否安裝成功
zmx@ubuntu:~/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk$ java -version
java version "1.7.0_95"
OpenJDK Runtime Environment (IcedTea 2.6.4) (7u95-2.6.4-3)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)
PS:我第一次安裝時沒有發現ubuntu上有一個OpenJDK,從而導致後面出現了各種問題,因此建議先卸載系統中的其他JDK
zmx@ubuntu:~/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk$ sudo apt-get remove openjdk*
2. 下載OpenJDK源碼
鏈接: https://pan.baidu.com/s/1cpwYpacqVsFuR5_2twEhZw 提取碼: t9yp
3. 安裝相關依賴包
可以在運行./configure時缺什麼安裝什麼,下面提到的依賴包僅供參考
sudo apt-get install libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev
sudo apt-get install libcups2-dev
sudo apt-get install libfreetype6-dev
sudo apt-get install libasound2-dev
二. 進行編譯
1. 解壓OpenJDK源碼後進入根目錄
zmx@ubuntu:~/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk$ ls
ASSEMBLY_EXCEPTION hotspot LICENSE README-builds.html
common jaxp make test
configure jaxws Makefile THIRD_PARTY_README
corba jdk nashorn
get_source.sh langtools README
zmx@ubuntu:~/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk$
2.運行根目錄下的configure腳本,注意:此處不加參數configure出的OpenJDK爲release版本,按照教程推進到後面時出現了不可預知的錯誤,因此加上參數:
--with-debug-level=slowdebug 表示構建debug版本, openjdk8去掉了jvmg版本的構建
--enable-debug-symbols 和 ZIP_DEBUGINFO_FILES=0 主要是方便調試
zmx@ubuntu:~/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk$ bash ./configure --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0
f
3.查找是否有環境變量JAVA_HOME和CLASSPATH,有的話要去掉
添加系統環境變量LANG,設定語言選項
zmx@ubuntu:~/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk$ $echo $JAVA_HOME
zmx@ubuntu:~/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk$ $echo $CLASSPATH
#如果有的話
unset JAVA_HOME
unset CLASSPATH
#set language
export LANG=C
4. 運行make all
make all CONF=linux-x86_64-normal-server-slowdebug ZIP_DEBUGINFO_FILES=0
遇到問題:操作系統不支持,可以看到從錯誤中容易看出,應該是內核版本和JDK要求的內核版本不一致造成的。
根據錯誤找到Makefile
zmx@ubuntu:~$ gedit ~/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk/hotspot/make/linux/Makefile
進入Makefile,在SUPPORTED_OS_VERSION某尾添加4%
5. 編譯完成
6.驗證編譯成功後的JDK
zmx@ubuntu:~/nju/openjdk-8u40-src-b25-10_feb_2015/openjdkildnux-x86_64-normal-server-slowdebugk/bin$ ./java -version
openjdk version "1.8.0-internal-debug"
OpenJDK Runtime Environment (build 1.8.0-internal-debug-zmx_2019_02_23_10_38-b00)
OpenJDK 64-Bit Server VM (build 25.40-b25-debug, mixed mode)
在bin目錄下新建一個Main.java
public class Main{
public static void main(String[] args){
System.out.println("hello world !");
}
}
編譯並運行
./javac Main.java
./java Main
hello world !
7. 使用gdb調試
設置環境變量LD_LIBRARY_PATH,用於指定查找共享庫(動態鏈接庫)時除了默認路徑以外的其他路徑,如果這個變量沒有設置或者設置錯誤,在調試時將會出現No source file named thread.cpp.錯誤(可根據自己編譯的OpenJDK路徑進行設置)
export LD_LIBRARY_PATH=/home/zmx/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/linux-x86_64-normal-server-slowdebug/hotspot/linux_amd64_compiler2/debug/
echo $LD_LIBRARY_PATH
/home/zmx/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/linux-x86_64-normal-server-slowdebug/hotspot/linux_amd64_compiler2/debug/
開始gdb調試
gdb --args ./java Main
#進入gdb,打斷點然後運行
(gdb) break thread.cpp:219
No source file named thread.cpp.
#從future shared library中找到thread.cpp,如果LD_LIBRARY_PATH沒有配置則無法找到thread.cpp
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (thread.cpp:219) pending.
(gdb) run
Starting program: /home/zmx/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Main
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff7fd9700 (LWP 14628)]
[Switching to Thread 0x7ffff7fd9700 (LWP 14628)]
Thread 2 "java" hit Breakpoint 1, Thread::Thread (this=0x7ffff000c800)
at /home/zmx/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk/hotspot/src/share/vm/runtime/thread.cpp:219
219 set_stack_base(NULL);
# 查看當前代碼
(gdb) l
214 // JavaThread
215
216
217 Thread::Thread() {
218 // stack and get_thread
219 set_stack_base(NULL);
220 set_stack_size(0);
221 set_self_raw_id(0);
222 set_lgrp_id(-1);
8.安裝Eclipse IDE for C/C++ Developers進行調試(不推薦直接使用命令 sudo apt-get install eclipse,因爲這樣爲安裝上許多不必要的插件)
下載地址:https://www.eclipse.org/downloads/packages/release
我下載的是 eclipse-cpp-kepler-SR1-linux-gtk-x86_64.tar.gz
解壓:
sudo tar xzvf xxxx.tar.gz -C ./
點擊import後選擇existing code as makefile project
出現問題:點擊Next之後無反應,一直卡在上述界面,同時eclipse打開時報錯信息包含以下兩個內容:
1. Generating Library Hover help for installed devhelp documentation
2. Load C/C++ library hover data
解決方案:
1.不要用eclipse第一次打開自帶的workspace,我的方法是在包含eclipse的目錄下新建一個workspace文件夾,
選擇它做workspace,具體原因未知。
2. 參考鏈接 https://blog.csdn.net/luonanqin/article/details/7862069 中的方法將JDK改成ICU
導入編譯後的工程:
結果如下圖所示:
8.準備調試,參考鏈接:https://blog.csdn.net/wangemperor/article/details/80715952
將/hotspot/src目錄加入源碼索引方便代碼搜索
設置啓動類
C/C++ Application:/home/zmx/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java
選擇Disable auto build
Arguments選擇Main
這些變量都按照鏈接 https://my.oschina.net/haogrgr/blog/414825 中的操作進行設置
LD_LIBRARY_PATH = /home/zmx/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/linux-x86_64-normal-server-slowdebug/hotspot/linux_amd64_compiler2/debug/
CLASSPATH = .:/home/zmx/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin
JAVA_HOME = /home/zmx/nju/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk
找到thread.cpp,在219行打一個斷點
進行debug操作,可以看到程序順利跳至到斷點