1.一種Java字節(jié)碼調(diào)試器,其特征在于,包括符號庫模塊、緩存模塊、調(diào)試模塊、棧解析模塊和引用解析模塊,其中:
符號庫模塊,用于從Java源代碼文件中獲取符號信息,并存放符號信息;
緩存模塊,用于從Java字節(jié)碼文件中獲取符號信息和數(shù)據(jù)信息,并緩存符號信息和數(shù)據(jù)信息;
調(diào)試模塊,用于通過Keil通道與虛擬機連接,使得Java字節(jié)碼文件可在虛擬機上運行并調(diào)試,其中,用戶直接在Java字節(jié)碼上設置斷點,調(diào)試模塊將該斷點同步到Keil通道進行調(diào)試,調(diào)試結束后,調(diào)試模塊通過Keil通道將運行到斷點位置的虛擬機的存儲器中的Java棧提取出來發(fā)送到棧解析模塊;
棧解析模塊,用于接收運行到斷點位置的虛擬機的存儲器中的Java棧,并對Java棧進行解析,其中,解析結果包括執(zhí)行到斷點位置時應用程序?qū)腏ava函數(shù)的調(diào)用關系、函數(shù)參數(shù)信息、函數(shù)局部變量值和地址信息中的至少一個;
引用解析模塊,用于對執(zhí)行到斷點位置時Java字節(jié)碼對應的Java引用進行解析,其中,如果Java引用指向一個Java對象,根據(jù)Java對象的存儲方式和規(guī)則進行解析,解析出這個Java對象所屬的Java類別及其對應的狀態(tài)、擁有者和域值中的至少一個;如果Java引用指向一個數(shù)組,則解析出這個數(shù)組元素的類型和所有元素的值。
2.如權利要求1所述的一種Java字節(jié)碼調(diào)試器,其特征在于,還包括靜態(tài)變量解析模塊,用于對Java字節(jié)碼中的靜態(tài)變量進行解析,并允許開發(fā)者在任意時刻選擇任意一個靜態(tài)變量進行解析和查看。
3.一種Java字節(jié)碼調(diào)試方法,其特征在于,包括:
步驟S1、從Java源代碼文件中提取字符信息,創(chuàng)建字符庫模塊;
步驟S2、從Java字節(jié)碼文件中提取符號信息和數(shù)據(jù)值,建立緩存模塊;
步驟S3、在Keil μVision集成開發(fā)環(huán)境中,配置Keil通道使其分別與Java字節(jié)碼調(diào)試器的調(diào)試模塊和虛擬機建立通信連接;
步驟S4、用戶直接在Java字節(jié)碼上設置斷點,該斷點被同步到Keil通道來執(zhí)行調(diào)試動作;
步驟S5、調(diào)試結束后,Keil通道將運行到斷點位置的虛擬機的存儲器中對應的Java棧整個提取出來發(fā)送到棧解析模塊;
步驟S6、棧解析模塊接收執(zhí)行到斷點位置的虛擬機的存儲器中對應的Java棧,通過訪問和加載緩存模塊中符號信息和數(shù)據(jù)信息來對Java棧進行解析;
步驟S7、引用解析模塊通過訪問和加載緩存模塊中符號信息和數(shù)據(jù)信息來對執(zhí)行到斷點位置的Java字節(jié)碼對應的Java引用進行解析;
步驟S8、用戶通過步驟S6的解析結果和步驟S7的解析結果對執(zhí)行到當前斷點的Java字節(jié)碼中的函數(shù)信息、變量信息及引用對象進行查看。
4.如權利要求3所述的Java字節(jié)碼調(diào)試方法,其特征在于,步驟S1中以方法為單位對從Java源代碼文件中獲取的符號信息進行組織,生成符號文件來創(chuàng)建字符庫模塊;其中,符號文件的文件名與Java字節(jié)碼文件中的方法全名相對應,符號文件的文件名依次包括包名、類名、方法名、參數(shù)編碼和返回值編碼;符號文件的內(nèi)容包括方法的源代碼起始行號、方法體的起始行號、方法體的終止行號、所有函數(shù)的參數(shù)信息和所有函數(shù)的局部變量信息。
5.如權利要求3所述的Java字節(jié)碼調(diào)試方法,其特征在于,步驟S2采用四級緩存的方式對從Java字節(jié)碼文件中提取符號信息和數(shù)據(jù)值進行緩存,四級緩存從上到下依次為系統(tǒng)緩存、包緩存、類緩存和方法緩存。
6.如權利要求3所述的Java字節(jié)碼調(diào)試方法,其特征在于,步驟S4中的調(diào)試動作包括單步執(zhí)行、跳進執(zhí)行、跳出執(zhí)行和執(zhí)行到光標處中的至少一個。
7.如權利要求3所述的Java字節(jié)碼調(diào)試方法,其特征在于,還包括在步驟S4和S5之間的Java字節(jié)碼調(diào)試器對虛擬機中的存儲器進行存儲訪問的步驟,該步驟中,通過將執(zhí)行存儲訪問任務所需要的函數(shù)信息和Keil通道信息以DLL文件統(tǒng)一到虛擬機代碼體系,再由Java字節(jié)碼調(diào)試器對其進行調(diào)用來實現(xiàn);其中,DLL文件由GNU makefile平臺調(diào)用VC編譯器和鏈接器,對實現(xiàn)存儲訪問任務所需要的文件進行編譯和鏈接來生成;實現(xiàn)存儲訪問任務所需要的文件包括:Keil工程中定義的除.c或.h文件中定義的宏之外的其他宏的.mak文件、Keil工程中定義的所有包含路徑的.mak文件、Keil工程中Java字節(jié)碼調(diào)試器需要的.c文件的.mak文件、屏蔽Keil工程中有而VC環(huán)境不支持的關鍵字的.h文件、定義對虛擬機中的存儲器進行尋址和存儲訪問的.c文件、定義計算Java數(shù)組或Java對象大小的.c文件和定義所有被Java字節(jié)碼調(diào)試器調(diào)用的函數(shù)、全局變量或宏等的.c文件。
8.如權利要求5所述的Java字節(jié)碼調(diào)試方法,其特征在于,步驟S6中對緩存模塊的訪問和加載過程包括:
當用戶對系統(tǒng)緩存進行首次訪問時,加載并生成所有的包對象;
當用戶對每個包緩存進行首次訪問時,加載該包中類庫的所有內(nèi)容,包括所有類的類信息和所有方法的方法信息;
當用戶對每個類對象進行首次訪問時,由類組件從類庫獲取并生成該類對象所屬包內(nèi)的所有類對象;
當用戶對每個方法對象進行首次訪問時,由方法組件從類庫獲取并生成該方法對象所屬包內(nèi)的所有方法對象。
9.如權利要求3所述的Java字節(jié)碼調(diào)試方法,其特征在于,還包括:用戶根據(jù)調(diào)試返回的信息在Java字節(jié)碼文件中進行關鍵字搜索的步驟,以對導致程序運行異常的函數(shù)參數(shù)或局部變量等信息進行修改和確認,該步驟以包為單位進行關鍵字的搜索任務,當需要對某個包中的方法進行首次搜索時,先掃描整個Java字節(jié)碼文件,將Java字節(jié)碼文件中與該包相關的信息提取到一個緩存中,再從該緩存對該包進行搜索,搜索結果被顯示在列表框中,雙擊即可將光標定位到Java字節(jié)碼文件中相應的行。
10.如權利要求3或9所述的Java字節(jié)碼調(diào)試方法,其特征在于,還包括:在Java字節(jié)碼文件和Java源代碼文件之間進行雙向定位的步驟。