在Eclipse中进行HotSpot的源码调试--转
原文地址:http://www.linuxidc.com/Linux/2015-05/117250.htm
在閱讀OpenJDK源碼的過程中,經(jīng)常需要運行、調試程序來幫助理解。我們現(xiàn)在已經(jīng)可以編譯出一個調試版本HotSpot虛擬機,禁用優(yōu)化,并帶有符號信息,這樣就可以使用GDB來進行調試了。許多對虛擬機了解比較深的開發(fā)人員確實就是直接使用GDB加VIM編輯器來開發(fā)、修改HotSpot的,不過相信大部分讀者更傾向于在IDE環(huán)境而不是純文本的GDB下閱讀、跟蹤HotSpot源碼,在上篇文章中已經(jīng)介紹過如何在CentOS 6.5上編譯OpenJDK7源碼,現(xiàn)繼續(xù)介紹如何在Linux下搭建基于eclipse的Hotspot源碼調試環(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=1
INFO: /usr/bin/objcopy cmd found so will create .debuginfo files.
INFO: STRIP_POLICY=min_strip
INFO: ZIP_DEBUGINFO_FILES=1
make[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選擇當前項目。
-
在Argument tab頁里Program arguments填入-version
-
在Environment tab頁里Environment variables to set填入JAVA_HOME?|?/application/java/jdk
-
在Common tab頁里勾選Debug
?配置完畢后,點擊Debug即可進入調試模式
由于HotSpot的源碼比較長,C/C++文件數(shù)量也很多,為了便于閱讀,代碼清單給出了各個目錄中代碼的主要用途,供參考。
代碼清單 HotSpot源碼結構
hotspot
├─agent? ? ? ? ? ? ? ? ? ? ? ? ? ? Serviceability Agent的實現(xiàn)
├─make? ? ? ? ? ? ? ? ? ? ? ? ? ? 用來build出HotSpot的各種配置文件
├─src? ? ? ? ? ? ? ? ? ? ? ? ? ? ? HotSpot VM的源代碼
│? ├─cpu? ? ? ? ? ? ? ? ? ? ? ? ? ? CPU相關代碼
│? ├─os? ? ? ? ? ? ? ? ? ? ? ? ? ? 操作系相關代碼
│? ├─os_cpu? ? ? ? ? ? ? ? ? ? ? ? 操作系統(tǒng)+CPU組合的相關代碼
│? └─share? ? ? ? ? ? ? ? ? ? ? ? ? 平臺無關的共通代碼
│? ? ? ├─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)編譯器的公共服務/接口
│? ? ? ? ? ├─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? ? ? ? ? ? ? ? 解釋器,包括"模板解釋器"(官方版在用)和?"C++解釋器"(官方版不再用)
│? ? ? ? ? ├─libadt? ? ? ? ? ? ? ? ? ? 一些抽象數(shù)據(jù)結構
│? ? ? ? ? ├─memory? ? ? ? ? ? ? ? ? ? 內存管理相關(老的分代式GC框架也在這里)
│? ? ? ? ? ├─oops? ? ? ? ? ? ? ? ? ? ? HotSpot VM的對象系統(tǒng)的實現(xiàn)
│? ? ? ? ? ├─opto? ? ? ? ? ? ? ? ? ? ? Server編譯器
│? ? ? ? ? ├─prims? ? ? ? ? ? ? ? ? ? ? HotSpot VM的對外接口,包括部分標準庫的native部分和JVMTI實現(xiàn)
│? ? ? ? ? ├─runtime? ? ? ? ? ? ? ? ? ? 運行時支持庫(包括線程管理、編譯器調度、鎖、反射等)
│? ? ? ? ? ├─services? ? ? ? ? ? ? ? ? 主要是用來支持JMX之類的管理功能的接口
│? ? ? ? ? ├─shark? ? ? ? ? ? ? ? ? ? ? 基于LLVM的JIT編譯器(官方版里沒有使用)
│? ? ? ? ? └─utilities? ? ? ? ? ? ? ? ? 一些基本的工具類
└─test? ? ? ? ? ? ? ? ? ? ? ? ? ? 單元測試
參考資料
《深入Java虛擬機》
深入Java虛擬機(原書第2版) PDF【中文版+附光盤源碼】? 下載地址:?http://www.linuxidc.com/Linux/2013-06/86222.htm
Ubuntu?14.04 LTS安裝Java 8和Eclipse 4.4??http://www.linuxidc.com/Linux/2014-11/109217.htm
Hadoop?Eclipse 插件編譯安裝1.2.0?http://www.linuxidc.com/Linux/2013-07/87428.htm
Hadoop在Eclipse中的插件編譯?http://www.linuxidc.com/Linux/2013-04/83295.htm
Hadoop 1.2.1編譯Eclipse插件?http://www.linuxidc.com/Linux/2013-10/91666.htm
Ubuntu 13.10安裝JDK、Eclipse for C/C++(解決全局菜單問題)?http://www.linuxidc.com/Linux/2013-11/92305.htm
如何在Ubuntu 14.04中安裝最新版Eclipse??http://www.linuxidc.com/Linux/2014-08/105090.htm
轉載于:https://www.cnblogs.com/davidwang456/p/5342301.html
總結
以上是生活随笔為你收集整理的在Eclipse中进行HotSpot的源码调试--转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当当网高可用架构之道--转
- 下一篇: 纷扰三月,迷离四月