調試HotSpot源代碼(配視頻)


本文將詳細介紹在Ubuntu16.04 LTS上對OpenJDK8進行編譯,為了方便大家快速搭建起OpenJDK8的調試開發環境,我還錄制了對應的視頻放到了B站上,大家可以參考。 

視頻地址:https://space.bilibili.com/27533329 

下面我們開始環境的搭建過程。 

之前的文章在Ubuntu 16.04上編譯OpenJDK8的源代碼 已經介紹過在Ubuntu上編譯OpenJDK8的源代碼,這一篇將介紹在Ubuntu上調試OpenJDK8源代碼的2種方式。 

在Linux上常用GDB調試C/C++源代碼。使用GDB運行如上實例生成的Class文件,具體命令如下:

gdb --args ./build/linux-x86_64-normal-server-slowdebug/jdk/bin/java Test

進入GDB后,輸入如下命令: 

break java.c:JavaMain
continue

第一條命令表示在源文件java.c的JavaMain函數入口處設置斷點;第二條命令表示讓中斷的程序繼續運行,直到運行完程序后退出GDB,並在終端打印”Hello World!“信息。
下面介紹一些常用的GDB命令,如下表所示。 

命令

描述

backtrace(bt)

查看各級函數調用及參數

finish

連續運行到當前函數返回為止,然后停下來等待命令

frame(f) n

從當前棧幀移到到n棧幀

info(i) locals

查看當前棧幀局部變量的值

list(l)

列出源代碼,接着上次的位置往下列,每次列10行ll

list(l)  行號

列出從指定行開始的源代碼

list(l) 函數名

列出指定的函數的源代碼

next(n)

執行下一行語句

print(p)

打印表達式的值,通過表達式可以修改變量的值或者調用函數

quit(q)

退出gdb調試環境

step(s)

執行下一行語句,如果有函數調用則進入到函數中

start

開始執行程序,停在main函數第一行語句前面等待命令

break(b) 行號

在指定行設置斷點

break 函數名

在指定函數的開頭設置斷點

break ... if ...

設置條件斷點

continue(c)

從當前位置開始連續運行程序

delete breakpoints 斷點號

刪除斷點

display 變量名

跟蹤查看指定變量名的變量,每次停下來都顯示它的值

disable breakpoints 斷點號

禁用斷點

enable 斷點號

啟用斷點

info(i) breakpoints

查看當前設置了哪些斷點

run(r)

從頭開始連續運行程序

undisplay 跟蹤顯示號

取消跟蹤顯示

watch

設置觀察點

info(i) watchpoints

查看當前設置了哪些觀察點

x

從某個位置開始打印存儲單元的內容,全部當成字節來看,

而不區分哪個字節屬於哪個變量

 

1.下載安裝Eclipse並安裝C/C++插件

在 https://www.eclipse.org/downloads 網站上下載支持Ubuntu 64位版本操作系統的Eclipse,筆者下載的壓縮包名稱為eclipse-java-neon-3-linux-gtk-x86_64.tar.gz,通過如下命令解壓后得到eclipse目錄。命令如下:​

tar -zxvf eclipse-java-neon-3-linux-gtk-x86_64.tar.gz

在運行Eclispe之前還需要配置環境變量,如下: 

export JAVA_HOME=/home/mazhi/workspace/jdk1.7.0_72
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib在

切換到eclipse目錄后,運行如下命令啟動Eclipse。命令如下: 

./eclipse &

啟動Eclipse后,單擊help菜單項,選擇Eclipse Marketplace選項后,彈出Eclipse Marketplace對話框,搜索"c++"找到Eclipse C++ IDE..安裝。安裝完成后就可以創建及導入C/C++項目到Eclipse中了。

或者下載專門開發C/C++的Eclipse集成環境,例如筆者下載的壓縮包名稱為eclipse-cpp-helios-SR1-linux-gtk-x86_64.tar.gz,解壓后以類似的方式啟動。不過在啟動Eclipse之前,需要指定JDK路徑,編譯安裝目錄下的eclipse.ini文件,如下: 

openFile
-vm
/home/mazhi/workspace/jdk1.7.0_72/bin
-vmargs
-Dosgi.requiredJavaVersion=1.5
-XX:MaxPermSize=256m
-Xms40m
-Xmx384m

在openFile和-vmargs之間配置-vm和/home/mazhi/workspace/jdk1.7.0_72/bin即可。不過通過eclipse-java-neon-3-linux-gtk-x86_64.tar.gz壓縮包安裝的Eclispe需要jdk1.8版本,只需要換個1.8的版本即可。

2.導入HotSpot源代碼

單擊help菜單項,選擇new->Other...后,在彈出的New對話框中選擇Makefile Project with Existing Code,然后單擊“Next”,添寫相關的信息,如下圖所示。​

 

設置完成后單擊“Finish”即可。

3.配置及調試源代碼

在HotSpot項目上右擊,選擇Debug As -> Debug Configurations...,在彈出的Debug Configurations對話框中,選擇C/C++ Application后,右擊,在彈出的菜單中選擇New Configuration后,在右側的Main選項卡中配置相關的信息,如下圖所示。

 切換到Arguments選項卡, 在Program arguments文本框中輸入虛擬機運行時的參數,這里運行之前的實例,具體參數如下:

com.test/Test

切換到Environment選項卡, 添加變量:​  

JAVA_HOME=/home/mazhi/workspace/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/
CLASSPATH=.:/home/mazhi/workspace/project/bin

CLASSPATH指定Test.class文件所在的目錄。設置完相關信息后,單擊Apply進行保存。  

https://code.visualstudio.com官網上下載Visual Studio Code,筆者下載的是"code_1.51.0-1604600753_amd64.deb"版本。安裝完成后通過單擊File -> OpenFolder選項,選中hotspot文件夾,點擊左側導航欄中的Run(Ctrl+Shift+D)圖標切換到對應選項欄,單擊add configuration選項后選中c/c++: (gdb) 啟動,修改lauch.json文件,所有的配置都通過這個文件完成,筆者的配置文件詳細內容如下: 

{
    "version": "0.2.0",
    "configurations": [        
        {
            "name": "HotSpot Linux Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "/home/mazhi/workspace/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk/bin/java",
            "args": ["com.test/Test"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [
                {"name":"JAVA_HOME","value":"/home/mazhi/workspace/openjdk/build/linux-x86_64-normal-server-slowdebug/jdk"},
                {"name":"CLASSPATH","value":".:/home/mazhi/workspace/projectjava/projectjava01/bin"}
            ],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "為 gdb 啟用整齊打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

主要關注"configurations"中的"program"、"args"、"environment"配置項,這幾個其實在Eclipse中都指定過,"program"就是指定C/C++應用程序的位置,而"environment"就是配置的環境變量,"args”是為虛擬機運行配置參數。 

可以在hotspot/src/share/vm/prims/jni.cpp文件下的JNI_CreateJavaVM()函數上打個斷點,然后在run(Ctrl+Shift+D)選項欄中選中"HotSpot Linux Debug"進行調試即可。

推薦文章: 

1、在Ubuntu 16.04上編譯OpenJDK8的源代碼(配視頻) 

搭建過程中如果有問題可直接評論留言或加作者微信mazhimazh。

作者持續維護的個人博客  classloading.com

關注公眾號,有HotSpot源碼剖析系列文章!

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM