專利名稱:虛擬機(jī)環(huán)境下的程序調(diào)試方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及程序調(diào)試技術(shù)領(lǐng)域。更具體地,本發(fā)明涉及在不重啟虛擬機(jī)的情況下對程序進(jìn)行調(diào)試的技木。
背景技術(shù):
虛擬機(jī)(Virtual Machine)指通過軟件模擬的能夠運(yùn)行程序的物理機(jī)器。虛擬機(jī)通常分為兩類系統(tǒng)虛擬機(jī)(System VM)以及進(jìn)程虛擬機(jī)(Process VM)。系統(tǒng)虛擬機(jī),又被稱為“硬件虛擬機(jī)”(Hardware VM),是指提供了支持整個操作系統(tǒng)運(yùn)行的完整系統(tǒng)平臺的虛擬機(jī)。而進(jìn)程虛擬機(jī),又被稱為“應(yīng)用虛擬機(jī)”(Application VM),其作為ー個主操作系統(tǒng)(Host OS)內(nèi)的普通應(yīng)用運(yùn)行,并且支持單ー進(jìn)程(Process)??梢院唵蔚貙⑦M(jìn)程虛擬機(jī)理解為模擬了中央處理器CPU功能。一個進(jìn)程虛擬機(jī)可能同時處理多個應(yīng)用程序的多個 線程(Threads)。而為了對ー個進(jìn)程虛擬機(jī)上運(yùn)行的某個程序進(jìn)行調(diào)試(Debug),就必須重新啟動整個虛擬機(jī)將其切換至調(diào)試模式,在調(diào)試結(jié)束時,還要重新啟動整個虛擬機(jī)將其切換至正常運(yùn)行模式(或產(chǎn)品模式)。此外,在對ー個程序進(jìn)行調(diào)試的過程中,必須將該虛擬機(jī)上正在運(yùn)行的其它程序的相應(yīng)線程掛起(Suspend),這使得對虛擬機(jī)上部署的某個或某些程序的調(diào)試會嚴(yán)重影響整個系統(tǒng)的運(yùn)行?,F(xiàn)有技術(shù)中存在兩種解決上述問題的技術(shù)方案。其一,為了避免對虛擬機(jī)進(jìn)行模式切換,僅僅使用日志文件(Log)來對程序運(yùn)行過程中出現(xiàn)的問題進(jìn)行診斷。這種技術(shù)方案的缺點是用于診斷程序問題的信息量太少,由于無法獲得足夠的信息而導(dǎo)致不能完全發(fā)現(xiàn)程序中存在的問題(Bug)。其ニ,將整個虛擬機(jī)同時運(yùn)行在調(diào)試模式和正常模式兩種模式下,在需要對虛擬機(jī)上的某個程序進(jìn)行調(diào)試時就直接切換至調(diào)試模式,此時正常模式仍然在運(yùn)行中,因此無需重啟整個虛擬機(jī),該虛擬機(jī)上的其它程序的運(yùn)行也不受影響。但是該解決方案的缺點主要有兩個一是同時運(yùn)行虛擬機(jī)的兩種模式會耗費大量的系統(tǒng)資源;ニ是實現(xiàn)該解決方案需要修改虛擬機(jī)的底層代碼,既需要耗費虛擬機(jī)產(chǎn)品開發(fā)者大量的精力,也可能不符合虛擬機(jī)產(chǎn)品規(guī)范。
發(fā)明內(nèi)容
考慮到上述存在的問題,本發(fā)明的目的之ー在于提供一種無需修改虛擬機(jī)代碼而對虛擬機(jī)上的程序進(jìn)行調(diào)試的方法或系統(tǒng)。本發(fā)明的目的之ニ在于提供一種無需重啟虛擬機(jī)或停止虛擬機(jī)上運(yùn)行的其它程序線程,而動態(tài)地對程序進(jìn)行調(diào)試的方法或系統(tǒng)。根據(jù)本發(fā)明的ー個方面,提供了一種用于虛擬機(jī)環(huán)境下的程序調(diào)試方法,所述程序運(yùn)行于所述虛擬機(jī)上,所述方法包括接收對程序進(jìn)行調(diào)試的請求;為所述程序的待調(diào)試代碼行注入調(diào)試邏輯代碼;以及運(yùn)行經(jīng)注入調(diào)試邏輯代碼的程序代碼,以對該程序進(jìn)行調(diào)試。根據(jù)本發(fā)明的另一方面,提供了一種用于虛擬機(jī)環(huán)境下的程序調(diào)試系統(tǒng),所述程序運(yùn)行于所述虛擬機(jī)上,所述系統(tǒng)包括調(diào)試請求接收裝置,被配置為調(diào)試接收對程序進(jìn)行調(diào)試的請求;注入裝置,被配置為向所述程序的待調(diào)試代碼行注入調(diào)試邏輯代碼;以及調(diào)試裝置,被配置為運(yùn)行經(jīng)注入調(diào)試邏輯代碼的程序代碼,以對該程序進(jìn)行調(diào)試。根據(jù)本發(fā)明的方法和系統(tǒng),通過注入調(diào)試邏輯代碼并運(yùn)行經(jīng)注入后的代碼,可以實現(xiàn)在無需重啟虛擬機(jī),以及無需停止虛擬機(jī)上運(yùn)行的其它程序線程的情況下,動態(tài)地對程序進(jìn)行調(diào)試,并且無需對虛擬機(jī)本身代碼作出修改。需要強(qiáng)調(diào)的是,如無特別指出,本發(fā)明中提到的“虛擬機(jī)”均為“進(jìn)程虛擬機(jī),,(Process VM)。
通過對結(jié)合附圖所示出的實施方式進(jìn)行詳細(xì)說明,本發(fā)明的上述以及其他特征將更加明顯,本發(fā)明附圖中相同的標(biāo)號表示相同或相似的部件。在 附圖中,圖I示出了適于用來實現(xiàn)本發(fā)明實施方式的示例性計算系統(tǒng)100的框圖。圖2A示出了根據(jù)本發(fā)明一個實施例的用于虛擬機(jī)環(huán)境下的程序調(diào)試方法的流程圖;圖2B示出了根據(jù)本發(fā)明一個實施例的基于JVM環(huán)境的調(diào)試代理的代碼實例;圖2C示出了根據(jù)本發(fā)明一個實施例的基于JVM環(huán)境的調(diào)試邏輯代碼的具體代碼實例;圖3A示出了根據(jù)本發(fā)明另ー實施例的用于虛擬機(jī)環(huán)境下的程序調(diào)試方法的流程圖;圖3B示出了根據(jù)本發(fā)明一實施例的用于移除調(diào)試邏輯代碼的具體代碼實例;圖4示出了根據(jù)本發(fā)明一個實施例的用于虛擬機(jī)環(huán)境下的程序調(diào)試系統(tǒng)的模塊化框圖;圖5示出了根據(jù)本發(fā)明另ー實施例的用于虛擬機(jī)環(huán)境下的程序調(diào)試系統(tǒng)的模塊化框圖;圖6示出了根據(jù)本發(fā)明一實施例的用于虛擬機(jī)環(huán)境下的程序調(diào)試系統(tǒng)的概要架構(gòu)圖。
具體實施例方式在下文中,將參考附圖通過實施方式對本發(fā)明提供的用于虛擬機(jī)環(huán)境下的程序調(diào)試的方法和系統(tǒng)進(jìn)行詳細(xì)地描述。所屬技術(shù)領(lǐng)域的技術(shù)人員知道,本發(fā)明的多個方面可以體現(xiàn)為系統(tǒng)、方法或計算機(jī)程序產(chǎn)品。因此,本發(fā)明的多個方面可以具體實現(xiàn)為以下形式,即,可以是完全的硬件、完全的軟件(包括固件、駐留軟件、微代碼等)、或者本文一般稱為“電路”、“模塊”或“系統(tǒng)”的軟件部分與硬件部分的組合。此外,本發(fā)明的多個方面還可以采取體現(xiàn)在ー個或多個計算機(jī)可讀介質(zhì)中的計算機(jī)程序產(chǎn)品的形式,該計算機(jī)可讀介質(zhì)中包含計算機(jī)可用的程序碼??梢允褂靡粋€或多個計算機(jī)可讀的介質(zhì)的任何組合。計算機(jī)可讀介質(zhì)可以是計算機(jī)可讀信號介質(zhì)或者計算機(jī)可讀存儲介質(zhì)。計算機(jī)可讀存儲介質(zhì)例如可以是——但不限于——電的、磁的、光的、電磁的、紅外線的、或半導(dǎo)體的系統(tǒng)、裝置、器件或任何以上的組合。計算機(jī)可讀存儲介質(zhì)的更具體的例子(非窮舉的列表)包括以下有一個或多個導(dǎo)線的電連接、便攜式計算機(jī)磁盤、硬盤、隨機(jī)存取存儲器(RAM)、只讀存儲器(ROM)、可擦式可編程只讀存儲器(EPR0M或閃存)、光纖、便攜式緊湊磁盤只讀存儲器(CD-ROM)、光存儲器件、磁存儲器件、或者上述的任何合適的組合。在本文件的語境中,計算機(jī)可讀存儲介質(zhì)可以是任何包含或存儲程序的有形的介質(zhì),該程序被指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用。計算機(jī)可讀的信號介質(zhì)可包括在基帶中或者作為載波一部分傳播的、其中體現(xiàn)計算機(jī)可讀的程序碼的傳播的數(shù)據(jù)信號。這種傳播的信號可以采用多種形式,包括——但不限于——電磁信號、光信號或任何以上合適的組合。計算機(jī)可讀的信號介質(zhì)可以是并非為計算機(jī)可讀存儲介質(zhì)、但是能發(fā)送、傳播或者傳輸用于由指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用的程序的任何計算機(jī)可讀介質(zhì)。計算機(jī)可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括——但不限于——無線、電線、光纜、RF等等,或者任何合適的上述組合。計算機(jī)可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括——但不限于——無線、電線、光纜、RF等等,或者任何合適的上述組合。 用于執(zhí)行本發(fā)明的操作的計算機(jī)程序碼,可以以ー種或多種程序設(shè)計語言的任何組合來編寫,所述程序設(shè)計語言包括面向?qū)ο蟮某绦蛟O(shè)計語言-諸如Java、Smalltalk、C++之類,還包括常規(guī)的過程式程序設(shè)計語言-諸如” C”程序設(shè)計語言或類似的程序設(shè)計語言。程序碼可以完全地在用戶的計算上執(zhí)行、部分地在用戶的計算機(jī)上執(zhí)行、作為ー個獨立的軟件包執(zhí)行、部分在用戶的計算機(jī)上部分在遠(yuǎn)程計算機(jī)上執(zhí)行、或者完全在遠(yuǎn)程計算機(jī)或服務(wù)器上執(zhí)行。在后一種情形中,遠(yuǎn)程計算機(jī)可以通過任何種類的網(wǎng)絡(luò)——包括局域網(wǎng)(LAN)或廣域網(wǎng)(WAN)-連接到用戶的計算機(jī),或者,可以(例如利用因特網(wǎng)服務(wù)提供商來通過因特網(wǎng))連接到外部計算機(jī)。以下參照按照本發(fā)明實施例的方法、裝置(系統(tǒng))和計算機(jī)程序產(chǎn)品的流程圖和/或框圖描述本發(fā)明的多個方面。要明白的是,流程圖和/或框圖的每個方框以及流程圖和/或框圖中各方框的組合,都可以由計算機(jī)程序指令實現(xiàn)。這些計算機(jī)程序指令可以提供給通用計算機(jī)、專用計算機(jī)或其它可編程數(shù)據(jù)處理裝置的處理器,從而生產(chǎn)出ー種機(jī)器,使得通過計算機(jī)或其它可編程數(shù)據(jù)處理裝置執(zhí)行的這些指令,產(chǎn)生實現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的裝置。也可以把這些計算機(jī)程序指令存儲在能指令計算機(jī)或其它可編程數(shù)據(jù)處理裝置以特定方式工作的計算機(jī)可讀介質(zhì)中,這樣,存儲在計算機(jī)可讀介質(zhì)中的指令產(chǎn)生ー個包括實現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的指令裝置(instruction means)的制造品。也可以把計算機(jī)程序指令加載到計算機(jī)或其它可編程數(shù)據(jù)處理裝置上,使得在計算機(jī)或其它可編程數(shù)據(jù)處理裝置上執(zhí)行一系列操作步驟,以產(chǎn)生計算機(jī)實現(xiàn)的過程,從而在計算機(jī)或其它可編程裝置上執(zhí)行的指令就提供實現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的過程?,F(xiàn)在參看圖1,圖I示出了適于用來實現(xiàn)本發(fā)明實施方式的示例性計算系統(tǒng)100的框圖。如所示,計算機(jī)系統(tǒng)100可以包括CPU(中央處理單元)101、RAM(隨機(jī)存取存儲器)102、ROM(只讀存儲器)103、系統(tǒng)總線104、硬盤控制器105、鍵盤控制器106、串行接ロ控制器107、并行接ロ控制器108、顯示控制器109、硬盤110、鍵盤111、串行外部設(shè)備112、并行外部設(shè)備113和顯示器114。在這些設(shè)備中,與系統(tǒng)總線104耦合的有CPU 101、RAM102、ROM 103、硬盤控制器105、鍵盤控制器106、串行控制器107、并行控制器108和顯示控制器109。硬盤110與硬盤控制器105耦合,鍵盤111與鍵盤控制器106耦合,串行外部設(shè)備112與串行接ロ控制器107耦合,并行外部設(shè)備113與并行接ロ控制器108耦合,以及顯示器114與顯示控制器109耦合。應(yīng)當(dāng)理解,圖I所述的結(jié)構(gòu)框圖僅僅為了示例的目的而示出的,而不是對本發(fā)明范圍的限制。在某些情況下,可以根據(jù)具體情況而增加或者減少某些設(shè)備。圖2示出了根據(jù)本發(fā)明一個實施例的用于虛擬機(jī)環(huán)境下的程序調(diào)試方法的流程圖。圖2所示的方法運(yùn)行在進(jìn)程虛擬機(jī)(Process VM)環(huán)境下,進(jìn)程虛擬機(jī)所執(zhí)行的字節(jié)碼的類型可能有多種,例如進(jìn)程虛擬機(jī)可以執(zhí)行Java字節(jié)碼的程序JVM、也可以執(zhí)行C#字節(jié)碼的程序(.NET平臺)以及其它基于腳本語言實現(xiàn)的字節(jié)碼等。進(jìn)程虛擬機(jī)所執(zhí)行的具體的字節(jié)碼類型并不影響本發(fā)明技術(shù)構(gòu)思的實現(xiàn),其原因是進(jìn)程虛擬機(jī)所執(zhí)行的指令都是 “解釋性語言”,解釋性語言的程序不需要編譯,其在運(yùn)行程序的時候才翻譯。也就是說,“解釋”是逐行的翻譯(本領(lǐng)域技術(shù)人員應(yīng)當(dāng)能夠理解“解釋性語言”和“編譯性語言”的概念及差別,在此不再贅述)。傳統(tǒng)的執(zhí)行“解釋性語言”的虛擬機(jī)環(huán)境,其在對程序進(jìn)行調(diào)試時都必須重啟虛擬機(jī)以切換到虛擬機(jī)的調(diào)試模式,并且隨后需要掛起該虛擬機(jī)上其它程序線程的運(yùn)行,以進(jìn)行故障調(diào)試。根據(jù)本發(fā)明的一個實施例,有一個或多個應(yīng)用程序在同一虛擬機(jī)上運(yùn)行。下面開始詳細(xì)介紹圖2所示的方法。圖2所示的方法從步驟201開始。在步驟201中,接收對運(yùn)行在虛擬機(jī)上的程序進(jìn)行調(diào)試的請求。根據(jù)本發(fā)明的一個實施例,該請求是通過用戶界面的“調(diào)試”按鈕提出的。由于在同一虛擬機(jī)上可能運(yùn)行有多個程序線程,根據(jù)本發(fā)明的一個實施例,需要選擇某個特定的程序進(jìn)行調(diào)試。根據(jù)本發(fā)明的另ー實施例,所述調(diào)試請求是指對某個程序中的一個或多個類(Class)進(jìn)行調(diào)試的請求。接下來,圖2所示的方法進(jìn)行至步驟202,為程序的待調(diào)試代碼行注入調(diào)試邏輯代碼(Debug Logic)。程序開發(fā)或維護(hù)人員為了調(diào)試程序的需要,會設(shè)置斷點(Breakpoint)以及調(diào)試命令。以Java虛擬機(jī)JVM為例,常見的調(diào)試命令包括但不限于STEP OVER、STEPINTO、STEP RETURN、NEXT STEP等,程序調(diào)試過程即是按照設(shè)置的調(diào)試命令執(zhí)行相應(yīng)的操作,例如獲取變量值、參數(shù)值等。而調(diào)試邏輯代碼的內(nèi)容就是規(guī)定基于不同的調(diào)試命令執(zhí)行什么樣的操作。根據(jù)本發(fā)明的一個實施例,在程序的待調(diào)試代碼行前(代碼行前指的是代碼行的開始處)注入調(diào)試邏輯代碼。這是因為根據(jù)斷點的定義,應(yīng)該在程序沒有執(zhí)行之前先暫停,以方便獲得上下文環(huán)境和變量值。根據(jù)本發(fā)明的另ー個實施例,在程序的待調(diào)試代碼行后(代碼行后指的是代碼行的結(jié)束處)注入調(diào)試邏輯代碼。這是因為本領(lǐng)域技術(shù)人員完全可以采用代碼執(zhí)行時跳轉(zhuǎn)的方式在任意位置為代碼行注入調(diào)試邏輯代碼,只要確保先執(zhí)行所注入的調(diào)試邏輯代碼,再執(zhí)行原代碼行即可。根據(jù)本發(fā)明的一個實施例,考慮到程序代碼中的每一行均可能存在斷點,為了確保不錯過任何ー個斷點,優(yōu)選地為每一行程序代碼行進(jìn)行注入操作。根據(jù)本發(fā)明的另ー實施例,考慮到程序代碼中的有些行并無實際意義(例如僅僅是括號等符號信息),有選擇地為部分程序代碼行(例如有效代碼行)進(jìn)行注入操作。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,在步驟202中所注入的調(diào)試邏輯代碼的具體表達(dá)方式受虛擬機(jī)的具體實現(xiàn)語言的影響,可能有多種形式,本發(fā)明不對其作出任何限定,只要所注入的調(diào)試邏輯代碼規(guī)定了基于不同的調(diào)試命令執(zhí)行什么樣的操作,即落入本發(fā)明的保護(hù)范圍。根據(jù)本發(fā)明ー實施例,根據(jù)待調(diào)試程序的源代碼中的行號逐行在其對應(yīng)的編譯后代碼的相應(yīng)位置注入調(diào)試邏輯代碼。圖2C中給出了基于Java虛擬機(jī)JVM環(huán)境的調(diào)試邏輯代碼的示例。關(guān)于具體如何注入調(diào)試邏輯代碼,可能有多種實施方式。根據(jù)本發(fā)明的一個實施例,為程序的待調(diào)試代碼行注入調(diào)試邏輯代碼是通過向所述虛擬機(jī)添加調(diào)試代理,并通過所添加的調(diào)試代理對所述待調(diào)試程序進(jìn)行類變換實現(xiàn)的。這里“代理”(Agent)的功能是把虛擬機(jī)的ー些操作暴露給虛擬機(jī)的用戶,可以把“代理”簡單地理解為一段加載到虛擬機(jī)上的外掛程序。不同的虛擬機(jī)均提供了不同的“代理”功能,其具體的實現(xiàn)方式可能有所不同,但并不影響本發(fā)明技術(shù)構(gòu)思的實現(xiàn)。根據(jù)此實施例,利用虛擬機(jī)提供的“代理”功能,為待調(diào)試程序代碼行注入調(diào)試邏輯代碼,是為“調(diào)試代理”。以Java虛擬機(jī)JVM為例,其“代理”為基于 JVMTI 規(guī)范的 JDWP (Java Debug Wire Protocol Transport Interface)。圖 2B 中給出了基于Java虛擬機(jī)JVM環(huán)境的向虛擬機(jī)添加的調(diào)試代理的代碼實例。所謂“類重變換”,是指在將程序的類(Class)加載后,再將已加載完成的類按照調(diào)試邏輯代碼重寫。還需要指出的是,基于此實施例,既可以在虛擬機(jī)啟動時即激活“代理”,也可以在虛擬機(jī)啟動后動態(tài)地加載“代理”。根據(jù)本發(fā)明的又ー實施例,為程序的待調(diào)試代碼行注入調(diào)試邏輯代碼是通過向所述虛擬機(jī)添加調(diào)試代理,并通過所添加的調(diào)試代理對所述待調(diào)試程序進(jìn)行類重定義實現(xiàn)的。與上一實施例不同的是,“類重定義”指的是在加載類的過程中即按照調(diào)試邏輯代碼加載類,而無需等到類加載完成后再對其進(jìn)行重寫。與上ー實施例類似的是,基于此實施例,同樣既可以在虛擬機(jī)啟動時即激活“代理”,也可以在虛擬機(jī)啟動后動態(tài)地加載“代理”。根據(jù)本發(fā)明的又ー實施例,為程序的待調(diào)試代碼行注入調(diào)試邏輯代碼是通過重寫類加載器實現(xiàn)的。根據(jù)本發(fā)明的再ー實施例,為程序的待調(diào)試代碼行注入調(diào)試邏輯代碼是通過利用編譯器對所述待調(diào)試程序進(jìn)行類變換實現(xiàn)的。此實施例實際上是在程序啟動前將類按照調(diào)試邏輯代碼改寫好,并且寫入硬盤,從而在程序啟動后直接從硬盤中加載改寫好的類。 本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,雖然上文中僅給出了基于JVM的具體代碼實現(xiàn)方式的示例(調(diào)試代理和調(diào)試邏輯代碼),但是其它各種虛擬機(jī)的“代理”規(guī)范均屬于本領(lǐng)域技術(shù)人員的公知常識,可以從各種公開途徑獲取。本領(lǐng)域技術(shù)人員完全可以在理解了本發(fā)明技術(shù)構(gòu)思的基礎(chǔ)上基于不同的虛擬機(jī)實現(xiàn)環(huán)境來實施本發(fā)明的構(gòu)思。接下來,在步驟203中,運(yùn)行經(jīng)注入調(diào)試邏輯代碼后的程序代碼,以對該程序進(jìn)行調(diào)試。從步驟203開始,具體的程序調(diào)試過程將在圖3及其相應(yīng)的文字描述中進(jìn)行詳細(xì)說明。由上述內(nèi)容可以看出,由于在步驟202中,在程序運(yùn)行過程中即可以動態(tài)地向程序中注入調(diào)試邏輯代碼(現(xiàn)有技術(shù)中,該調(diào)試邏輯通常必須切換至虛擬機(jī)的調(diào)試模式才能執(zhí)行),因此可以動態(tài)地實現(xiàn)對程序進(jìn)行調(diào)試操作,而無需停止虛擬機(jī)上運(yùn)行的其它程序并且也無需重啟虛擬機(jī)以切換至調(diào)試模式。圖3示出了根據(jù)本發(fā)明另ー實施例的用于虛擬機(jī)環(huán)境下的程序調(diào)試方法的流程圖。在圖3中,步驟301和302分別對應(yīng)于圖2中的步驟201和202,在此不再贅述。圖3中的步驟303、304和305對應(yīng)于圖2中的步驟203。在步驟303中,逐行運(yùn)行經(jīng)注入調(diào)試邏輯代碼后的程序代碼。在步驟304中,接收所運(yùn)行至的該行程序代碼的調(diào)試命令(例如JVM環(huán)境下的Step in)。接下來在步驟305中,根據(jù)所接收到的調(diào)試命令,執(zhí)行所注入的調(diào)試邏輯代碼規(guī)定的相應(yīng)操作(例如附圖2C的代碼示例中的針對Step over、Step into、Step return等各種調(diào)試命令的相應(yīng)操作)。根據(jù)本發(fā)明的ー實施例,所接收到的調(diào)試命令由提出調(diào)試請求的客戶端發(fā)出。需要指出的是,描述步驟303至305的目的僅僅是為了使得整個調(diào)試程序的操作更加完整,本領(lǐng)域技術(shù)人員在根據(jù)本發(fā)明的構(gòu)思向待調(diào)試程序的代碼行注入了調(diào)試邏輯代碼后,完全可以根據(jù)現(xiàn)有技術(shù)中的調(diào)試方法以及具體的虛擬機(jī)環(huán)境完成程序調(diào)試的后續(xù)操作。事實上,實際的程序調(diào)試的全部操作可能還包含很多復(fù)雜的步驟。以JVM為例,在運(yùn)行 每一行java代碼行指令之前,需要記錄當(dāng)前行的信息(如行號)、檢查當(dāng)前的調(diào)試的環(huán)境變量如果是處于斷點(breakpoint)狀態(tài),則停止運(yùn)行并向客戶端報告當(dāng)前的行號、線程、用戶所需要的變量名和變量值等信息。如果用戶需要更多的內(nèi)部變量,則通過虛擬機(jī)的功能獲得,直到收到用戶的信號之后繼續(xù)運(yùn)行。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,上述在注入了調(diào)試邏輯代碼后的具體的調(diào)試操作并非構(gòu)成對本發(fā)明的任何限制,它們可能依虛擬機(jī)環(huán)境的不同、虛擬機(jī)設(shè)置的不同而有所變化,只要是注入了調(diào)試邏輯代碼并且依據(jù)調(diào)試命令執(zhí)行了調(diào)試邏輯代碼所規(guī)定的相應(yīng)操作,即能夠?qū)崿F(xiàn)本發(fā)明構(gòu)思,從而落入本發(fā)明保護(hù)范圍。接下來圖3所示的方法進(jìn)行至步驟306。在步驟306中,接收結(jié)束程序調(diào)試的請求,并且在步驟307中從程序代碼中移除所注入的調(diào)試邏輯代碼。之所以要移除調(diào)試邏輯代碼,是為了恢復(fù)對程序的正常運(yùn)行而結(jié)束調(diào)試操作。根據(jù)上文中例舉的多種具體的“注入”調(diào)試邏輯代碼的實施例,相應(yīng)地,在調(diào)試結(jié)束后,移除調(diào)試邏輯代碼的方式也有多種。以上文中給出的通過向虛擬機(jī)添加調(diào)試代理并對所述待調(diào)試程序進(jìn)行類變換實現(xiàn)“注入”的實施例為例,相應(yīng)地,可以通過解除所添加的調(diào)試代理以及解除類變換的方式來移除所注入的調(diào)試邏輯代碼。具體可參見附圖3B中的代碼實例。然而,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,圖3中的步驟306和307并非實現(xiàn)本發(fā)明的目的所必需的,即使不移除調(diào)試邏輯代碼或者采用任何其它方式移除調(diào)試邏輯代碼,均不影響本發(fā)明技術(shù)效果或目的的實現(xiàn),因為一旦通過注入調(diào)試邏輯代碼并運(yùn)行經(jīng)注入后的程序代碼,即可實現(xiàn)在無需重啟虛擬機(jī)或掛起其它程序線程的情況下,動態(tài)地對程序進(jìn)行調(diào)試的發(fā)明目的。圖4示出了根據(jù)本發(fā)明一個實施例的用于虛擬機(jī)環(huán)境下的程序調(diào)試系統(tǒng)的框圖。圖4所示的系統(tǒng)在整體上由系統(tǒng)400表示,具體地,系統(tǒng)400包括調(diào)試請求接收裝置401,被配置為接收對程序進(jìn)行調(diào)試的請求,所述程序運(yùn)行于所述虛擬機(jī)上;注入裝置402,被配置為向程序的待調(diào)試代碼行注入調(diào)試邏輯代碼;以及調(diào)試裝置403,被配置為運(yùn)行經(jīng)注入調(diào)試邏輯代碼后的程序代碼,以對該程序進(jìn)行調(diào)試。系統(tǒng)400中的裝置401-403分別對應(yīng)于圖2所示的方法中的步驟201-203,在此不再贅述。圖5示出了根據(jù)本發(fā)明另ー實施例的用于虛擬機(jī)環(huán)境下的程序調(diào)試系統(tǒng)的框圖。圖5所示的系統(tǒng)在整體上由系統(tǒng)500表示,具體地系統(tǒng)500包括調(diào)試請求接收裝置501,被配置為接收對程序進(jìn)行調(diào)試的請求,所述程序運(yùn)行于所述虛擬機(jī)上;注入裝置502,被配置為向在程序的待調(diào)試代碼行注入調(diào)試邏輯代碼;調(diào)試裝置503,被配置為運(yùn)行經(jīng)注入調(diào)試邏輯代碼后的程序代碼,以對該程序進(jìn)行調(diào)試;結(jié)束請求接收裝置504,被配置為接收結(jié)束程序調(diào)試的請求;以及代碼移除裝置505,被配置為從所述程序代碼中移除所述調(diào)試邏輯代碼。可以理解,系統(tǒng)500中的裝置501-503分別對應(yīng)于圖2所示的方法中的步驟201-203,并且裝置503進(jìn)ー步對應(yīng)于圖3所示的方法中的步驟303-305,并且裝置504-505對應(yīng)于圖3所示的方法中的步驟306-307,在此不再贅述。圖6示出了根據(jù)本發(fā)明一實施例的用于虛擬機(jī)環(huán)境下的程序調(diào)試系統(tǒng)的概要架構(gòu)圖。圖6中的附圖標(biāo)記600表示虛擬機(jī)服務(wù)器(也就是上文中所說的虛擬機(jī)),在該虛擬機(jī)上運(yùn)行有多個程序,其中有一個程序是現(xiàn)在待調(diào)試的程序603。601是調(diào)試客戶端,也就是發(fā)出調(diào)試請求以及調(diào)試命令的用戶。602是根據(jù)本發(fā)明ー個實施例向虛擬機(jī)添加的調(diào)試代理(上文已經(jīng)闡述調(diào)試代理并非必需,有多種實施例可以注入調(diào)試邏輯代碼)。由602指向603的箭頭表示調(diào)試代理向待調(diào)試程序中注入調(diào)試邏輯代碼,由603指向602的箭頭表示待調(diào)試程序向調(diào)試代理返回變量值等信息。由601指向600的箭頭表示客戶端發(fā)出具體的調(diào)試命令,而由600指向601的箭頭表示虛擬機(jī)響應(yīng)于客戶端的調(diào)試命令,通過執(zhí)行注入調(diào)試邏輯代碼后的程序代碼返回調(diào)試所需的變量值等信息。本領(lǐng)域技術(shù)人員應(yīng)當(dāng)理解,圖6只是根據(jù)本發(fā)明ー實施例(ー種注入方式)宏觀層面的概要架構(gòu)圖,其目的在于形象 地概要示出本發(fā)明的發(fā)明構(gòu)思,并不構(gòu)成對本發(fā)明應(yīng)用范圍、領(lǐng)域的任何限制。通過圖6所示的架構(gòu)圖可以看出,虛擬機(jī)服務(wù)器600始終運(yùn)行于產(chǎn)品環(huán)境下(非調(diào)試模式),由于調(diào)試邏輯代碼被注入至待調(diào)試程序中的代碼行,客戶端可以動態(tài)地對程序進(jìn)行調(diào)試,無需將虛擬機(jī)切換至調(diào)試模式,并且虛擬機(jī)服務(wù)器600上運(yùn)行的其它程序均可以不受影響地繼續(xù)運(yùn)行,也無需重新啟動虛擬機(jī)服務(wù)器600。附圖中的流程圖和框圖,圖示了按照本發(fā)明各種實施例的系統(tǒng)、方法和計算機(jī)程序產(chǎn)品的可能實現(xiàn)的體系架構(gòu)、功能和操作。在這點上,流程圖或框圖中的每個方框可以代表一個模塊、程序段、或代碼的一部分,所述模塊、程序段、或代碼的一部分包含ー個或多個用于實現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實現(xiàn)中,方框中所標(biāo)注的功能也可以以不同于附圖中所標(biāo)注的順序發(fā)生。例如,兩個接連地表示的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來實現(xiàn),或者可以用專用硬件與計算機(jī)指令的組合來實現(xiàn)。雖然以上結(jié)合具體實例,對本發(fā)明的利用遠(yuǎn)程應(yīng)用處理本地文件的系統(tǒng)及方法進(jìn)行了詳細(xì)描述,但本發(fā)明并不限于此。本領(lǐng)域普通技術(shù)人員能夠在說明書教導(dǎo)之下對本發(fā)明進(jìn)行多種變換、替換和修改而不偏離本發(fā)明的精神和范圍。應(yīng)該理解,所有這樣的變化、替換、修改仍然落入本發(fā)明的保護(hù)范圍之內(nèi)。本發(fā)明的保護(hù)范圍由所附權(quán)利要求來限定。
權(quán)利要求
1.一種用于虛擬機(jī)環(huán)境下的程序調(diào)試方法,所述程序運(yùn)行于所述虛擬機(jī)上,所述方法包括 接收對程序進(jìn)行調(diào)試的請求; 為所述程序的待調(diào)試代碼行注入調(diào)試邏輯代碼;以及 運(yùn)行經(jīng)注入調(diào)試邏輯代碼的程序代碼,以對該程序進(jìn)行調(diào)試。
2.如權(quán)利要求I所述的方法,其中調(diào)試邏輯代碼包括針對不同的調(diào)試命令所執(zhí)行的相應(yīng)操作。
3.如權(quán)利要求2所述的方法,其中運(yùn)行經(jīng)注入調(diào)試邏輯代碼后的程序代碼,以對該程序進(jìn)行調(diào)試包括 逐行運(yùn)行經(jīng)注入調(diào)試邏輯代碼后的程序代碼; 接收該行程序代碼的調(diào)試命令; 根據(jù)所接收到的調(diào)試命令,執(zhí)行所注入的調(diào)試邏輯代碼規(guī)定的所述相應(yīng)操作。
4.如權(quán)利要求1-3任一所述的方法,進(jìn)一步包括 接收結(jié)束程序調(diào)試的請求; 從所述程序代碼中移除所述調(diào)試邏輯代碼。
5.如權(quán)利要求I所述的方法,其中在待調(diào)試程序的代碼行前注入調(diào)試邏輯代碼是通過向所述虛擬機(jī)添加調(diào)試代理并通過所添加的調(diào)試代理對所述待調(diào)試程序進(jìn)行類變換實現(xiàn)的。
6.如權(quán)利要求I所述的方法,其中在待調(diào)試程序的代碼行前注入調(diào)試邏輯代碼是通過向所述虛擬機(jī)添加調(diào)試代理并通過所添加的調(diào)試代理對所述待調(diào)試程序進(jìn)行類重定義實現(xiàn)的。
7.如權(quán)利要求I所述的方法,其中在待調(diào)試程序的代碼行前注入調(diào)試邏輯代碼是通過重寫類加載器實現(xiàn)的。
8.如權(quán)利要求I所述的方法,其中在待調(diào)試程序的代碼行前注入調(diào)試邏輯代碼是通過利用編譯器對所述待調(diào)試程序進(jìn)行類變換實現(xiàn)的。
9.如權(quán)利要求I所述的方法,其中對程序進(jìn)行調(diào)試的請求包括對程序中的部分類進(jìn)行調(diào)試的請求,并且其中待調(diào)試程序的代碼行包括所述待調(diào)試的部分類的代碼行。
10.如權(quán)利要求1-9任一所述的方法,其中虛擬機(jī)在調(diào)試過程中不重新啟動。
11.如權(quán)利要求I所述的方法,其中虛擬機(jī)為進(jìn)程虛擬機(jī)。
12.如權(quán)利要求I所述的方法,其中為所述程序的待調(diào)試代碼行注入調(diào)試邏輯代碼包括 在所述程序的待調(diào)試代碼行前注入調(diào)試邏輯代碼。
13.一種用于虛擬機(jī)環(huán)境下的程序調(diào)試系統(tǒng),所述程序運(yùn)行于所述虛擬機(jī)上,所述系統(tǒng)包括 調(diào)試請求接收裝置,被配置為調(diào)試接收對程序進(jìn)行調(diào)試的請求; 注入裝置,被配置為向所述程序的待調(diào)試代碼行注入調(diào)試邏輯代碼;以及 調(diào)試裝置,被配置為運(yùn)行經(jīng)注入調(diào)試邏輯代碼的程序代碼,以對該程序進(jìn)行調(diào)試。
14.如權(quán)利要求13所述的系統(tǒng),其中調(diào)試邏輯代碼包括針對不同的調(diào)試命令所執(zhí)行的相應(yīng)操作。
15.如權(quán)利要求13所述的系統(tǒng),其中為運(yùn)行經(jīng)注入調(diào)試邏輯代碼后的程序代碼,以對該程序進(jìn)行調(diào)試包括 逐行運(yùn)行經(jīng)注入調(diào)試邏輯代碼后的程序代碼; 接收該行程序代碼的調(diào)試命令; 根據(jù)所接收到的調(diào)試命令,執(zhí)行所注入的調(diào)試邏輯代碼規(guī)定的所述相應(yīng)操作。
16.如權(quán)利要求13-15任一所述的系 統(tǒng),進(jìn)一步包括 結(jié)束請求接收裝置,被配置為接收結(jié)束程序調(diào)試的請求; 代碼移除裝置,被配置為從所述程序代碼中移除所述調(diào)試邏輯代碼。
17.如權(quán)利要求13所述的系統(tǒng),其中注入裝置被配置為通過向所述虛擬機(jī)添加調(diào)試代理并通過所添加的調(diào)試代理對所述待調(diào)試程序進(jìn)行類變換來實現(xiàn)在待調(diào)試程序的代碼行前注入調(diào)試邏輯代碼。
18.如權(quán)利要求13所述的系統(tǒng),其中注入裝置被配置為通過向所述虛擬機(jī)添加調(diào)試代理并通過所添加的調(diào)試代理對所述待調(diào)試程序進(jìn)行類重定義來實現(xiàn)在待調(diào)試程序的代碼行前注入調(diào)試邏輯代碼。
19.如權(quán)利要求13所述的系統(tǒng),其中注入裝置被配置為通過重寫類加載器來實現(xiàn)在待調(diào)試程序的代碼行前注入調(diào)試邏輯代碼。
20.如權(quán)利要求11所述的系統(tǒng),其中注入裝置被配置為通過利用編譯器對所述待調(diào)試程序進(jìn)行類變換來實現(xiàn)在待調(diào)試程序的代碼行前注入調(diào)試邏輯代碼。
21.如權(quán)利要求13所述的系統(tǒng),其中對程序進(jìn)行調(diào)試的請求包括對程序中的部分類進(jìn)行調(diào)試的請求,并且其中待調(diào)試程序的代碼行包括所述待調(diào)試的部分類的代碼行。
22.如權(quán)利要求13-21任一所述的系統(tǒng),其中虛擬機(jī)在調(diào)試過程中不重新啟動。
23.如權(quán)利要求13所述的系統(tǒng),其中虛擬機(jī)為進(jìn)程虛擬機(jī)。
24.如權(quán)利要求13所述的系統(tǒng),其中注入裝置被配置為 在所述程序的待調(diào)試代碼行前注入調(diào)試邏輯代碼。
全文摘要
本發(fā)明涉及程序調(diào)試(Debug)技術(shù)領(lǐng)域。更具體地,本發(fā)明涉及在不重啟虛擬機(jī)(Virtual Machine)的情況下對程序進(jìn)行調(diào)試的技術(shù)。本發(fā)明提供了一種用于虛擬機(jī)環(huán)境下的程序調(diào)試方法,所述程序運(yùn)行于所述虛擬機(jī)上,所述方法包括接收對程序進(jìn)行調(diào)試的請求;為所述程序的待調(diào)試代碼行注入調(diào)試邏輯代碼;以及運(yùn)行經(jīng)注入調(diào)試邏輯代碼的程序代碼,以對該程序進(jìn)行調(diào)試。通過本發(fā)明,可以實現(xiàn)無需重啟虛擬機(jī)或掛起虛擬機(jī)上運(yùn)行的其它程序線程,而動態(tài)地對程序進(jìn)行調(diào)試,并且無需對虛擬機(jī)本身代碼作出修改。
文檔編號G06F11/36GK102855179SQ20111018226
公開日2013年1月2日 申請日期2011年6月30日 優(yōu)先權(quán)日2011年6月30日
發(fā)明者黃國亮, 蔡俊杰, 徐睿智, 呂晶, 南俊杰, 梁睿, 孟慶海 申請人:國際商業(yè)機(jī)器公司