3這篇文章,怎么說呢。是踩了很多坑得出來了,也是在自己快要崩潰的時候得出來了的。
連續踩了差不多10來個小時的坑,還好是出來了。
這篇文章是調試虛擬機的,其實網上也能找到一些文章,但是每個人的環境不一樣,可能有的很順利,有的就不一樣了
但是踩了坑比較多,你才會橫向發現有些別人其實是沒講到位的,也就是一筆帶過的。
上一篇文章我寫了關於編譯openjdk的文章,這篇實際上是接着上一篇來的。
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類文件了,當你的程序運行的時候你就可以進一步窺探虛擬機怎么運行的了。
謝謝各位,如果看完了,希望能關注一波,寫這個東西很費時間的,文章不是重點,交個朋友才是重中之重!