Ubuntu 16.04編譯OpenJDK8u40源碼,並使用Eclipse IDE for C/C++ Developers作爲工具調試

本篇文章大量參考來源於 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操作,可以看到程序順利跳至到斷點

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章