2021-05-12 14:32:11
Java虛擬機器HotSpot偵錯範例
這篇文章,怎麼說呢。是踩了很多坑得出來了,也是在自己快要崩潰的時候得出來了的。連續踩了差不多10來個小時的坑,還好是出來了。
這篇文章是偵錯虛擬機器的,其實網上也能找到一些文章,但是每個人的環境不一樣,可能有的很順利,有的就不一樣了。但是踩了坑比較多,你才會橫向發現有些別人其實是沒講到位的,也就是一筆帶過的。
上一篇文章我寫了關於編譯openjdk的文章,這篇實際上是接著上一篇來的(見 http://www.linuxidc.com/Linux/2017-12/149076.htm)。
openjdk編譯後會成為一個可用的jdk,jdk中就包含了虛擬機器。虛擬機器,眾所周知,是一個讓class檔案執行的平台,那麼這次偵錯,你可以先理解為當class檔案執行,我們將斷點停留在虛擬機器。
有了這個初步的感性認識你可能好理解得多了。
來,我們一步步順著好理解的邏輯來解決這個問題。
1、既然是要偵錯虛擬機器,那我們最好是不是要一個ide來偵錯呢,由於虛擬機器是c編寫的,所以我們下載一個netBeans Ide。
這裡要提示兩點,第一點,下載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 LANG=C
中間的alt_bootdir實際上我上篇文章編譯openjdk的那個Oracle jdk1.6。至於為什麼要用這個版本大家可以去查一下,
其實還有另一點。你電腦上如果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類檔案了,當你的程式執行的時候你就可以進一步窺探虛擬機器怎麼執行的了。
謝謝各位,如果看完了,希望能關注一波,寫這個東西很費時間的,文章不是重點,交個朋友才是重中之重!
在Eclipse中進行HotSpot的原始碼偵錯 http://www.linuxidc.com/Linux/2015-05/117250.htm
Ubuntu 14.04下Java虛擬機器(HOTSPOT)原始碼編譯步驟 http://www.linuxidc.com/Linux/2016-04/130484.htm
CentOS上編譯OpenJDK8原始碼及在Eclipse上偵錯HotSpot虛擬機器原始碼 http://www.linuxidc.com/Linux/2017-06/144713.htm
相關文章