什麼原因導致我們無法調試源碼的時候無法追蹤局部變量的值?
1.因爲在我們通常在oracle官網下載的jdk源碼包的時候,官網默認對rt.jar中類編譯的時候,默認去除了調試信息,使得jar包的體積變得較小,因此我們在本地調試jdk源碼的時候不會顯示局部變量的值
2.我們看一下現象:
從圖中可以看出,局部變量值不可獲得
3.解決方案很明顯了,我們只要手動重新編譯一下jdk的源碼包,帶上調試信息即可解決方案-windows系統
1.首先我們找到jdk的根目錄,進入找到源碼包
src.jar
,解壓該文件,一般我們只需要調試java,javax,org
三個目錄下的源碼,如果你需要調試其他包下面的源碼,請保留相應目錄,刪除剩餘目錄即可。解壓後的路徑爲:jdk根目錄/jdk_src2.打開命令行,進入到jdk根目錄,鍵入:
dir /B /S /X jdk_src*.java > filelist.txt //目的是列出我們剛剛解壓出的所有java文件絕對路徑清單3.重新編譯我們需要的源碼,加入調試信息,首先進入jdk根目錄,創建jdk_debug目錄,打開命令行,進入到jdk根目錄,鍵入:
javac -J-Xms16m -J-Xmx1024m -sourcepath jdk_src -cp jre\lib\rt.jar -d jdk_debug -g @filelist.txt >>log.txt 2>&1 //這裏需要注意,我們需要用當前版本jdk的去編譯,不要跨版本編譯(eg.1.7去編譯1.8的jdk),命令大致解釋如下:我們編譯剛剛在jdk_src目錄下列在filelist中的java類到jdk_debug目錄下,並把輸出日誌打在log.txt文件中4.在jdk_debug目錄下打開命令行,鍵入:
jar cf0 rt_debug.jar * 打包該目錄下的文件到rt_debug.jar5.把這個生成的rt_debug.jar包複製到JDK_HOME\jre\lib\endorsed。如果沒有endorsed目錄,自己創建一下。
6.再去嘗試調試源碼,發現局部變量可以追蹤了
解決方案-mac系統
1.方法類似相同,只有第二點有區別,鍵入:
ls -R ./jdk_src -R|sed s#^#pwd
# |grep ‘.java$’ >filelist.txt備註
1.intellij idea 15.*以上的版本默認支持局部變量的debug追蹤功能,可以不進行jdk源碼的重新編譯
參考資料:
(http://stackoverflow.com/questions/18255474/debug-jdk-source-cant-watch-variable-what-it-is)
(http://blog.csdn.net/appleprince88/article/details/21873807)
轉載請申明出處