在Ubuntu14下構建Hotspot並使用Eclipse調試

偶爾會看一點點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://github.com/codefollower/Open-Source-Research/blob/master/HotSpot1.7-JVM-Linux-x86/my-docs/%E6%9E%84%E5%BB%BA%E4%B8%8E%E8%B0%83%E8%AF%95.md  

   https://rkennke.wordpress.com/2012/07/27/hacking-hotspot-in-eclipse/  

   https://neomatrix369.wordpress.com/2013/03/12/hotspot-is-in-focus-again-aka-hacking-hotspot-in-eclipse-juno-under-ubuntu-12-04/


12.總結

   我要是構建 openjdk7 那麼網上的資料那麼多, 應該碰到的問題會少點, 可是, 老用舊的,就一直是舊的, 

   總共弄了2天才成功, 主要是不會C++, 缺少對C系工程結構的瞭解, 缺少C系調試的知識(gdb)

   瞭解了很多知識, 收穫很多

   寫下過程, 方便你們, 少走點彎路

相關文章
相關標籤/搜索