偶爾會看一點點JVM代碼,因此嘗試構建了一把最新的OpenJDK8html
1.環境介紹java
1)時間: 2015-05-13linux
2)系統: Linux haogrgr-vm 3.16.0-30-generic #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux git
3)Eclipse: Eclipse C/C++ 4.4github
4)OpenJDK代碼: http://hg.openjdk.java.net/jdk8u/jdk8u40 web
2.JDK安裝shell
這裏安裝的是構建OpenJDK須要依賴的JDK, 通常是當前構建版本的上一個版本, 好比咱們這裏須要安裝JDK7.ubuntu
sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java7-installer sudo apt-get install oracle-java7-set-default # 若是你要安裝JDK8: # sudo apt-get install oracle-java8-installer # sudo apt-get install oracle-java8-set-default # 能夠JDK7和JDK8都安裝, 而後使用oracle-java8-set-default來設置默認的JDK
安裝完成後使用 java -version 驗證一下是否是安裝成功了.bash
3.安裝hg(openjdk使用的版本控制工具(Mercurial))oracle
下載源碼須要使用到hg命令, 安裝命令
sudo apt-get install mercurial
一樣, 安裝完後使用 hg --version 驗證是否安裝成功
4.安裝構建依賴的軟件包
根據下面的命令來安裝
sudo apt-get build-dep openjdk-7
官方的構建文檔裏面使用的是sudo aptitude build-dep openjdk-7 因爲ubuntu沒有帶aptitude,我就直接用apt-get了
5.下載源代碼
這裏下載OpenJDK8最新的版本, 我將源碼放在 /home/haogrgr/opt/myopenjdk 中
cd /home/haogrgr/opt hg clone http://hg.openjdk.java.net/jdk8u/jdk8u40 myopenjdk cd myopenjdk bash ./get_source.sh
下載完成後, 就能夠開始準備構建了.
6.配置
1)根據官方構建文檔, 先執行目錄下的configure程序來配置. 配置生成後, 就能夠開始構建了
bash ./configure --with-debug-level=slowdebug --enable-debug-symbols ZIP_DEBUGINFO_FILES=0
configure有很多的參數, 具體的參數能夠經過 'bash ./configure --help' 查看
--with-debug-level=slowdebug 表示構建debug版本, openjdk8去掉了jvmg版本的構建
--enable-debug-symbols 和 ZIP_DEBUGINFO_FILES=0 主要是方便調試
2)根據官方文檔, 將語言設置爲 ASCII
export LANG=C
7.構建
準備都完成了, 能夠開始構建了(linux-x86_64-normal-server-slowdebug在 myopenjdk/build 目錄下面,上面configure生成的目錄名)
make all CONF=linux-x86_64-normal-server-slowdebug ZIP_DEBUGINFO_FILES=0
等吧,這邊i7大概用了7分鐘
8.看當作果
cd /home/haogrgr/opt/myopenjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin ./java -verion openjdk version "1.8.0-internal-debug" OpenJDK Runtime Environment (build 1.8.0-internal-debug-haogrgr_2015_05_13_09_49-b00) OpenJDK 64-Bit Server VM (build 25.40-b25-debug, mixed mode)
結果感人~~~
再來試試編譯運行個Java程序試試 在當前目錄下新建一個Main.java文件, 內容以下
public class Main{ public static void main(String[] args){ System.out.println("hello world !"); } }
編譯,執行看看
./javac Main.java ./java Main hello world !
結果再次感人~~~
9.使用gdb調試看看
在進行調試前, 咱們須要設置一個環境變量, LD_LIBRARY_PATH, 該環境變量主要用於指定查找共享庫(動態連接庫)時除了默認路徑以外的其餘路徑
#debug目錄主要是一些jvm相關的so文件 exprot LD_LIBRARY_PATH=/home/haogrgr/opt/myopenjdk/build/linux-x86_64-normal-server-slowdebug/hotspot/linux_amd64_compiler2/debug
設置完後, 咱們進入gdb, 在thread.cpp:219打個斷點, thread.cpp:219對應的代碼爲:
// Base class for all threads: VMThread, WatcherThread, ConcurrentMarkSweepThread, // JavaThread Thread::Thread() { // stack and get_thread set_stack_base(NULL); set_stack_size(0); set_self_raw_id(0); set_lgrp_id(-1);
開始gdb調試(執行咱們上面寫的Main程序)
gdb --args ./java Main #進入gdb, 打斷點, 而後運行 (gdb) break thread.cpp:219 (gdb) run #能夠看到下面的輸出, 進入到了斷點 Starting program: /home/haogrgr/opt/myopenjdk/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 0x7ffff7fda700 (LWP 14194)] [Switching to Thread 0x7ffff7fda700 (LWP 14194)] Breakpoint 1, Thread::Thread (this=0x7ffff000c000) at /home/haogrgr/opt/myopenjdk/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); 223
如今已經能夠用gdb調試了
10.在Eclipse中調試代碼
使用gdb調試畢竟不方便, 因此我選擇用熟悉的Eclipse來調試, 這裏並不使用Eclipse構建, 只是調試代碼, 因此不須要很複雜的配置
網上不少的資料都是過期的, 好比資料裏面提到的一堆環境變量, 其實不必, 再好比jvmg , 這個在openjdk8裏面根本就沒有了.
具體步驟以下
1)下載安裝Eclipse C/C++ 版, 我下載的是最新的4.4
2)導入hotspot工程
~進入Eclipse, 選擇導入import工程 -> C/C++ -> Existing Code as Makefile Project -> 單擊 Next -> 進入工程配置界面
在界面中:
Project Name設爲hotspot 這個能夠本身選擇
Existing Code Location是/home/haogrgr/opt/myopenjdk/hotspot
Toolchain那裏選Linux GCC,而後按Finish.
~把/hotspot/src目錄加入源碼索引方便代碼搜索, 右鍵hotspot工程 -> properties -> C/C++ General -> Paths and Symbols -> Source Location選項卡
-> 選擇Add Folder 吧 hotspot/src目錄加入
~設置啓動類, 右鍵工程 -> Debug As -> Debug Configurations -> 右鍵左邊的C/C++ Application -> New -> 進入Main選項卡
在選項卡中:
C/C++ Application 選擇 /home/haogrgr/opt/myopenjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java
由於咱們這裏再也不eclipse裏面編譯,因此這裏選上 Disable auto build
而後切換到Arguments選項卡, 輸入Java的參數, 咱們這裏運行上面的Main類, 因而這裏填上 Main 也就是咱們要執行的Java程序
而後切換到Environment選項卡, 添加變量
LD_LIBRARY_PATH=/home/haogrgr/opt/myopenjdk/build/linux-x86_64-normal-server-slowdebug/hotspot/linux_amd64_compiler2/debug
JAVA_HOME=/home/haogrgr/opt/myopenjdk/build/linux-x86_64-normal-server-slowdebug/jdk/
CLASSPATH=.:/home/haogrgr/opt/myopenjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin (由於個人Main類在/bin目錄下)
3)點擊下面的Apply保存
4)在eclipse中找到thread.cpp, 在219行打個斷點
5)Debug運行上面配置的Debug, 能夠看到順利調到了斷點
11.參考資料
http://hllvm.group.iteye.com/group/topic/39731
http://hg.openjdk.java.net/jdk8/jdk8/raw-file/tip/README-builds.html
http://javaagile.blogspot.com/2014/05/debugging-jvm.html
http://blog.csdn.net/hengyunabc/article/details/16912775
https://rkennke.wordpress.com/2012/07/27/hacking-hotspot-in-eclipse/
12.總結
我要是構建 openjdk7 那麼網上的資料那麼多, 應該碰到的問題會少點, 可是, 老用舊的,就一直是舊的,
總共弄了2天才成功, 主要是不會C++, 缺少對C系工程結構的瞭解, 缺少C系調試的知識(gdb)
瞭解了很多知識, 收穫很多
寫下過程, 方便你們, 少走點彎路