hotspot虛擬機的調試

這篇文章是調試虛擬機的,其實網上也能找到一些文章,但是每個人的環境不一樣,可能有的很順利,有的就不一樣了

但是踩了坑比較多,你才會橫向發現有些別人其實是沒講到位的,也就是一筆帶過的。

上一篇文章我寫了關於編譯openjdk的文章,這篇實際上是接著上一篇來的。

openjdk編譯後會成為一個可用的jdk,jdk中就包含了虛擬機。

虛擬機,眾所周知,是一個讓class文件運行的平台,那麼這次調試,你可以先理解為當class文件運行,我們將斷點停留在虛擬機。

有了這個初步的感性認識你可能好理解得多了。

來,我們一步步順著好理解的邏輯來解決這個問題。

1既然是要調試虛擬機,那我們最好是不是要一個ide來調試呢,由於虛擬機是c編寫的,所以我們下載一個netBeans Ide。

Advertisements

這裡要提示兩點,第一點,下載ide的時候要下載c++版本的。第二點ide最好下載7.0.1版本的,因為有些版本無法跳入到斷點,這算一個坑

你弄了半天都不知道為什麼。當然如果你是大神,你可以直接使用gdb來調試。

2在netBeans中新建基於源碼c/c++項目。

3找到你openjdk下關於hotspot的源碼文件夾,並填好,以及選擇定製

4寫上hotspotmake目錄下makefile的路徑

5下一步要填寫一些生成命令,我的是如下:

${MAKE} -f Makefile clean jvmg ALT_BOOTDIR=/usr/java/jdk1.6.0_32 ARCH_DATA_MODEL=64

中間的alt_bootdir實際上我上篇文章編譯openjdk的那個oracle jdk1.6。至於為什麼要用這個版本大家可以去查一下,

Advertisements

其實還有另一點。你電腦上如果jdk是1.8的,你的netBeanIde運行不起來,所以低版本就好,我的是1.6.0_32。

6一直點下一步,在ide中會出現hotspot項目。

7右鍵點擊項目,選擇屬性,再點運行,又出來三個需要配置的地方。

運行命令的意思是,用什麼去運行什麼,第一個什麼就是gamma,這個gamma就是虛擬機程序,第二個什麼就是指的你要在虛擬機上運行的class文件。當然class文件的運行

實際上是為了調試虛擬機,這點要清楚,你class都沒有運行,怎麼調試你的虛擬機呢。我的命令如下:

/usr/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg/gamma -XX:StopInterpreterAt=1 -version /usr/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg/Queens

注意中間的空格,gamma是hotspot源代碼編譯後生成的,要生成后才有,但是你要找到你gamma的路徑,後面的兩個是gamma的參數,最後的一個長路徑是你要

運行的class文件地址。你大可寫成絕對路徑,就不用在後續的classpath地址上加這個長路徑了。

運行目錄我填的是/usr/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg。

環境變數如下:

JAVA_HOME :/usr/java/jdk1.6.0_32

CLASSPATH:.:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar

LD_LIBRARY_PATH: /usr/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg

我的是這樣的,你們可能需要對照的改一下。

最後保存上面的更改。

8在下圖的文件層次結構下找到java.c這個就是虛擬機的入口了,你可以先打上斷點。然後右擊項目選擇調試

9點了調試後會是漫長的等待,知道有一刻你發現斷點在main函數中停留了,那就說明是成功了,最後運行完畢后,可以看到控制台的結果如下:

那就說明能調試成功了。

10現在你就可以將你的程序替換上面的Queens類文件了,當你的程序運行的時候你就可以進一步窺探虛擬機怎麼運行的了。

Advertisements

你可能會喜歡