這篇文章是調(diào)試虛擬機(jī)的,其實(shí)網(wǎng)上也能找到一些文章,但是每個(gè)人的環(huán)境不一樣,可能有的很順利,有的就不一樣了
但是踩了坑比較多,你才會(huì)橫向發(fā)現(xiàn)有些別人其實(shí)是沒講到位的,也就是一筆帶過的。
上一篇文章我寫了關(guān)于編譯openjdk的文章,這篇實(shí)際上是接著上一篇來的。
openjdk編譯后會(huì)成為一個(gè)可用的jdk,jdk中就包含了虛擬機(jī)。
虛擬機(jī),眾所周知,是一個(gè)讓class文件運(yùn)行的平臺(tái),那么這次調(diào)試,你可以先理解為當(dāng)class文件運(yùn)行,我們將斷點(diǎn)停留在虛擬機(jī)。
有了這個(gè)初步的感性認(rèn)識(shí)你可能好理解得多了。
來,我們一步步順著好理解的邏輯來解決這個(gè)問題。
1既然是要調(diào)試虛擬機(jī),那我們好是不是要一個(gè)ide來調(diào)試呢,由于虛擬機(jī)是c編寫的,所以我們下載一個(gè)netBeans Ide。
這里要提示兩點(diǎn),點(diǎn),下載ide的時(shí)候要下載c++版本的。第二點(diǎn)ide好下載7.0.1版本的,因?yàn)橛行┌姹緹o法跳入到斷點(diǎn),這算一個(gè)坑
你弄了半天都不知道為什么。當(dāng)然如果你是大神,你可以直接使用gdb來調(diào)試。
2在netBeans中新建基于源碼c/c++項(xiàng)目。
3找到你openjdk下關(guān)于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實(shí)際上我上篇文章編譯openjdk的那個(gè)oracle jdk1.6。至于為什么要用這個(gè)版本大家可以去查一下,
其實(shí)還有另一點(diǎn)。你電腦上如果jdk是1.8的,你的netBeanIde運(yùn)行不起來,所以低版本就好,我的是1.6.0_32。
6一直點(diǎn)下一步,在ide中會(huì)出現(xiàn)hotspot項(xiàng)目。
7右鍵點(diǎn)擊項(xiàng)目,選擇屬性,再點(diǎn)運(yùn)行,又出來三個(gè)需要配置的地方。
運(yùn)行命令的意思是,用什么去運(yùn)行什么,個(gè)什么就是gamma,這個(gè)gamma就是虛擬機(jī)程序,第二個(gè)什么就是指的你要在虛擬機(jī)上運(yùn)行的class文件。當(dāng)然class文件的運(yùn)行
實(shí)際上是為了調(diào)試虛擬機(jī),這點(diǎn)要清楚,你class都沒有運(yùn)行,怎么調(diào)試你的虛擬機(jī)呢。我的命令如下:
/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的路徑,后面的兩個(gè)是gamma的參數(shù),后的一個(gè)長路徑是你要
運(yùn)行的class文件地址。你大可寫成絕對(duì)路徑,就不用在后續(xù)的classpath地址上加這個(gè)長路徑了。
運(yùn)行目錄我填的是/usr/openjdk/hotspot/build/linux/linux_amd64_compiler2/jvmg。
環(huán)境變量如下:
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
我的是這樣的,你們可能需要對(duì)照的改一下。
后保存上面的更改。
8在下圖的文件層次結(jié)構(gòu)下找到j(luò)ava.c這個(gè)就是虛擬機(jī)的入口了,你可以先打上斷點(diǎn)。然后右擊項(xiàng)目選擇調(diào)試
9點(diǎn)了調(diào)試后會(huì)是漫長的等待,知道有一刻你發(fā)現(xiàn)斷點(diǎn)在main函數(shù)中停留了,那就說明是成功了,后運(yùn)行完畢后,可以看到控制臺(tái)的結(jié)果如下:
那就說明能調(diào)試成功了。
10現(xiàn)在你就可以將你的程序替換上面的Queens類文件了,當(dāng)你的程序運(yùn)行的時(shí)候你就可以進(jìn)一步窺探虛擬機(jī)怎么運(yùn)行的了。
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個(gè)人觀點(diǎn), 并不代表本站贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé),本站只提供參考并不構(gòu)成任何投資及應(yīng)用建議。本站是一個(gè)個(gè)人學(xué)習(xí)交流的平臺(tái),網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對(duì)作者和來源進(jìn)行了通告,但是能力有限或疏忽,造成漏登,請(qǐng)及時(shí)聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對(duì)此聲明的最終解釋權(quán)。