反向調(diào)試器和反向調(diào)試方法
【專利摘要】本發(fā)明涉及一種反向調(diào)試程序的方法和反向調(diào)試器,其中方法包括:獲取編譯器輸出的該程序的調(diào)試信息,所述調(diào)試信息中包含該程序的擴(kuò)展的基本塊相關(guān)的信息;響應(yīng)于該程序進(jìn)入反向調(diào)試,在至少一個(gè)擴(kuò)展的基本塊的入口地址設(shè)定反向調(diào)試檢查點(diǎn);響應(yīng)于程序運(yùn)行到設(shè)定的反向調(diào)試檢查點(diǎn),存儲(chǔ)該反向調(diào)試檢查點(diǎn)對(duì)應(yīng)的調(diào)試需要存儲(chǔ)的信息;響應(yīng)于接收到設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn),將程序回退到該反向調(diào)試目標(biāo)斷點(diǎn)之前的、距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn),并獲得該反向調(diào)試檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息,并繼續(xù)執(zhí)行該程序,直至執(zhí)行到該反向調(diào)試目標(biāo)斷點(diǎn)。該發(fā)明能夠減少反向調(diào)試需要存儲(chǔ)的信息,提高調(diào)試效率。
【專利說(shuō)明】反向調(diào)試器和反向調(diào)試方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及程序調(diào)試器,更具體地,涉及一種反向調(diào)試器和反向調(diào)試方法。
【背景技術(shù)】
[0002]常用調(diào)試器(debugger)的基本功能包括:通過(guò)使目標(biāo)程序觸發(fā)一個(gè)異常將一個(gè) 運(yùn)行的程序中斷下來(lái),并且使其按照用戶的意愿執(zhí)行;查看軟件運(yùn)行中信息,這些信息包含 但不限于當(dāng)前線程的寄存器信息和內(nèi)存信息等;以及修改軟件執(zhí)行流程,包括:修改內(nèi)存 信息、寄存器信息等等。
[0003]調(diào)試器的工作原理是基于中央處理器的異常機(jī)制,由操作系統(tǒng)的異常分發(fā)(或者 事件分發(fā))子系統(tǒng)負(fù)責(zé)將其封裝處理后,以比較友好的方式與調(diào)試器進(jìn)行實(shí)時(shí)交互。當(dāng)調(diào) 試器捕獲到一個(gè)異常(或事件)之后,將會(huì)根據(jù)調(diào)試器的自身邏輯來(lái)判定是否需要接管這 個(gè)異常(或事件),并決定由調(diào)試器的哪個(gè)函數(shù)來(lái)接管。當(dāng)調(diào)試器接管下來(lái)這個(gè)異常(或事 件)后,將根據(jù)用戶的需求對(duì)其進(jìn)行進(jìn)一步的處理,處理完畢后再通知系統(tǒng)已經(jīng)處理完畢, 再開始新一輪的異常(或事件)捕獲、分發(fā)循環(huán)。
[0004]調(diào)試程序的過(guò)程中,程序員經(jīng)常需要知道自己對(duì)于程序的調(diào)試是否走得太遠(yuǎn),先 前步驟的執(zhí)行結(jié)果是否正確等,這需要用到反向調(diào)試技術(shù)。反向調(diào)試是調(diào)試器中的一種調(diào) 試方法,該方法允許程序回到程序已經(jīng)執(zhí)行過(guò)的歷史點(diǎn)。目前提供反向調(diào)試功能的調(diào)試器 包括 TotalView Technologies 公司的 TotalView Debugger,以及開源社區(qū)的 GDB。
[0005]理論上講,一個(gè)程序如果想要回到已經(jīng)執(zhí)行過(guò)的歷史點(diǎn),必須記錄該歷史點(diǎn)的狀 態(tài),包括該歷史點(diǎn)的和該程序相關(guān)的內(nèi)存值和寄存器值?,F(xiàn)有的反向調(diào)試功能實(shí)現(xiàn)方法要 么需要的存儲(chǔ)空間太多,要么運(yùn)行到反向目標(biāo)斷點(diǎn)的時(shí)間過(guò)長(zhǎng)。
【發(fā)明內(nèi)容】
[0006]為了解決現(xiàn)有技術(shù)中存在的問(wèn)題,需要提供一種反向調(diào)試器及反向調(diào)試方法,使 得需要的存儲(chǔ)空間合理,并且運(yùn)行到反向調(diào)試目標(biāo)斷點(diǎn)的時(shí)間也不太長(zhǎng)。
[0007]根據(jù)本發(fā)明的一個(gè)方面,提供了一種反向調(diào)試程序的方法,包括:
[0008]獲取編譯器輸出的該程序的調(diào)試信息,所述調(diào)試信息中包含該程序的擴(kuò)展的基本 塊相關(guān)的信息;
[0009]響應(yīng)于該程序進(jìn)入反向調(diào)試,在至少一個(gè)擴(kuò)展的基本塊的入口地址設(shè)定反向調(diào)試 檢查點(diǎn);
[0010]響應(yīng)于程序運(yùn)行到設(shè)定的反向調(diào)試檢查點(diǎn),存儲(chǔ)該反向調(diào)試檢查點(diǎn)對(duì)應(yīng)的調(diào)試需 要存儲(chǔ)的信息;
[0011]響應(yīng)于接收到設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn),
[0012]將程序回退到該反向調(diào)試目標(biāo)斷點(diǎn)之前的、距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向 調(diào)試檢查點(diǎn),并獲得該反向調(diào)試檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息,并繼續(xù)執(zhí)行該程序,直 至執(zhí)行到該反向調(diào)試目標(biāo)斷點(diǎn)。[0013]根據(jù)本發(fā)明的另一個(gè)方面,提供了一種反向調(diào)試器,包括:
[0014]獲取裝置,被配置為獲取編譯器輸出的該程序的調(diào)試信息,所述調(diào)試信息中包含 該程序的擴(kuò)展的基本塊相關(guān)的信息;
[0015]設(shè)定裝置,被配置為響應(yīng)于該程序進(jìn)入反向調(diào)試,在至少一個(gè)擴(kuò)展的基本塊的入 口地址設(shè)定反向調(diào)試檢查點(diǎn);
[0016]存儲(chǔ)裝置,被配置為響應(yīng)于程序運(yùn)行到設(shè)定的反向調(diào)試檢查點(diǎn),存儲(chǔ)該反向調(diào)試 檢查點(diǎn)對(duì)應(yīng)的調(diào)試需要存儲(chǔ)的信息;
[0017]回退裝置,被配置為響應(yīng)于接收到設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn),將程序回退到該反 向調(diào)試目標(biāo)斷點(diǎn)之前的、距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn),并獲得該反向 調(diào)試檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息,并繼續(xù)執(zhí)行該程序,直至執(zhí)行到該反向調(diào)試目標(biāo) 斷點(diǎn)。
【專利附圖】
【附圖說(shuō)明】
[0018]通過(guò)結(jié)合附圖對(duì)本公開示例性實(shí)施方式進(jìn)行更詳細(xì)的描述,本公開的上述以及其 它目的、特征和優(yōu)勢(shì)將變得更加明顯,其中,在本公開示例性實(shí)施方式中,相同的參考標(biāo)號(hào) 通常代表相同部件。
[0019]圖1示出了適于用來(lái)實(shí)現(xiàn)本發(fā)明實(shí)施方式的示例性計(jì)算系統(tǒng)的框圖;
[0020]圖2示出了根據(jù)本發(fā)明一種實(shí)施方式的反向調(diào)試程序的方法的流程圖;
[0021]圖3給出了基本塊和擴(kuò)展的基本塊術(shù)語(yǔ)模型圖;
[0022]圖4a示出了 Dwarf調(diào)試信息中的調(diào)試信息入口,圖4b示出了編譯器產(chǎn)生的Dwarf 格式的信息的例子;
[0023]圖5示意性地示出了根據(jù)本發(fā)明的一種實(shí)施方式在調(diào)試信息中加入的擴(kuò)展的基 本塊的信息;
[0024]圖6示出了在反向調(diào)試檢查點(diǎn)調(diào)試器需要存儲(chǔ)的信息的一種實(shí)施方式;
[0025]圖7示出了在圖3所示的程序中被執(zhí)行的基本塊BB和擴(kuò)展的基本塊EBB以及被 加入的目標(biāo)調(diào)試斷點(diǎn);
[0026]圖8示出了圖2所示的調(diào)試方法的使用場(chǎng)景;以及
[0027]圖9示出了反向調(diào)試器900的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0028]下面將參照附圖更詳細(xì)地描述本公開的優(yōu)選實(shí)施方式。雖然附圖中顯示了本公開 的優(yōu)選實(shí)施方式,然而應(yīng)該理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施方 式所限制。相反,提供這些實(shí)施方式是為了使本公開更加透徹和完整,并且能夠?qū)⒈竟_的 范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
[0029]圖1示出了適于用來(lái)實(shí)現(xiàn)本發(fā)明實(shí)施方式的示例性計(jì)算系統(tǒng)100的框圖。如圖1所示,計(jì)算機(jī)系統(tǒng)100可以包括:CPU(中央處理單元)101、RAM(隨機(jī)存取存儲(chǔ)器)102、 ROM(只讀存儲(chǔ)器)103、系統(tǒng)總線104、硬盤控制器105、鍵盤控制器106、串行接口控制器 107、并行接口控制器108、顯示控制器109、硬盤110、鍵盤111、串行外部設(shè)備112、并行外部 設(shè)備113和顯示器114。在這些設(shè)備中,與系統(tǒng)總線104耦合的有CPU IOU RAM 102、ROM103、硬盤控制器105、鍵盤控制器106、串行控制器107、并行控制器108和顯示控制器109。 硬盤110與硬盤控制器105耦合,鍵盤111與鍵盤控制器106耦合,串行外部設(shè)備112與串 行接口控制器107耦合,并行外部設(shè)備113與并行接口控制器108耦合,以及顯示器114與 顯示控制器109耦合。應(yīng)當(dāng)理解,圖1所述的結(jié)構(gòu)框圖僅僅是為了示例的目的,而不是對(duì)本 發(fā)明范圍的限制。在某些情況下,可以根據(jù)具體情況增加或減少某些設(shè)備口
[0030]所屬【技術(shù)領(lǐng)域】的技術(shù)人員知道,本發(fā)明可以實(shí)現(xiàn)為系統(tǒng)、方法或計(jì)算機(jī)程序產(chǎn)品。 因此,本公開可以具體實(shí)現(xiàn)為以下形式,即:可以是完全的硬件、也可以是完全的軟件(包 括固件、駐留軟件、微代碼等),還可以是硬件和軟件結(jié)合的形式,本文一般稱為“電路”、“模 塊”或“系統(tǒng)”。此外,在一些實(shí)施例中,本發(fā)明還可以實(shí)現(xiàn)為在一個(gè)或多個(gè)計(jì)算機(jī)可讀介質(zhì) 中的計(jì)算機(jī)程序產(chǎn)品的形式,該計(jì)算機(jī)可讀介質(zhì)中包含計(jì)算機(jī)可讀的程序代碼。
[0031]可以采用一個(gè)或多個(gè)計(jì)算機(jī)可讀的介質(zhì)的任意組合。計(jì)算機(jī)可讀介質(zhì)可以是計(jì) 算機(jī)可讀信號(hào)介質(zhì)或者計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)例如可以是一但不限 于——電、磁、光、電磁、紅外線、或半導(dǎo)體的系統(tǒng)、裝置或器件,或者任意以上的組合。計(jì)算 機(jī)可讀存儲(chǔ)介質(zhì)的更具體的例子(非窮舉的列表)包括:具有一個(gè)或多個(gè)導(dǎo)線的電連接、便 攜式計(jì)算機(jī)磁盤、硬盤、隨機(jī)存取存儲(chǔ)器(RAM)、只讀存儲(chǔ)器(ROM)、可擦式可編程只讀存儲(chǔ) 器(EPR0M或閃存)、光纖、便攜式緊湊磁盤只讀存儲(chǔ)器(CD-ROM)、光存儲(chǔ)器件、磁存儲(chǔ)器件、 或者上述的任意合適的組合。在本文件中,計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可以是任何包含或存儲(chǔ)程 序的有形介質(zhì),該程序可以被指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用。
[0032]計(jì)算機(jī)可讀的信號(hào)介質(zhì)可以包括在基帶中或者作為載波一部分傳播的數(shù)據(jù)信號(hào), 其中承載了計(jì)算機(jī)可讀的程序代碼。這種傳播的數(shù)據(jù)信號(hào)可以采用多種形式,包括——但 不限于——電磁信號(hào)、光信號(hào)或上述的任意合適的組合。計(jì)算機(jī)可讀的信號(hào)介質(zhì)還可以是 計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)以外的任何計(jì)算機(jī)可讀介質(zhì),該計(jì)算機(jī)可讀介質(zhì)可以發(fā)送、傳播或者 傳輸用于由指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用的程序。
[0033]計(jì)算機(jī)可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括一但不限 于一無(wú)線、電線、光纜、RF等等,或者上述的任意合適的組合。
[0034]可以以一種或多種程序設(shè)計(jì)語(yǔ)言或其組合來(lái)編寫用于執(zhí)行本發(fā)明操作的計(jì)算機(jī) 程序代碼,所述程序設(shè)計(jì)語(yǔ)言包括面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言-諸如Java、Smalltalk、C++, 還包括常規(guī)的過(guò)程式程序設(shè)計(jì)語(yǔ)言-諸如”C”語(yǔ)言或類似的程序設(shè)計(jì)語(yǔ)言。程序代碼可以 完全地在用戶計(jì)算機(jī)上執(zhí)行、部分地在用戶計(jì)算機(jī)上執(zhí)行、作為一個(gè)獨(dú)立的軟件包執(zhí)行、部 分在用戶計(jì)算機(jī)上部分在遠(yuǎn)程計(jì)算機(jī)上執(zhí)行、或者完全在遠(yuǎn)程計(jì)算機(jī)或服務(wù)器上執(zhí)行。在 涉及遠(yuǎn)程計(jì)算機(jī)的情形中,遠(yuǎn)程計(jì)算機(jī)可以通過(guò)任意種類的網(wǎng)絡(luò)一包括局域網(wǎng)(LAN)或 廣域網(wǎng)(WAN)-連接到用戶計(jì)算機(jī),或者,可以連接到外部計(jì)算機(jī)(例如利用因特網(wǎng)服務(wù)提 供商來(lái)通過(guò)因特網(wǎng)連接)。
[0035]下面將參照本發(fā)明實(shí)施例的方法、裝置(系統(tǒng))和計(jì)算機(jī)程序產(chǎn)品的流程圖和/ 或框圖描述本發(fā)明。應(yīng)當(dāng)理解,流程圖和/或框圖的每個(gè)方框以及流程圖和/或框圖中各 方框的組合,都可以由計(jì)算機(jī)程序指令實(shí)現(xiàn)。這些計(jì)算機(jī)程序指令可以提供給通用計(jì)算機(jī)、 專用計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置的處理器,從而生產(chǎn)出一種機(jī)器,這些計(jì)算機(jī)程序 指令通過(guò)計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置執(zhí)行,產(chǎn)生了實(shí)現(xiàn)流程圖和/或框圖中的方框 中規(guī)定的功能/操作的裝置。[0036]也可以把這些計(jì)算機(jī)程序指令存儲(chǔ)在能使得計(jì)算機(jī)或其它可編程數(shù)據(jù)處理裝置以特定方式工作的計(jì)算機(jī)可讀介質(zhì)中,這樣,存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)中的指令就產(chǎn)生出一個(gè)包括實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的指令裝置(instruction means)的制造品(manufacture)。[0037]也可以把計(jì)算機(jī)程序指令加載到計(jì)算機(jī)、其它可編程數(shù)據(jù)處理裝置、或其它設(shè)備上,使得在計(jì)算機(jī)、其它可編程數(shù)據(jù)處理裝置或其它設(shè)備上執(zhí)行一系列操作步驟,以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的過(guò)程,從而使得在計(jì)算機(jī)或其它可編程裝置上執(zhí)行的指令能夠提供實(shí)現(xiàn)流程圖和/或框圖中的方框中規(guī)定的功能/操作的過(guò)程。
[0038]首先介紹本發(fā)明中使用的常用【背景技術(shù)】術(shù)語(yǔ):
[0039]斷點(diǎn)(breakpoint):在程序調(diào)試過(guò)程中,斷點(diǎn)是指程序內(nèi)部停止的位置,目的是為了用戶調(diào)試的作用,比如在程序內(nèi)部某個(gè)位置,打印變量值和內(nèi)存,查看系統(tǒng)內(nèi)部信息。 一般由用戶手工設(shè)定,對(duì)用戶可見。具體實(shí)現(xiàn)是在程序中調(diào)試器中使用trap指令替換設(shè)定斷點(diǎn)的指令,將設(shè)定斷點(diǎn)的指令存儲(chǔ)起來(lái),當(dāng)程序執(zhí)行到trap指令時(shí),產(chǎn)生異常,程序控制權(quán)交給操作系統(tǒng)。
[0040]檢查點(diǎn)(checkpoint):是一種特殊的斷點(diǎn),實(shí)現(xiàn)的原理與斷點(diǎn)一樣,它的主要目的是記錄下列各項(xiàng)之一:內(nèi)存改變和寄存器改變。一般由調(diào)試器自動(dòng)設(shè)定,可以對(duì)用戶不可見。
[0041]反向調(diào)試檢查點(diǎn)(reverse checkpoint):反向調(diào)試中調(diào)試器設(shè)定的需要存儲(chǔ)程序中間狀態(tài)的點(diǎn)。
[0042]反向調(diào)試目標(biāo)斷點(diǎn)(reverse object breakpoint):反向調(diào)試中調(diào)試人員在程序執(zhí)行路徑上設(shè)定的、程序需要回退到的點(diǎn)。
[0043]目前的反向調(diào)試已經(jīng)提供了一些方法,例如包括一步一停法,目標(biāo)斷點(diǎn)法。在一步一停法中,調(diào)試器需要在當(dāng)前指令的下一條指令設(shè)一個(gè)反向調(diào)試檢查點(diǎn),當(dāng)程序停在當(dāng)前指令時(shí),調(diào)試器需要記錄本指令所修改的寄存器值和相關(guān)內(nèi)存改變的值,把這些值記錄到存儲(chǔ)介質(zhì)中,需要恢復(fù)的時(shí)候再反向逐條指令地恢復(fù)。這種方法每一條指令都需要停止運(yùn)行,執(zhí)行的速度非常慢,另外,每一條指令的所修改的寄存器值和相關(guān)內(nèi)存改變的值需要大量的存儲(chǔ)空間。
[0044]目標(biāo)斷點(diǎn)法就是程序自動(dòng)或人工設(shè)定一定數(shù)量的反向調(diào)試檢查點(diǎn),如果程序要反向調(diào)試到一個(gè)反向調(diào)試目標(biāo)斷點(diǎn),一般需要以下步驟:
[0045]a)調(diào)試器插入一定數(shù)量的反向調(diào)試檢查點(diǎn).插入的方法分為動(dòng)態(tài)的插入和靜態(tài)的插入,所謂靜態(tài)插入是指在程序運(yùn)行前,把反向調(diào)試檢查點(diǎn)插入到程序中;動(dòng)態(tài)插入是指在程序運(yùn)行過(guò)程中插入反向調(diào)試檢查點(diǎn)。
[0046]b)恢復(fù)程序到離若干反向調(diào)試目標(biāo)斷點(diǎn)最近的、并且在反向調(diào)試目標(biāo)斷點(diǎn)前面的反向調(diào)試檢查點(diǎn),恢復(fù)到所述反向調(diào)試檢查點(diǎn)也分為自動(dòng)恢復(fù)和人工恢復(fù).人工恢復(fù)需要用戶指定程序恢復(fù)到哪個(gè)反向調(diào)試檢查點(diǎn)。
[0047]c)從恢復(fù)的檢查點(diǎn)正向執(zhí)行到反向調(diào)試目標(biāo)斷點(diǎn).[0048]斷點(diǎn)的插入方法包括:指定函數(shù)入口設(shè)定法,即在指定的函數(shù)入口或每個(gè)函數(shù)入口插入反向調(diào)試檢查點(diǎn),該方法對(duì)于任意目標(biāo)點(diǎn)來(lái)說(shuō)反向調(diào)試檢查點(diǎn)的數(shù)量太少,很難快速到達(dá)任意反向調(diào)試目標(biāo)斷點(diǎn);設(shè)定一定數(shù)量的指令間隔,比如每隔n條指令插入一個(gè)反向調(diào)試檢查點(diǎn),這種方法的指令間隔很難確定;在每個(gè)基本塊的入口插入反向調(diào)試檢查點(diǎn), 很多基本塊的指令條數(shù)小于五條,這種方法插入的反向調(diào)試檢查點(diǎn)數(shù)量過(guò)多,存儲(chǔ)空間要 求大。
[0049]因此,插入反向調(diào)試檢查點(diǎn)要解決的問(wèn)題是插入的粒度,因?yàn)槿绻迦敕聪蛘{(diào)試 檢查點(diǎn)的粒度太小,運(yùn)行到目標(biāo)斷點(diǎn)的空間的代價(jià)太大;而如果插入反向調(diào)試檢查點(diǎn)的粒 度太大,運(yùn)行到目標(biāo)點(diǎn)的時(shí)間的代價(jià)太大。
[0050]本發(fā)明提出使用擴(kuò)展的基本塊作為反向調(diào)試的斷點(diǎn)插入粒度。圖2示出了根據(jù)本 發(fā)明一種實(shí)施方式的反向調(diào)試程序的方法的流程圖,根據(jù)圖2,在步驟S201,獲取編譯器輸 出的該程序的調(diào)試信息,所述調(diào)試信息中包含該程序的擴(kuò)展的基本塊相關(guān)的信息。
[0051]圖3給出了基本塊和擴(kuò)展的基本塊術(shù)語(yǔ)模型圖,參考圖3,基本塊BB(basic block)是指只能從程序的第一條指令進(jìn)入,并且從最后一條指令離開的最長(zhǎng)線性指令序 列,基本塊BB的指令序列是線性的,也就是順序執(zhí)行的一系列指令;例如,圖3中BB1-BB7 都是基本塊。程序代碼的整體就是若干基本塊連接成的一個(gè)樹狀結(jié)構(gòu),其中,在該樹狀結(jié)構(gòu) 中,包含分支基本塊(branch basic block),是具有多個(gè)后繼基本塊的基本塊,例如圖3中 的基本塊BBl和基本塊BB4。還包含匯合基本塊(join basic block):具有多個(gè)前驅(qū)基本 塊的基本塊,例如圖3中的基本塊BB4。擴(kuò)展的基本塊EBB (Extended Basic Block)是指從 A 口指令開始的最長(zhǎng)指令序列,在這個(gè)指令序列中,除了程序的第一個(gè)基本塊之外不含其 它匯合基本塊。由于擴(kuò)展的基本塊EBB只有一個(gè)入口基本塊,并且可能有多個(gè)出口基本塊, 所以它可以看成以入口基本快為根的樹,圖3中包含3個(gè)EBB,分別是EBBI {BBI,BB2,BB3}, EBB2 {BB5, BB7},EBB3 {BB4, BB6}。EBB劃分是由算法決定的,劃分的算法是現(xiàn)有技術(shù),這里 不在贅述。
[0052]一般來(lái)說(shuō),擴(kuò)展的基本塊EBB是由編譯器在優(yōu)化階段構(gòu)造的結(jié)構(gòu),大部分編譯器, 如gcc, open64等在程序優(yōu)化階段都能夠構(gòu)造擴(kuò)展的基本塊EBB。EBB的構(gòu)造算法有若干 種,其并不是本發(fā)明的發(fā)明點(diǎn),這里不再詳述。編譯器還生成調(diào)試信息,調(diào)試信息格式有很 多種,如Dwarf、Stab、COFF、OMF等。以下本發(fā)明以調(diào)試信息的標(biāo)準(zhǔn)Dwarf (Debugging With Attributed Record Formats)格式為例陳述本發(fā)明的實(shí)現(xiàn),使用其它調(diào)試信息格式的程序 的反向調(diào)試方法類似,就不再贅述。
[0053]Dwarf格式的調(diào)試信息包含了行號(hào)信息,符號(hào)表,基本塊信息,基本數(shù)據(jù)類型,源文 件目錄和名稱等信息,可以被調(diào)試器使用。例如,調(diào)試信息記錄了變量和函數(shù)所對(duì)應(yīng)的內(nèi)存 地址。調(diào)試器可以獲得需要的信息、打印變量的值等。圖4a和圖4b示出了一個(gè)Dwarf的 例子。其中,圖4a示出了 Dwarf調(diào)試信息中的調(diào)試信息入口。調(diào)試信息入口是dwarf的基 本單位;圖4b示出了編譯器產(chǎn)生的Dwarf格式的信息的例子,其中,第一列〈source〉的ed_ scoped/tests/ac.C表示程序的源代碼的目錄路徑位置及程序名;第二列[row, col]中的 row, col分別表明源代碼的行和列;第三列〈PO的數(shù)值表示指令地址,第四列〈BB entry) 的數(shù)值表示基本塊的入口地址,入口地址就是該基本塊的第一條指令的地址,具有相同基 本塊入口地址的指令屬于相同的基本塊,例如圖4第4列中,有6行OxlOe,表明這6句程序 代碼屬于一個(gè)基本塊,其中OxlOe為該基本塊的入口地址,圖4第4列中,有7行0x156,表 明這7句程序代碼屬于一個(gè)基本塊,其中0x156為該基本塊的入口地址等等;第5列〈new statement or basic block〉中//后面的文字是注釋語(yǔ)句。由此可見,現(xiàn)有的編譯器輸出的調(diào)試信息已經(jīng)包含了基本塊的信息,雖然擴(kuò)展的基本塊EBB也是由編譯器在優(yōu)化階段構(gòu) 造的結(jié)構(gòu),但是其并沒(méi)有包含在編譯器輸出的調(diào)試信息中。
[0054]步驟S201的實(shí)現(xiàn)中需要編譯器將其構(gòu)造的EBB結(jié)構(gòu)存儲(chǔ)在該編譯器輸出的調(diào)試 信息里面,圖5示意性地示出了根據(jù)本發(fā)明的一種實(shí)施方式在調(diào)試信息中加入的擴(kuò)展的基 本塊的信息,圖5中的信息實(shí)際是在圖4當(dāng)前的第4列和第5列之間加入一個(gè)新列,表明擴(kuò) 展的基本塊的信息。根據(jù)圖5,0x100和0x362為兩個(gè)擴(kuò)展的基本塊的入口地址,擴(kuò)展的基 本塊的入口地址是該擴(kuò)展的基本塊的第一條指令的地址,也就是該擴(kuò)展的基本塊包含的第 一個(gè)基本塊的入口地址,其中0x100,0x156,0x184,0x272...為基本塊的入口地址。
[0055]在步驟S202,響應(yīng)于該程序進(jìn)入反向調(diào)試,在至少一個(gè)擴(kuò)展的基本塊的入口地址 設(shè)定反向調(diào)試檢查點(diǎn)。程序進(jìn)入反向調(diào)試可以由用戶通過(guò)命令行進(jìn)行設(shè)定,對(duì)于圖形用戶 界面的調(diào)試器,也可以提供特別的按鈕,使程序進(jìn)入反向調(diào)試。設(shè)定反向調(diào)試檢查點(diǎn)的步驟 可以由調(diào)試器自動(dòng)設(shè)定的,也就是在擴(kuò)展的基本塊的入口地址加入一條trap指令,與現(xiàn)有 技術(shù)中加入檢查點(diǎn)的實(shí)現(xiàn)是一樣的,不同之處在于加檢查點(diǎn)的位置不同。調(diào)試器可以通過(guò) 搜索編譯器輸出的包含擴(kuò)展基本塊入口地址的調(diào)試信息來(lái)得到該程序的所有擴(kuò)展基本塊 的入口地址,在這些入口地址加入反向調(diào)試檢查點(diǎn)。例如,可以從圖4和圖5相結(jié)合中搜索 出[247,5]為擴(kuò)展的基本塊的入口地址,就在該地指出加入反向調(diào)試檢查點(diǎn)。在另外一種 實(shí)施方式中,只在程序動(dòng)態(tài)執(zhí)行到一個(gè)函數(shù)時(shí),才把這個(gè)函數(shù)中的所有EBB的入口插入檢 查點(diǎn)。
[0056]在EBB的入口地址加入反向調(diào)試檢查點(diǎn)的方法從理論上講有很多有優(yōu)點(diǎn):首先, 因?yàn)槌绦蚩梢詮腅BB的入口指令到達(dá)EBB中的每一條指令,這樣就不用擔(dān)心從反向調(diào)試檢 查點(diǎn)無(wú)法回退到反向調(diào)試目標(biāo)斷點(diǎn);其次,可以實(shí)現(xiàn)基本塊的可達(dá)性,因?yàn)閿U(kuò)展的基本塊 EBB包含了一組基本塊BB,從擴(kuò)展的基本塊EBB的入口基本塊BB,可以到達(dá)擴(kuò)展的基本塊 EBB中的每個(gè)基本塊BB ;最后擴(kuò)展的基本塊EBB擴(kuò)展了基本塊BB,每個(gè)擴(kuò)展的基本塊EBB包 含至少一個(gè)基本塊BB,這樣大大地減少了反向調(diào)試檢查點(diǎn)的插入量,減少了存儲(chǔ)空間,相應(yīng) 也減少了時(shí)間和空間復(fù)雜性。
[0057]在步驟S203,響應(yīng)于程序運(yùn)行到設(shè)定的反向調(diào)試檢查點(diǎn),存儲(chǔ)該檢查點(diǎn)對(duì)應(yīng)的調(diào) 試需要存儲(chǔ)的信息。調(diào)試需要存儲(chǔ)的信息包括但不限于寄存器的值和相關(guān)內(nèi)存空間的值, 可以保留全部寄存器的值,及部分變化的值,全部?jī)?nèi)存的值,也可以只保留部分內(nèi)存的值。 在一種實(shí)施方式中,寄存器的值為在當(dāng)前法向調(diào)試檢查點(diǎn)的寄存器的原始值,相關(guān)內(nèi)存的 值為在當(dāng)前反向調(diào)試檢查點(diǎn)和下一個(gè)反向調(diào)試檢查點(diǎn)之間發(fā)生變化的內(nèi)存空間的原始值, 圖6示出了在反向調(diào)試檢查點(diǎn)調(diào)試器需要存儲(chǔ)的信息的一種實(shí)施方式。在檢查點(diǎn)1,存儲(chǔ) 全部寄存器rl-r32在反向調(diào)試檢查點(diǎn)I的原始值,并且在執(zhí)行到第3條指令時(shí),內(nèi)存I的 值要發(fā)生改變,調(diào)試器通過(guò)系統(tǒng)調(diào)用把當(dāng)前被調(diào)試進(jìn)程的內(nèi)存設(shè)成不可寫,這樣當(dāng)有指令 寫內(nèi)存時(shí),系統(tǒng)發(fā)生中斷,這時(shí)可以在反向調(diào)試檢查點(diǎn)調(diào)試器需要存儲(chǔ)的信息中存儲(chǔ)內(nèi)存I 的原始值,也就是反向調(diào)試檢查點(diǎn)I和反向調(diào)試檢查點(diǎn)2之間在反向調(diào)試檢查點(diǎn)I時(shí)內(nèi)存 I的原始值。同樣,在檢查點(diǎn)2,存儲(chǔ)全部寄存器rl-r32在反向調(diào)試檢查點(diǎn)2的原始值,并 且在第12條指令內(nèi)存4發(fā)生了變化,記錄反向調(diào)試檢查點(diǎn)2和反向調(diào)試檢查點(diǎn)3之間的內(nèi) 存4在反向調(diào)試檢查點(diǎn)2的原始值12。
[0058]這里調(diào)試需要存儲(chǔ)的信息可以以多種方式存儲(chǔ),例如,如果需要存儲(chǔ)的信息所占的存儲(chǔ)空間不大,可以單獨(dú)開辟一塊保護(hù)內(nèi)存來(lái)存儲(chǔ),之所以要保護(hù)起來(lái),就是要防止其他 程序?qū)υ搲K內(nèi)存進(jìn)行操作,從而修改了這些信息;如果需要的存儲(chǔ)空間很大,也可以采用非 易失性存儲(chǔ)器,例如,硬盤、光盤、電子盤等存儲(chǔ)介質(zhì)進(jìn)行存儲(chǔ)。
[0059]在步驟8204,響應(yīng)于接收到設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn),將程序回退到該反向調(diào)試 目標(biāo)斷點(diǎn)之前的,距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn),并獲得該反向調(diào)試檢 查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息,繼續(xù)執(zhí)行該程序,直至執(zhí)行到該反向調(diào)試目標(biāo)斷點(diǎn)。該反 向調(diào)試檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息主要包括在該反向調(diào)試檢查點(diǎn)存儲(chǔ)的內(nèi)存值和 寄存器值,這些值是與調(diào)試器存儲(chǔ)了哪些值相關(guān)的,如果存儲(chǔ)了所有的寄存器原始值和相 關(guān)內(nèi)存原始值,只要恢復(fù)在該反向調(diào)試檢查點(diǎn)存儲(chǔ)的內(nèi)存值和寄存器值即可;如果采用上 述圖6所述的存儲(chǔ)方式存儲(chǔ),則在恢復(fù)法向調(diào)試檢查點(diǎn)k的調(diào)試需要存儲(chǔ)的信息時(shí),需要將
在反向調(diào)試檢查點(diǎn)n,n-1,......k+1,k存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息都恢復(fù)出來(lái),才能從檢
查點(diǎn)n開始反向一步一步恢復(fù)出相關(guān)內(nèi)存和全部寄存器在反向調(diào)試檢查點(diǎn)k的原始值,這 里k和n都是正整數(shù),并且n > k。這里的相關(guān)是指和該程序有關(guān)的內(nèi)存空間。
[0060]在一種優(yōu)選的實(shí)施方式中,響應(yīng)于接收到設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn),將反向調(diào)試 目標(biāo)斷點(diǎn)對(duì)應(yīng)的指令替換成中斷指令,并且把原有指令保存,當(dāng)程序繼續(xù)執(zhí)行時(shí),在把原有 指令替換回來(lái),這樣不會(huì)造成指令序列變化,即改變指令的地址,并且可以在執(zhí)行到該指令 時(shí)發(fā)生中斷,程序停止執(zhí)行,用戶可以觀察相關(guān)的信息,例如寄存器和內(nèi)存等的信息。
[0061]在一種優(yōu)選的實(shí)施方式中,響應(yīng)于接收到的設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn)為多個(gè),獲 得該多個(gè)反向調(diào)試目標(biāo)斷點(diǎn)的最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn),然后再將程序回退到該最晚 執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn)之前的,距離該最晚執(zhí)行的反向調(diào)試的目標(biāo)反向調(diào)試斷點(diǎn)最近的 反向調(diào)試檢查點(diǎn),并恢復(fù)該檢查點(diǎn)存儲(chǔ)的初始內(nèi)存值和寄存器值,繼續(xù)反向執(zhí)行該程序,直 至執(zhí)行到該最早執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn)。最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn)不能通過(guò)將所有 的反向調(diào)試目標(biāo)斷點(diǎn)的指令地址進(jìn)行比較,因?yàn)橹噶钪写嬖谔D(zhuǎn)指令,所以并非指令地址 小的指令就一定先執(zhí)行,指令地址大的指令就一定后執(zhí)行?;谝粋€(gè)BB是由一組指令序列 組成的,BB中指令地址小的一定比同一 BB中指令地址大的先執(zhí)行,在EBB中的兩個(gè)BB,父 BB中的指令一定比子BB中的指令先執(zhí)行,可以通過(guò)這樣的方法判斷:獲得并存儲(chǔ)EBB的執(zhí) 行順序以及EBB中包含的BB的關(guān)系;通過(guò)對(duì)于任意兩個(gè)反向調(diào)試目標(biāo)斷點(diǎn),如果屬于不同 的EBB,根據(jù)它們所在的EBB的執(zhí)行順序獲得其執(zhí)行順序,如果屬于相同的EBB,并且屬于同 一 BB,根據(jù)其地址大小獲得其執(zhí)行順序,如果屬于相同的EBB,但是屬于不同BB,根據(jù)它們 所在BB在EBB的父子關(guān)系決定它們的執(zhí)行順序,即屬于父BB的斷點(diǎn)比子BB早執(zhí)行,從而獲 得最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn)。EBB的執(zhí)行順序可以通過(guò)已經(jīng)執(zhí)行過(guò)的EBB鏈存儲(chǔ)。上 述的技術(shù)方案主要是因?yàn)?一個(gè)函數(shù)內(nèi)包含多個(gè)擴(kuò)展的基本塊EBB,一個(gè)擴(kuò)展的基本塊EBB 內(nèi)包含多個(gè)基本塊BB,在執(zhí)行路徑上,并不是所有基本塊BB都被執(zhí)行,例如,圖7示出了在 圖3所示的程序中被執(zhí)行的基本塊BB和擴(kuò)展的基本塊EBB以及被加入的目標(biāo)調(diào)試斷點(diǎn),在 該圖中,有7個(gè)基本塊BB,只有BB1,BB2, BB4, BB6被執(zhí)行(灰色框),而且并不是所有EBB 被執(zhí)行,圖7有3個(gè)EBB,只有EBB1,EBB3被執(zhí)行。程序入口點(diǎn)肯定是EBB入口點(diǎn)。在另一 種實(shí)施方式中,記錄EBB的執(zhí)行順序以及EBB中執(zhí)行的BB,可以響應(yīng)于接收到設(shè)定的反向調(diào) 試目標(biāo)斷點(diǎn)根據(jù)存儲(chǔ)的EBB的執(zhí)行順序以及EBB中執(zhí)行的BB,被判別為不可以被反向調(diào)試, 發(fā)出警告。具體來(lái)說(shuō)通過(guò)反向調(diào)試目標(biāo)斷點(diǎn)的指令地址和已經(jīng)執(zhí)行的EBB的指令地址范圍來(lái)判別該目標(biāo)斷點(diǎn)是不是可以被反向執(zhí)行到的,如果不能被反向執(zhí)行到,可以提醒用戶。圖 7示出的程序中被設(shè)定了 3個(gè)反向調(diào)試的斷點(diǎn),分別在基本塊BB1,BB2,以及BB3中。其中 圖7中反向調(diào)試目標(biāo)斷點(diǎn)3就是不能被反向調(diào)試執(zhí)行到的斷點(diǎn)。
[0062]由于程序員經(jīng)常遇到的情況是真正有問(wèn)題的程序就一小段,程序員需要在該一小 段程序中反復(fù)設(shè)置反向目標(biāo)調(diào)試斷點(diǎn)進(jìn)行反向調(diào)試;另外,如果用戶只是反向執(zhí)行一步,調(diào) 試器也需要首先恢復(fù)到設(shè)定的反向調(diào)試檢查點(diǎn),這樣程序執(zhí)行效率很低,因此,在步驟S204 的一種優(yōu)選實(shí)施方式中,繼續(xù)執(zhí)行該程序,直至執(zhí)行到該反向調(diào)試目標(biāo)斷點(diǎn)時(shí),可以對(duì)從回 退到的該反向調(diào)試目標(biāo)斷點(diǎn)之前的,距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向檢查點(diǎn)到該目標(biāo) 調(diào)試斷點(diǎn)之間的每一條指令使用現(xiàn)有技術(shù)中的一步一停法中的技術(shù),在每條指令設(shè)定反向 調(diào)試檢查點(diǎn),并存儲(chǔ)該反向調(diào)試檢查點(diǎn)對(duì)應(yīng)的調(diào)試需要存儲(chǔ)的信息。這樣,程序員在這部分 程序中反復(fù)設(shè)置反向調(diào)試的目標(biāo)斷點(diǎn)時(shí),響應(yīng)于接收到設(shè)定的另一反向調(diào)試目標(biāo)斷點(diǎn),并 且該設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn)位于從回退到的該反向調(diào)試目標(biāo)斷點(diǎn)之前的,距離該反向調(diào) 試目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn)到該反向調(diào)試目標(biāo)斷點(diǎn)之間,將程序回退到該另一反向 調(diào)試目標(biāo)斷點(diǎn)前一條指令對(duì)應(yīng)的另一反向調(diào)試檢查點(diǎn),并獲得該另一反向調(diào)試檢查點(diǎn)存儲(chǔ) 的調(diào)試需要存儲(chǔ)的信息。這樣可以提高調(diào)試效率。
[0063]現(xiàn)有支持反向調(diào)試的調(diào)試器已經(jīng)提供了一些反向調(diào)試命令,例如命令setreverse =I表示設(shè)定反向調(diào)試,命令Reverse-next表示反向執(zhí)行到前一條語(yǔ)句;命令 Reverse-continue表示反向繼續(xù)執(zhí)行命令,應(yīng)用的場(chǎng)景包括設(shè)置一個(gè)反向調(diào)試目標(biāo)斷點(diǎn), 用戶希望以后程序可以回到這個(gè)點(diǎn),設(shè)置完這個(gè)反向調(diào)試目標(biāo)斷點(diǎn)以后用戶可以正向執(zhí) 行;當(dāng)用戶想回到以前設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn),可以執(zhí)行reverse-continue指令,這樣 程序可以返回到最后執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn)上。
[0064]使用本發(fā)明的方法,可以在調(diào)試器中另外設(shè)置幾個(gè)反向調(diào)試命令,例如:設(shè)定命令 Show checkpoints用來(lái)顯示調(diào)試器自動(dòng)設(shè)置了哪些反向調(diào)試檢查點(diǎn),該命令的結(jié)果可能顯 示為:
[0065]I)checkpoint I:address I,source line I
[0066]2)checkpoint 2:address 2,source line 2
[0067]3)checkpoint 3:address 3,source line 3
[0068]還可以設(shè)定命令find Checkpoint for [breakpoint]:,用來(lái)表示尋找離反向調(diào)試 目標(biāo)斷點(diǎn)[breakpoint]最近的反向調(diào)試檢查點(diǎn),其中[breakpoint]為反向調(diào)試目標(biāo)斷點(diǎn)。
[0069]上述添加的命令可以是命令行命令,如果調(diào)試器有圖形用戶界面,也可以設(shè)計(jì)相 應(yīng)的圖形用戶界面的按鈕來(lái)實(shí)現(xiàn)上述命令,等等。
[0070]圖8示出了圖2所示的調(diào)試方法的使用場(chǎng)景。在圖8中,用戶通過(guò)執(zhí)行命令“set reverse = I”決定進(jìn)入反向調(diào)試模式,該程序包含6個(gè)擴(kuò)展的基本塊,調(diào)試器自動(dòng)在每個(gè)擴(kuò) 展的基本塊入口地址設(shè)置6個(gè)反向調(diào)試檢查點(diǎn),用戶繼續(xù)執(zhí)行程序,執(zhí)行過(guò)程中在每個(gè)反 向調(diào)試檢查點(diǎn)都存儲(chǔ)調(diào)試需要存儲(chǔ)的信息,當(dāng)執(zhí)行到當(dāng)前執(zhí)行點(diǎn)時(shí),決定回到一些前面的 執(zhí)行點(diǎn)。如果用戶設(shè)置兩個(gè)反向調(diào)試目標(biāo)斷點(diǎn),該調(diào)試方法發(fā)現(xiàn)對(duì)反向調(diào)試目標(biāo)斷點(diǎn)2,反 向調(diào)試檢查點(diǎn)4是距離反向調(diào)試目標(biāo)斷點(diǎn)2最近的,并且在其之前的反向調(diào)試檢查點(diǎn),該調(diào) 試方法會(huì)恢復(fù)出反向調(diào)試檢查點(diǎn)4存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息,并繼續(xù)執(zhí)行,直至執(zhí)行到 反向調(diào)試目標(biāo)斷點(diǎn)2。其中,用戶可以使用調(diào)試命令。然后,對(duì)反向調(diào)試行目標(biāo)斷點(diǎn)I的執(zhí)行場(chǎng)景類似,這里不再贅述。
[0071]在同一個(gè)發(fā)明構(gòu)思下,本發(fā)明還公開了一種反向調(diào)試器,圖9示出了反向調(diào)試器 900的結(jié)構(gòu)框圖,根據(jù)圖9,該包括:獲取裝置901,被配置為獲取編譯器輸出的該程序的調(diào) 試信息,所述調(diào)試信息中包含該程序的擴(kuò)展的基本塊相關(guān)的信息;設(shè)定裝置902,被配置為 響應(yīng)于該程序進(jìn)入反向調(diào)試,在至少一個(gè)擴(kuò)展的基本塊的入口地址設(shè)定反向調(diào)試檢查點(diǎn); 存儲(chǔ)裝置903,被配置為響應(yīng)于程序運(yùn)行到設(shè)定的反向調(diào)試檢查點(diǎn),存儲(chǔ)該檢查點(diǎn)對(duì)應(yīng)的調(diào) 試需要存儲(chǔ)的信息;回退裝置904,被配置為響應(yīng)于接收到設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn),將程 序回退到該反向調(diào)試目標(biāo)斷點(diǎn)之前的、距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反響檢查點(diǎn),并獲 得在該反向調(diào)試檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息,并繼續(xù)執(zhí)行該程序,直至執(zhí)行到該反 向調(diào)試目標(biāo)斷點(diǎn)。
[0072]在一種實(shí)施方式中,擴(kuò)展的基本塊相關(guān)的信息由該編譯器構(gòu)造,存儲(chǔ)在該編譯器 輸出的調(diào)試信息中。
[0073]在一種實(shí)施方式中,調(diào)試需要存儲(chǔ)的信息至少包括寄存器的始值,內(nèi)存空間的值。 在優(yōu)選的實(shí)施方式中,寄存器的值為在當(dāng)前檢查點(diǎn)的寄存器的原始值,內(nèi)存空間的值為在 當(dāng)前檢查點(diǎn)和下一個(gè)檢查點(diǎn)之間發(fā)生變化的內(nèi)存空間的原始值。并且,在該優(yōu)選的實(shí)施方 式中,回退裝置的獲得該檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息包括:響應(yīng)于要恢復(fù)在反向調(diào)
試檢查點(diǎn)k的調(diào)試需要存儲(chǔ)的信息,將在反向調(diào)試檢查點(diǎn)n,n-1,......k+1,k存儲(chǔ)的調(diào)試
需要存儲(chǔ)的信息恢復(fù)出來(lái),從發(fā)向調(diào)試檢查點(diǎn)n開始反向一步一步恢復(fù)出相關(guān)內(nèi)存和全部 寄存器在檢查點(diǎn)k的原始值,其中k和n為正整數(shù),并且n > k。
[0074]在一種實(shí)施方式中,回退裝置還被配置為:響應(yīng)于接收到的設(shè)定的反向調(diào)試目標(biāo) 斷點(diǎn)為多個(gè),獲得最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn);將程序回退到該最晚執(zhí)行的反向調(diào)試目 標(biāo)斷點(diǎn)之前的,距離該最晚執(zhí)行的反向調(diào)試的目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn);恢復(fù)該反 向調(diào)試檢查點(diǎn)存儲(chǔ)的初始內(nèi)存值和寄存器值;繼續(xù)反向執(zhí)行該程序,直至執(zhí)行到該最早執(zhí) 行的反向調(diào)試目標(biāo)斷點(diǎn)。
[0075]在一種實(shí)施方式中,回退裝置被配置為通過(guò)以下步驟獲得該多個(gè)反向調(diào)試目標(biāo)斷 點(diǎn)的最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn):獲得并存儲(chǔ)EBB的執(zhí)行順序Hffi中包含的BB的關(guān)系; 通過(guò)對(duì)于任意兩個(gè)反向調(diào)試目標(biāo)斷點(diǎn),如果屬于不同的EBB,根據(jù)它們所在的EBB的執(zhí)行順 序獲得其執(zhí)行順序,如果屬于相同的EBB,并且屬于同一 BB,根據(jù)其地址大小獲得其執(zhí)行順 序,如果屬于相同的EBB,但是屬于不同BB,根據(jù)其所在BB在EBB的父子關(guān)系決定其執(zhí)行順 序,從而獲得最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn)。
[0076]在一種實(shí)時(shí)方式中,回退裝置還被配置為:獲得并存儲(chǔ)EBB的執(zhí)行順序以及EBB 中執(zhí)行的BB ;以及響應(yīng)于接收到設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn)根據(jù)存儲(chǔ)的EBB的執(zhí)行順序以及 EBB中執(zhí)行的BB,被判別為不可以被反向調(diào)試,發(fā)出警告。
[0077]在一種實(shí)施方式中,回退裝置的繼續(xù)執(zhí)行該程序,直至執(zhí)行到該反向調(diào)試目標(biāo)斷 點(diǎn)被配置為:對(duì)從回退到的該反向調(diào)試目標(biāo)斷點(diǎn)之前的,距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的 反向調(diào)試檢查點(diǎn)到該目標(biāo)調(diào)試斷點(diǎn)之間的每一條指令設(shè)定反向調(diào)試檢查點(diǎn);響應(yīng)于程序運(yùn) 行到設(shè)定的反向調(diào)試檢查點(diǎn),存儲(chǔ)該檢查點(diǎn)對(duì)應(yīng)的調(diào)試需要存儲(chǔ)的信息;響應(yīng)于接收到設(shè) 定的另一反向調(diào)試目標(biāo)斷點(diǎn),并且該設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn)位于從回退到的該反向調(diào)試 目標(biāo)斷點(diǎn)之前的,距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn)到該反向調(diào)試目標(biāo)斷點(diǎn)之間,將程序回退到該另一反向調(diào)試目標(biāo)斷點(diǎn)前一條指令對(duì)應(yīng)的另一反向調(diào)試檢查點(diǎn),并 獲得該另一反向調(diào)試檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息。
[0078]附圖中的流程圖和框圖顯示了根據(jù)本發(fā)明的多個(gè)實(shí)施例的系統(tǒng)、方法和計(jì)算機(jī)程 序產(chǎn)品的可能實(shí)現(xiàn)的體系架構(gòu)、功能和操作。在這點(diǎn)上,流程圖或框圖中的每個(gè)方框可以 代表一個(gè)模塊、程序段或代碼的一部分,所述模塊、程序段或代碼的一部分包含一個(gè)或多個(gè) 用于實(shí)現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實(shí)現(xiàn)中,方框中所 標(biāo)注的功能也可以以不同于附圖中所標(biāo)注的順序發(fā)生。例如,兩個(gè)連續(xù)的方框?qū)嶋H上可以 基本并行地執(zhí)行,它們有時(shí)也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的 是,框圖和/或流程圖中的每個(gè)方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行 規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來(lái)實(shí)現(xiàn),或者可以用專用硬件與計(jì)算機(jī)指令的 組合來(lái)實(shí)現(xiàn)。
[0079]以上已經(jīng)描述了本發(fā)明的各實(shí)施例,上述說(shuō)明是示例性的,并非窮盡性的,并且也 不限于所披露的各實(shí)施例。在不偏離所說(shuō)明的各實(shí)施例的范圍和精神的情況下,對(duì)于本技 術(shù)領(lǐng)域的普通技術(shù)人員來(lái)說(shuō)許多修改和變更都是顯而易見的。本文中所用術(shù)語(yǔ)的選擇,旨 在最好地解釋各實(shí)施例的原理、實(shí)際應(yīng)用或?qū)κ袌?chǎng)中的技術(shù)改進(jìn),或者使本【技術(shù)領(lǐng)域】的其 它普通技術(shù)人員能理解本文披露的各實(shí)施例。
【權(quán)利要求】
1.一種反向調(diào)試程序的方法,包括:獲取編譯器輸出的該程序的調(diào)試信息,所述調(diào)試信息中包含該程序的擴(kuò)展的基本塊相關(guān)EBB的信息; 響應(yīng)于該程序進(jìn)入反向調(diào)試,在至少一個(gè)擴(kuò)展的基本塊的入口地址設(shè)定反向調(diào)試檢查占.響應(yīng)于程序運(yùn)行到設(shè)定的反向調(diào)試檢查點(diǎn),存儲(chǔ)該反向調(diào)試檢查點(diǎn)對(duì)應(yīng)的調(diào)試需要存儲(chǔ)的信息;響應(yīng)于接收到設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn),將程序回退到該反向調(diào)試目標(biāo)斷點(diǎn)之前的、 距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn),并獲得該反向調(diào)試檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息,并繼續(xù)執(zhí)行該程序,直至執(zhí)行到該反向調(diào)試目標(biāo)斷點(diǎn)。
2.根據(jù)權(quán)利要求1所述的方法,其中所述擴(kuò)展的基本塊相關(guān)的信息由該編譯器構(gòu)造, 并且存儲(chǔ)在該編譯器輸出的調(diào)試信息中。
3.根據(jù)權(quán)利要求1所述的方法,其中調(diào)試需要存儲(chǔ)的信息至少包括寄存器的值,相關(guān)內(nèi)存空間的值。
4.根據(jù)權(quán)利要求3所述的方法,其中寄存器的值為在當(dāng)前反向調(diào)試檢查點(diǎn)的寄存器的原始值,相關(guān)內(nèi)存空間的值為在當(dāng)前反向調(diào)試檢查點(diǎn)和下一個(gè)反向調(diào)試檢查點(diǎn)之間發(fā)生變化的內(nèi)存空間的原始值。
5.根據(jù)權(quán)利要求4所述的方法,其中所述獲得該檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息包括:響應(yīng)于要恢復(fù)在反向調(diào)試檢查點(diǎn)k的調(diào)試需要存儲(chǔ)的信息,將在反向調(diào)試檢查點(diǎn)n,n-1,......k+1, k存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息恢復(fù)出來(lái),從發(fā)向調(diào)試檢查點(diǎn)n開始反向一步一步恢復(fù)出相關(guān)內(nèi)存和全部寄存器在檢查點(diǎn)k的原始值,其中k和n為正整數(shù),并且n > k。
6.根據(jù)權(quán)利要求1所述的方法,其中還包括響應(yīng)于接收到的設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn)為多個(gè):獲得最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn),將程序回退到該最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn)之前的,距離該最晚執(zhí)行的反向調(diào)試的目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn),恢復(fù)該反向調(diào)試檢查點(diǎn)存儲(chǔ)的初始內(nèi)存值和寄存器值,繼續(xù)反向執(zhí)行該程序,直至執(zhí)行到該最早執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn)。
7.根據(jù)權(quán)利要求6所述的方法,其中所述獲得該多個(gè)反向調(diào)試目標(biāo)斷點(diǎn)中最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn)包括:獲得并存儲(chǔ)EBB的執(zhí)行順序以及EBB中包含的BB的關(guān)系;對(duì)于任意兩個(gè)反向調(diào)試目標(biāo)斷點(diǎn),根據(jù)下列各項(xiàng)之一獲得目標(biāo)斷點(diǎn)的執(zhí)行順序:1)該兩個(gè)反向調(diào)試目標(biāo)斷點(diǎn)屬于不同的EBB,根據(jù)它們所在的EBB的執(zhí)行順序獲得其執(zhí)行順序;2)該兩個(gè)反向調(diào)試目標(biāo)斷點(diǎn)屬于相同的EBB并且屬于同一BB,根據(jù)其地址大小獲得其執(zhí)行順序;3)該兩個(gè)反向調(diào)試目標(biāo)斷點(diǎn)屬于相同的EBB,但是屬于不同BB,根據(jù)其所在BB在EBB的父子關(guān)系獲得其執(zhí)行順序。
8.根據(jù)權(quán)利要求1所述的方法,其中還包括:獲得并存儲(chǔ)EBB的執(zhí)行順序以及EBB中執(zhí)行的BB ;響應(yīng)于設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn)根據(jù)存儲(chǔ)的EBB的執(zhí)行順序以及EBB中執(zhí)行的BB,被判別為不可以被反向調(diào)試,發(fā)出警告。
9.根據(jù)權(quán)利要求1所述的方法,其中所述繼續(xù)執(zhí)行該程序,直至執(zhí)行到該反向調(diào)試目標(biāo)斷點(diǎn)包括:對(duì)從回退到的該反向調(diào)試目標(biāo)斷點(diǎn)之前的,距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn)到該目標(biāo)調(diào)試斷點(diǎn)之間的每一條指令設(shè)定反向調(diào)試檢查點(diǎn);響應(yīng)于程序運(yùn)行到設(shè)定的反向調(diào)試檢查點(diǎn),存儲(chǔ)該檢查點(diǎn)對(duì)應(yīng)的調(diào)試需要存儲(chǔ)的信息;響應(yīng)于接收到設(shè)定的另一反向調(diào)試目標(biāo)斷點(diǎn), 并且該設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn)位于從回退到的該反向調(diào)試目標(biāo)斷點(diǎn)之前的,距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn)到該反向調(diào)試目標(biāo)斷點(diǎn)之間,將程序回退到該另一反向調(diào)試目標(biāo)斷點(diǎn)前一條指令對(duì)應(yīng)的另一反向調(diào)試檢查點(diǎn),并獲得該另一反向調(diào)試檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息。
10.一種反向調(diào)試器,包括:獲取裝置,被配置為獲取編譯器輸出的程序的調(diào)試信息,所述調(diào)試信息中包含該程序的擴(kuò)展的基本塊EBB相關(guān)的信息;設(shè)定裝置,被配置為響應(yīng)于該程序進(jìn)入反向調(diào)試,在至少一個(gè)擴(kuò)展的基本塊的入口地址設(shè)定反向調(diào)試檢查點(diǎn);存儲(chǔ)裝置,被配置為響應(yīng)于程序運(yùn)行到設(shè)定的反向調(diào)試檢查點(diǎn),存儲(chǔ)該反向調(diào)試檢查點(diǎn)對(duì)應(yīng)的調(diào)試需要存儲(chǔ)的信息;回退裝置,被配置為響應(yīng)于接收到設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn),將程序回退到該反向調(diào)試目標(biāo)斷點(diǎn)之前的、距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn),并獲得該反向調(diào)試檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息,并繼續(xù)執(zhí)行該程序,直至執(zhí)行到該反向調(diào)試目標(biāo)斷點(diǎn)。
11.根據(jù)權(quán)利要求10所述的反向調(diào)試器,其中所述擴(kuò)展的基本塊相關(guān)的信息由該編譯器構(gòu)造,并且存儲(chǔ)在該編譯器輸出的調(diào)試信息中。
12.根據(jù)權(quán)利要求10所述的反向調(diào)試器,其中調(diào)試需要存儲(chǔ)的信息至少包括寄存器的始值,相關(guān)內(nèi)存空間的值。
13.根據(jù)權(quán)利要求12所述的反向調(diào)試器,其中寄存器的值為在當(dāng)前反向調(diào)試檢查點(diǎn)的寄存器的原始值,相關(guān)內(nèi)存空間的值為在當(dāng)前反向調(diào)試檢查點(diǎn)和下一個(gè)反向調(diào)試檢查點(diǎn)之間發(fā)生變化的內(nèi)存空間的原始值。
14.根據(jù)權(quán)利要求13所述的反向調(diào)試器,其中所述回退裝置的獲得該檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的息包括:響應(yīng)于要恢復(fù)在反向調(diào)試檢查點(diǎn)k的調(diào)試需要存儲(chǔ)的信息,將在反向調(diào)試檢查點(diǎn)n,n-1,......k+1, k存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息恢復(fù)出來(lái),從發(fā)向調(diào)試檢查點(diǎn)n開始反向一步一步恢復(fù)出相關(guān)內(nèi)存和全部寄存器在檢查點(diǎn)k的原始值,其中k和n為正整數(shù),并且n > k。
15.根據(jù)權(quán)利要求10所述的反向調(diào)試器,其中所述回退裝置還被配置為響應(yīng)于接收到的設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn)為多個(gè):獲得最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn),將程序回退到該最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn)之前的,距離該最晚執(zhí)行的反向調(diào)試的目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn),恢復(fù)該反向調(diào)試檢查點(diǎn)存儲(chǔ)的初始內(nèi)存值和寄存器值,繼續(xù)反向執(zhí)行該程序,直至執(zhí)行到該最早執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn)。
16.根據(jù)權(quán)利要求15所述的反向調(diào)試器,其中所述回退裝置被配置為通過(guò)以下步驟獲得該多個(gè)反向調(diào)試目標(biāo)斷點(diǎn)的最晚執(zhí)行的反向調(diào)試目標(biāo)斷點(diǎn):獲得并存儲(chǔ)EBB的執(zhí)行順序以及EBB中包含的BB的關(guān)系;對(duì)于任意兩個(gè)反向調(diào)試目標(biāo)斷點(diǎn),根據(jù)下列各項(xiàng)之一獲得目標(biāo)斷點(diǎn)的執(zhí)行順序:4)該兩個(gè)反向調(diào)試目標(biāo)斷點(diǎn)屬于不同的EBB,根據(jù)它們所在的EBB的執(zhí)行順序獲得其執(zhí)行順序;5)該兩個(gè)反向調(diào)試目標(biāo)斷點(diǎn)屬于相同的EBB并且屬于同一BB,根據(jù)其地址大小獲得其執(zhí)行順序;6)該兩個(gè)反向調(diào)試目標(biāo)斷點(diǎn)屬于相同的EBB,但是屬于不同BB,根據(jù)其所在BB在EBB 的父子關(guān)系獲得其執(zhí)行順序。
17.根據(jù)權(quán)利要求10所述的反向調(diào)試器,其中回退裝置還被配置為:獲得并存儲(chǔ)EBB的執(zhí)行順序以及EBB中執(zhí)行的BB ;響應(yīng)于設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn)根據(jù)存儲(chǔ)的EBB的執(zhí)行順序以及EBB中執(zhí)行的BB,被判別為不可以被反向調(diào)試,發(fā)出警告。
18.根據(jù)權(quán)利要求10所述的反向調(diào)試器,其中所述回退裝置的繼續(xù)執(zhí)行該程序,直至執(zhí)行到該反向調(diào)試目標(biāo)斷點(diǎn)被配置為:`對(duì)從回退到的該反向調(diào)試目標(biāo)斷點(diǎn)之前的,距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn)到該目標(biāo)調(diào)試斷點(diǎn)之間的每一條指令設(shè)定反向調(diào)試檢查點(diǎn);響應(yīng)于程序運(yùn)行到設(shè)定的反向調(diào)試檢查點(diǎn),存儲(chǔ)該檢查點(diǎn)對(duì)應(yīng)的調(diào)試需要存儲(chǔ)的信息;響應(yīng)于接收到設(shè)定的另一反向調(diào)試目標(biāo)斷點(diǎn),并且該設(shè)定的反向調(diào)試目標(biāo)斷點(diǎn)位于從回退到的該反向調(diào)試目標(biāo)斷點(diǎn)之前的,距離該反向調(diào)試目標(biāo)斷點(diǎn)最近的反向調(diào)試檢查點(diǎn)至Li 該反向調(diào)試目標(biāo)斷點(diǎn)之間,將程序回退到該另一反向調(diào)試目標(biāo)斷點(diǎn)前一條指令對(duì)應(yīng)的另一反向調(diào)試檢查點(diǎn),并獲得該另一反向調(diào)試檢查點(diǎn)存儲(chǔ)的調(diào)試需要存儲(chǔ)的信息。
【文檔編號(hào)】G06F11/36GK103577315SQ201210267108
【公開日】2014年2月12日 申請(qǐng)日期:2012年7月30日 優(yōu)先權(quán)日:2012年7月30日
【發(fā)明者】王帆, 李琦, 杜久常, 陳曉玲, 梅麗剛 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司