一種多斷點(diǎn)的軟件調(diào)試裝置和方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及軟件調(diào)試技術(shù),尤其涉及一種多斷點(diǎn)的軟件調(diào)試裝置和方法。
【背景技術(shù)】
[0002]微處理器調(diào)試技術(shù)廣泛地應(yīng)用于軟件故障定位、軟件代碼分析以及逆向工程領(lǐng)域,對(duì)微處理器的設(shè)計(jì)和使用有至關(guān)重要的作用。
[0003]對(duì)微處理器的軟件進(jìn)行調(diào)試一般包括以下兩個(gè)方面的內(nèi)容:在軟件程序中設(shè)置斷點(diǎn),使程序執(zhí)行到所設(shè)置的斷點(diǎn)位置時(shí)產(chǎn)生中斷并停止執(zhí)行;用戶可以對(duì)程序執(zhí)行單步操作或使之?dāng)[脫中斷狀態(tài)繼續(xù)往下執(zhí)行。
[0004]從上述內(nèi)容可以看出,斷點(diǎn)技術(shù)是微處理器的軟件調(diào)試中不可或缺并有決定性作用的技術(shù)。當(dāng)前的斷點(diǎn)技術(shù)主要分為兩種:
[0005]第一種,硬件斷點(diǎn)的方案。這種技術(shù)采用若干個(gè)斷點(diǎn)寄存器來存儲(chǔ)斷點(diǎn)位置的指針,在微處理器執(zhí)行指令時(shí),根據(jù)配置不斷將所執(zhí)行指令的指針與斷點(diǎn)寄存器中的斷點(diǎn)指針進(jìn)行對(duì)比,當(dāng)發(fā)生匹配時(shí),產(chǎn)生中斷并凍結(jié)微處理器的流水線跳入特定程序段進(jìn)行處理。這種硬件斷點(diǎn)的顯而易見的缺點(diǎn)就是,由于斷點(diǎn)寄存器的數(shù)量限制,硬件斷點(diǎn)只能實(shí)現(xiàn)數(shù)量有限的幾個(gè)斷點(diǎn),在調(diào)試過程中會(huì)有很多的限制。
[0006]第二種,軟件多斷點(diǎn)方案。這技術(shù)當(dāng)前使用非常廣泛,一般做法是將微處理器執(zhí)行的指令存儲(chǔ)器中的斷點(diǎn)位置的指令替換成斷點(diǎn)指令,并將斷點(diǎn)處的真實(shí)指令備份到另一個(gè)存儲(chǔ)器中,當(dāng)微處理器執(zhí)行到斷點(diǎn)位置時(shí),處理器流水線解析斷點(diǎn)位置處的指令,獲知該斷點(diǎn)位置處的指令為斷點(diǎn)指令后產(chǎn)生中斷,并凍結(jié)流水線跳入指定程序段進(jìn)行處理,在產(chǎn)生中斷后使用高級(jí)語言來解析該斷點(diǎn)處的真實(shí)指令,利用PC++來使程序跳入斷點(diǎn)后一條指令開始執(zhí)行。上述軟件多斷點(diǎn)調(diào)試技術(shù)需要對(duì)斷點(diǎn)位置的真實(shí)指令進(jìn)行備份,在替換回真實(shí)指令時(shí)需要高級(jí)語言來解析斷點(diǎn)處的真實(shí)指令,如此,實(shí)現(xiàn)該方案需要消耗大量額外的存儲(chǔ)空間來存儲(chǔ)備份斷點(diǎn)處的真實(shí)指令,還需要替換流水線中指令,實(shí)現(xiàn)困難。
【發(fā)明內(nèi)容】
[0007]為解決現(xiàn)有存在的問題,本發(fā)明實(shí)施例主要提供一種多斷點(diǎn)的軟件調(diào)試裝置和方法,簡(jiǎn)單易行的實(shí)現(xiàn)了多斷點(diǎn)的軟件調(diào)試,同時(shí)節(jié)省了單板上的存儲(chǔ)資源。
[0008]本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:
[0009]本發(fā)明提供了一種多斷點(diǎn)的軟件調(diào)試裝置,該軟件調(diào)試裝置包括:驅(qū)動(dòng)器、微處理器、指令存儲(chǔ)器和微碼集成開發(fā)環(huán)境IDE ;其中,
[0010]所述驅(qū)動(dòng)器,用于獲取軟件程序中的斷點(diǎn)信息,將所述斷點(diǎn)信息發(fā)送給指令存儲(chǔ)器,并根據(jù)指令存儲(chǔ)器中的斷點(diǎn)信息將斷點(diǎn)處的真實(shí)指令替換成斷點(diǎn)指令,在上報(bào)中斷給IDE后,根據(jù)IDE下發(fā)的命令將所述斷點(diǎn)指令換回真實(shí)指令,觸發(fā)微處理器解凍流水線,并在斷點(diǎn)指令執(zhí)行的間隙將斷點(diǎn)處的真實(shí)指令再次替換成斷點(diǎn)指令;
[0011]所述微處理器,用于當(dāng)執(zhí)行到斷點(diǎn)指令時(shí),通過驅(qū)動(dòng)器上報(bào)中斷給IDE,凍結(jié)流水線,并根據(jù)驅(qū)動(dòng)器的觸發(fā)解凍流水線,對(duì)斷點(diǎn)處的真實(shí)指令進(jìn)行取指;
[0012]所述指令存儲(chǔ)器,用于存儲(chǔ)斷點(diǎn)指令和斷點(diǎn)信息;
[0013]所述IDE,用于為用戶提供下發(fā)命令的交互界面。
[0014]上述方案中,所述斷點(diǎn)信息包括斷點(diǎn)位置地址;所述斷點(diǎn)指令為原地跳轉(zhuǎn)指令;所述斷點(diǎn)指令執(zhí)行的間隙為斷點(diǎn)指令在原地執(zhí)行跳轉(zhuǎn)的任意兩次的間隙。
[0015]上述方案中,所述驅(qū)動(dòng)器,還用于將來自所述IDE的命令解析成具體的寄存器或存儲(chǔ)器讀寫信號(hào)通過總線發(fā)送給所述微處理器和/或指令存儲(chǔ)器。
[0016]上述方案中,所述驅(qū)動(dòng)器,還用于將斷點(diǎn)位置和斷點(diǎn)處的真實(shí)指令存儲(chǔ)到IDE所在的上位機(jī)。
[0017]上述方案中,所述微處理器包括:流水線和調(diào)試模塊;其中,
[0018]所述流水線,用于當(dāng)執(zhí)行到斷點(diǎn)指令時(shí),解析發(fā)現(xiàn)當(dāng)前指令為斷點(diǎn)指令后向所述調(diào)試模塊發(fā)送通知,并在解凍后對(duì)斷點(diǎn)處的真實(shí)指令進(jìn)行取指;
[0019]所述調(diào)試模塊,用于當(dāng)接收到來自所述流水線的通知后,凍結(jié)流水線,上報(bào)中斷給驅(qū)動(dòng)器,并根據(jù)驅(qū)動(dòng)器的觸發(fā)解凍流水線。
[0020]上述方案中,所述調(diào)試模塊,具體用于當(dāng)接收到來自所述流水線的通知后,產(chǎn)生停止信號(hào)來凍結(jié)流水線。
[0021]本發(fā)明還提供了一種多斷點(diǎn)的軟件調(diào)試方法,該軟件調(diào)試方法包括:
[0022]微碼集成開發(fā)環(huán)境IDE在軟件程序中設(shè)置斷點(diǎn);
[0023]驅(qū)動(dòng)器獲取軟件程序中的斷點(diǎn)信息,根據(jù)所述斷點(diǎn)信息將斷點(diǎn)處的真實(shí)指令替換成斷點(diǎn)指令;
[0024]當(dāng)執(zhí)行到所述斷點(diǎn)指令時(shí),微處理器上報(bào)中斷給IDE,并凍結(jié)流水線;
[0025]驅(qū)動(dòng)器根據(jù)IDE下發(fā)的命令將所述斷點(diǎn)指令換回真實(shí)指令;
[0026]微處理器解凍流水線,對(duì)斷點(diǎn)處的真實(shí)指令進(jìn)行取指;
[0027]驅(qū)動(dòng)器在斷點(diǎn)指令執(zhí)行的間隙將斷點(diǎn)處的真實(shí)指令再次替換成斷點(diǎn)指令。
[0028]上述方案中,所述斷點(diǎn)信息包括斷點(diǎn)位置地址。
[0029]上述方案中的軟件調(diào)試方法還包括:驅(qū)動(dòng)器將斷點(diǎn)位置和斷點(diǎn)處的真實(shí)指令存儲(chǔ)到IDE所在的上位機(jī)。
[0030]上述方案中,所述驅(qū)動(dòng)器根據(jù)IDE下發(fā)的命令將所述斷點(diǎn)指令換回真實(shí)指令,微處理器解凍流水線,對(duì)斷點(diǎn)處的真實(shí)指令進(jìn)行取指,驅(qū)動(dòng)器在斷點(diǎn)指令執(zhí)行的間隙將斷點(diǎn)處的真實(shí)指令再次替換成斷點(diǎn)指令為:驅(qū)動(dòng)器根據(jù)IDE下發(fā)的單步操作命令或繼續(xù)操作命令,將所述斷點(diǎn)指令換回真實(shí)指令,在換回真實(shí)指令時(shí),微處理器解凍流水線,對(duì)斷點(diǎn)處的真實(shí)指令進(jìn)行取指,在對(duì)所述真實(shí)指令取指完成后,在任意兩次執(zhí)行斷點(diǎn)指令的間隙將斷點(diǎn)處的真實(shí)指令再次替換成斷點(diǎn)指令。
[0031]本發(fā)明實(shí)施例提供了一種多斷點(diǎn)的軟件調(diào)試裝置和方法,微碼集成開發(fā)環(huán)境(IDE, Integrated Development Environment)在軟件程序中設(shè)置斷點(diǎn),驅(qū)動(dòng)器獲取軟件程序中的斷點(diǎn)信息,根據(jù)所述斷點(diǎn)信息將斷點(diǎn)處的真實(shí)指令替換成斷點(diǎn)指令,當(dāng)執(zhí)行到所述斷點(diǎn)指令時(shí),微處理器上報(bào)中斷給IDE,并凍結(jié)流水線,驅(qū)動(dòng)器根據(jù)IDE下發(fā)的命令將所述斷點(diǎn)指令換回真實(shí)指令,微處理器解凍流水線,對(duì)斷點(diǎn)處的真實(shí)指令進(jìn)行取指,驅(qū)動(dòng)器在斷點(diǎn)指令執(zhí)行的間隙將斷點(diǎn)處的真實(shí)指令再次替換成斷點(diǎn)指令;如此,本申請(qǐng)利用斷點(diǎn)指令的特性和流水線凍結(jié)的空隙來完成替換指令的操作,不僅可以在指令存儲(chǔ)器中繼續(xù)保留斷點(diǎn),而且不用額外增加單板上的存儲(chǔ)空間來存儲(chǔ)斷點(diǎn)位置的指令,節(jié)省大量的硬件存儲(chǔ)資源的同時(shí)也簡(jiǎn)化了調(diào)試步驟。
【附圖說明】
[0032]圖1為本發(fā)明實(shí)施例提供的多斷點(diǎn)的軟件調(diào)試裝置的結(jié)構(gòu)示意圖
[0033]圖2為本發(fā)明實(shí)施例提供的軟件調(diào)試裝置中微處理器和指令存儲(chǔ)器的結(jié)構(gòu)示意圖;
[0034]圖3為本發(fā)明實(shí)施例提供的多斷點(diǎn)的軟件調(diào)試方法流程圖;
[0035]圖4為本發(fā)明實(shí)施例提供的斷點(diǎn)的軟件設(shè)置方法流程圖;
[0036]圖5為本發(fā)明實(shí)施例提供的執(zhí)行單步操作的流程圖;
[0037]圖6為本發(fā)明實(shí)施例提供的執(zhí)行繼續(xù)操作的流程圖。
【具體實(shí)施方式】
[0038]本發(fā)明實(shí)施例中,IDE在軟件程序中設(shè)置斷點(diǎn);驅(qū)動(dòng)器獲取軟件程序中的斷點(diǎn)信息,根據(jù)所述斷點(diǎn)信息將斷點(diǎn)處的真實(shí)指令替換成斷點(diǎn)指令;當(dāng)執(zhí)行到所述斷點(diǎn)指令時(shí),微處理器上報(bào)中斷給IDE,并凍結(jié)流水線;驅(qū)動(dòng)器根據(jù)IDE下發(fā)的命令將所述斷點(diǎn)指令換回真實(shí)指令;微處理器解凍流水線,對(duì)斷點(diǎn)處的真實(shí)指令進(jìn)行取指;驅(qū)動(dòng)器在斷點(diǎn)指令執(zhí)行的間隙將斷點(diǎn)處的真實(shí)指令再次替換成斷點(diǎn)指令,通過上述方法來實(shí)現(xiàn)多斷點(diǎn)的軟件調(diào)試。
[0039]下面通過附圖及具體實(shí)施例對(duì)本發(fā)明做進(jìn)一步的詳細(xì)說明;
[0040]本發(fā)明實(shí)施例提供的多斷點(diǎn)的軟件調(diào)試裝置的結(jié)構(gòu)如圖1所示,該軟件調(diào)試裝置包括:驅(qū)動(dòng)器(Driver) 10、微處理器11、指令存儲(chǔ)器12和IDE13 ;其中,
[0041]所述驅(qū)動(dòng)器10,用于獲取軟件程序中的斷點(diǎn)信息,將所述斷點(diǎn)信息發(fā)送給指令存儲(chǔ)器,并根據(jù)指令存儲(chǔ)器中的斷點(diǎn)信息將斷點(diǎn)處的真實(shí)指令替換成斷點(diǎn)指令,在上報(bào)中斷給IDE13后,根據(jù)IDE13下發(fā)的命令將所述斷點(diǎn)指令換回真實(shí)指令,觸發(fā)微處理器11解凍流水線,并在斷點(diǎn)指令執(zhí)行的間隙將斷點(diǎn)處的真實(shí)指令再次替換成斷點(diǎn)指令;
[0042]所述微處理器11,用于當(dāng)執(zhí)行到所述斷點(diǎn)指令時(shí),通過驅(qū)動(dòng)器10上報(bào)中斷給IDE13,凍結(jié)流水線,并根據(jù)驅(qū)動(dòng)器10的觸發(fā)解凍流水線,對(duì)斷點(diǎn)處的真實(shí)指令進(jìn)行取指;
[0043]所述指令存儲(chǔ)器12,用于存儲(chǔ)斷點(diǎn)指令和斷點(diǎn)信息;
[0044]所述IDE13,用于為用戶提供下發(fā)命令的交互界面;
[0045]其中,所述斷點(diǎn)信息包括斷點(diǎn)位置地址;
[0046]所述斷點(diǎn)指令為原地跳轉(zhuǎn)指令,所述斷點(diǎn)指令執(zhí)行的間隙為斷點(diǎn)指令在原地執(zhí)行跳轉(zhuǎn)的任意兩次的間隙;
[0047]所述驅(qū)動(dòng)器10,還用于將來自所述IDE13的命令解析成具體的寄存器或存儲(chǔ)器讀寫信號(hào)通過總線發(fā)送給所述微處理器11和/或指令存儲(chǔ)器12 ;所述命令包括:設(shè)置斷點(diǎn)命令以及執(zhí)行單步(Step)操作或繼續(xù)(Continue)操作等命令;
[0048]所述IDE13安裝在上位機(jī)上,在為微處理器11和或指令存儲(chǔ)器12下發(fā)命令后,所述驅(qū)動(dòng)器10,還用于將斷點(diǎn)位置和斷點(diǎn)處的真實(shí)指令存儲(chǔ)到IDE13所在的上位機(jī)。
[0049]圖2所示為本發(fā)明實(shí)施例提供的微處理器11和指令存儲(chǔ)器12的結(jié)構(gòu)圖,如圖所示,所述微處理器11具體包括:流水線20和調(diào)試(Debug)模塊21 ;其中,
[0050]所述流水線20,用于當(dāng)執(zhí)行到斷點(diǎn)指令時(shí),解析發(fā)現(xiàn)當(dāng)前指令為斷點(diǎn)指令后向所述調(diào)試模塊21發(fā)送通知,并在解凍后對(duì)斷點(diǎn)處的真實(shí)指令進(jìn)行取指;
[0051]所述調(diào)試模塊21,用于當(dāng)接收到來自所述流水線20的通知后,凍結(jié)流水線,上報(bào)中斷給驅(qū)動(dòng)器10,并根據(jù)驅(qū)動(dòng)器10的觸發(fā)解凍流水線;
[0052]所述調(diào)試模塊21,具體用于當(dāng)接收到來自所述流水線20的通知后,產(chǎn)生停止(stall)信號(hào)來凍結(jié)流水線;
[0053]所述上位機(jī)上安裝的IDE13可以通過總線操作所述調(diào)試模塊21中的寄存器來解除流水線凍結(jié),從而使微處理器11可以執(zhí)行單步操作或繼續(xù)操作;
[0054]所述上位機(jī)上安裝的IDE13還可以通過總線來對(duì)指令存儲(chǔ)器12中存儲(chǔ)的指令內(nèi)容進(jìn)行修改,所述指令存儲(chǔ)器12可以由SRAM組成。
[0055]本發(fā)明實(shí)施例提供一種多斷點(diǎn)的軟件調(diào)試方法,如圖3所示,該軟件調(diào)試方法包括以下步驟:
[0056]步驟301:在軟件程序中設(shè)置斷點(diǎn);
[0057]具體的,調(diào)試開始后,用戶通過IDE在軟件程序中設(shè)置斷點(diǎn),斷點(diǎn)的數(shù)量和位置由用戶根據(jù)需求來設(shè)定;
[0058]步驟302:驅(qū)動(dòng)器獲取軟件程序中的斷點(diǎn)信息,根據(jù)所述斷點(diǎn)信息將斷點(diǎn)處的真實(shí)指令替換為斷點(diǎn)指令;<