本文地址:http://m.survivalescaperooms.com/myresearch/p/ide-buildhotspot.html,轉(zhuǎn)載請注明源地址。
在閱讀OpenJDK源碼的過程中,經(jīng)常需要運行、調(diào)試程序來幫助理解。我們現(xiàn)在已經(jīng)可以編譯出一個調(diào)試版本HotSpot虛擬機,禁用優(yōu)化,并帶有符號信息,這樣就可以使用GDB來進行調(diào)試了。許多對虛擬機了解比較深的開發(fā)人員確實就是直接使用GDB加VIM編輯器來開發(fā)、修改HotSpot的,不過相信大部分讀者更傾向于在IDE環(huán)境而不是純文本的GDB下閱讀、跟蹤HotSpot源碼,在上篇文章中已經(jīng)介紹過如何在CentOS6.5上編譯OpenJDK7源碼,現(xiàn)繼續(xù)介紹如何在linux下搭建基于eclipse的Hotspot源碼調(diào)試環(huán)境。
軟件環(huán)境OS:CentOS 6.5
JDK Version:openjdk-7u6-fcs-src-b24-28_aug_2012
IDE:eclipse-cpp-kepler-SR2-linux-gtk-x86_64
下載eclipse,地址: http://www.eclipse.org/cdt/downloads.php,注意eclipse 支持 C/C++的版本。
我下載的是eclipse-cpp-kepler-SR2-linux-gtk-x86_64.tar.gz
具體操作Step 1:首先解壓JDK源碼包,啟動eclipse,依次選擇File>New>Makefile PRoject with Existing Code

接著出現(xiàn)下面的界面:

Step 2:定位到項目名右鍵>Properties>C/C++ Build需要修改兩個地方:
將Builder里口Use default build command的對勾去掉,填入?yún)?shù)ARCH_DATA_MODEL=64
將Build location的Build directory追加上/make,最終是${workspace_loc:/hotspot}/make,目的是告訴make編譯器到該目錄下尋找編譯文件Makefile。
Step 3:選擇菜單欄Project>Build Project,看到已經(jīng)開始build了,午休一下吧(首次build大概需要10-20m)。

部分LOG信息:
……
INFO: ENABLE_FULL_DEBUG_SYMBOLS=1INFO: /usr/bin/objcopy cmd found so will create .debuginfo files.INFO: STRIP_POLICY=min_stripINFO: ZIP_DEBUGINFO_FILES=1make[1]: Entering directory `/home/jvm/opt/openjdk/hotspot/make'make[1]: Nothing to be done for `generic_export'.make[1]: Leaving directory `/home/jvm/opt/openjdk/hotspot/make'
02:01:39 Build Finished (took 23s.540ms)
Step 4:編譯成功之后就可以測試了,需配置如下幾步:
點選菜單欄Run>Debug Configurations>New launch configuration,在C/C++ application里填入/home/jvm/opt/openjdk/hotspot/build/linux/linux_amd64_compiler2/fastdebug/gamma
Project選擇當(dāng)前項目。
在Argument tab頁里Program arguments填入-version
在Environment tab頁里Environment variables to set填入java_HOME|/application/java/jdk
在Common tab頁里勾選Debug

配置完畢后,點擊Debug即可進入調(diào)試模式
由于HotSpot的源碼比較長,C/C++文件數(shù)量也很多,為了便于閱讀,代碼清單給出了各個目錄中代碼的主要用途,供參考。
代碼清單 HotSpot源碼結(jié)構(gòu)hotspot├─agent Serviceability Agent的實現(xiàn)├─make 用來build出HotSpot的各種配置文件├─src HotSpot VM的源代碼│ ├─cpu CPU相關(guān)代碼│ ├─os 操作系相關(guān)代碼│ ├─os_cpu 操作系統(tǒng)+CPU組合的相關(guān)代碼│ └─share 平臺無關(guān)的共通代碼│ ├─tools 工具│ │ ├─hsdis 反匯編插件│ │ ├─IdealGraphVisualizer 將Server編譯器的中間代碼可視化的工具│ │ ├─launcher 啟動程序"java"│ │ ├─LogCompilation 將-XX:+LogCompilation輸出的日志(hotspot.log)整理成更容易閱讀的格式的工具│ │ └─ProjectCreator 生成Visual Studio的project文件的工具│ └─vm HotSpot VM的核心代碼│ ├─adlc 平臺描述文件(上面的cpu或os_cpu里的*.ad文件)的編譯器│ ├─asm 匯編器接口│ ├─c1 Client編譯器│ ├─ci 動態(tài)編譯器的公共服務(wù)/接口│ ├─classfile 類文件的處理(包括類加載和系統(tǒng)符號表等)│ ├─code 動態(tài)生成的代碼的管理│ ├─compiler 編譯器接口│ ├─gc_implementation GC的實現(xiàn)│ │ ├─concurrentMarkSweep Concurrent Mark Sweep GC的實現(xiàn)│ │ ├─g1 Garbage-First GC的實現(xiàn)(不使用老的分代式GC框架)│ │ ├─parallelScavenge ParallelScavenge GC的實現(xiàn)(Server VM默認,不使用老的分代式GC框架)│ │ ├─parNew ParNew GC的實現(xiàn)│ │ └─shared GC的共通實現(xiàn)│ ├─gc_interface GC的接口│ ├─interpreter 解釋器,包括"參考資料 《深入java虛擬機》
新聞熱點
疑難解答