1. 程式人生 > >調試JDK1.8源碼的方法

調試JDK1.8源碼的方法

port 失敗 r文件 pop xmx deb 新的 xms filelist

背景
在學習JDK源碼的時候,免不了需要調試JDK的源碼。
比如:想理解ConcurrentHashMap的put(K k, V v)方法,JDK自帶的rt.jar文件是支持斷點調試,但是卻看不到變量的具體值,對於理解實現非常不方便。
如下:

package org.github.thread;

import java.util.concurrent.ConcurrentHashMap;

public class Test28 {

    public static void main(String[] args) {
        ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
        map.put("sdf", "ac");
        System.out.println(map);
    }
}

在map.put(“sdf”, “ac”)處增加斷點,然後進入put方法裏面看具體的執行過程。

技術分享

有兩個比較明顯的問題(1)put的參數變量命名也變成了arg0,arg1和arg2(2)變量值也看不到。

技術分享

步驟
只要是制作一個可調試的rt.jar
(1)創建兩個目錄d:\jdk_src和d:\jdk_rt
(2)將src.zip解壓到d:\jdk_src目錄
(3)執行命名dir /B /S /X *.java > filelist.txt 生成filelist.txt文件
要查看一下,自動生成的filelist.txt中是否有內容哦,沒有數據的話下面的操作是沒用的
(4)把JDK安裝目錄(復制src.zip的那個目錄)下jre/lib下的rt.jar復制到jdk_src\src目錄下
(5)生成一些可調試的class文件夾
執行命令: javac -J-Xms16m -J-Xmx1024m -sourcepath D:\jdk_src\src -cp D:\jdk_src\src\rt.jar -d D:\jdk_rt -g @filelist.txt > log.txt 2>&1
成功後,jdk_rt文件夾會產生一些可調試的class文件夾,如果沒有,請打開jdk_src/log.txt,ctrl+F查找“錯誤”,並解決。
一般,將報錯的java路徑及路徑對應的文件刪除,再執行dir /B /S /X *.java > filelist.txt即可。
(6)將這些文件打包成Jar
執行命令:
jar cf0 rt_debug.jar *
(7)替換原rt.jar為新的rt_debug.jar
備註:如果替換rt.jar運行失敗,可以從原rt.jar拷貝相關的class文件到新rt-bubug.jar文件對應的地方。
如:我在替換rt.jar的過程中遇到運行java程序報錯Error occurred during initialization of VM java/lang/NoClassDefFoundError: sun/misc/Cleaner
然後打開rt.jar和rt-debug.jar的文件發現,rt-debug.jar裏面確實少了sun相關的目錄,我就把原來的全部拷貝到新的裏面,運行就OK了。
bebug中修改變量的值:當在debug模式下調試到斷點時,在“Variables”視圖中的“Value”欄中直接修改變量的值,即可。

調試JDK1.8源碼的方法