專利名稱:一種嵌入式系統(tǒng)多任務(wù)并發(fā)調(diào)試的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及通訊領(lǐng)域中一種嵌入式系統(tǒng)多任務(wù)并發(fā)調(diào)試的方法。
背景技術(shù):
在嵌入式操作系統(tǒng)上開發(fā)的軟件中,如通信軟件,大量使用狀態(tài)機(jī)處理機(jī)制,傳統(tǒng)的調(diào)試方法可概括為如下過程設(shè)斷點(diǎn)--程序暫停--觀察程序狀態(tài)--繼續(xù)運(yùn)行。但傳統(tǒng)的設(shè)置斷點(diǎn)進(jìn)行調(diào)試的方法費(fèi)時(shí)費(fèi)力,如要看一條消息是否到來,需要在該消息的處理函數(shù)中設(shè)置斷點(diǎn),等待該消息到來,消息到來時(shí),程序斷住,再單步跟蹤,觀察是否和設(shè)計(jì)一致。而且,在斷點(diǎn)停住后,由于多任務(wù)系統(tǒng)的并發(fā)性,程序斷住后和程序全速運(yùn)行時(shí)的環(huán)境可能不一致;另外當(dāng)程序出現(xiàn)異?;蛘叻媳淼刃畔G失時(shí),一般就不能再設(shè)置斷點(diǎn),調(diào)試就不能繼續(xù)了。
另一方面,目前有一些商用的嵌入式軟件覆蓋測(cè)試工具,如CodeTEST,它是一種通用的測(cè)試和性能分析工具,但不能很好地適用于程序調(diào)試階段,因?yàn)槭紫?,CodeTEST的成本比較昂貴,不可能每個(gè)開發(fā)人員都用CodeTEST來調(diào)試程序;其次,CodeTEST需要硬件配合,操作也不方便。
因此,現(xiàn)有技術(shù)還存在有缺陷,而有待于改進(jìn)和發(fā)展。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是為了克服現(xiàn)有軟件調(diào)試技術(shù)不能很好地適用于多任務(wù)并發(fā)調(diào)試;以及克服軟件運(yùn)行異常的情況下進(jìn)行事后分析需要借助硬件分析的缺點(diǎn)。
本發(fā)明的技術(shù)方案如下一種嵌入式系統(tǒng)多任務(wù)并發(fā)調(diào)試的方法,其包括以下步驟a)在存儲(chǔ)器中對(duì)每一堆棧設(shè)置至少一堆棧跟蹤記錄區(qū),并初始化;b)執(zhí)行打印信息記錄函數(shù),在打印過程中調(diào)用打印內(nèi)容保存函數(shù)保存打印信息到所述堆棧跟蹤記錄區(qū);c)分別在入口處執(zhí)行入口跟蹤記錄函數(shù)和在出口處執(zhí)行出口跟蹤記錄函數(shù),在應(yīng)用程序的函數(shù)入口處和出口處分別進(jìn)行插樁;d)調(diào)用用于堆棧跟蹤記錄區(qū)的分析調(diào)試函數(shù)來顯示所有堆棧跟蹤記錄區(qū)基本信息、指定堆棧跟蹤記錄區(qū)的函數(shù)調(diào)用過程和指定堆棧跟蹤記錄區(qū)的保存的打印內(nèi)容。
所述的方法,其中,所述步驟a)還包括a1)規(guī)劃全部堆棧跟蹤記錄區(qū)的內(nèi)存,每一個(gè)堆棧對(duì)應(yīng)至少一個(gè)堆棧跟蹤記錄區(qū),確定堆棧跟蹤記錄區(qū)的內(nèi)存位置,函數(shù)調(diào)用記錄區(qū)的大?。籥2)對(duì)每一個(gè)堆棧,初始化至少一個(gè)堆棧跟蹤記錄區(qū),填寫基本信息區(qū)內(nèi)容、函數(shù)嵌套深度、當(dāng)前打印記錄索引,并對(duì)當(dāng)前函數(shù)記錄索引清零。
所述的方法,其中,所述步驟a2)中在堆棧的底部保存堆棧跟蹤記錄區(qū)的指針。
所述的方法,其中,所述步驟b)還包括b1)根據(jù)打印信息記錄函數(shù)的局部變量的指針定位堆棧跟蹤記錄區(qū)的指針;b2)根據(jù)堆棧跟蹤記錄區(qū)的當(dāng)前打印記錄索引,保存打印的字符串內(nèi)容到記錄區(qū)的打印內(nèi)容保存區(qū),同時(shí)更新當(dāng)前打印記錄索引,并將打印內(nèi)容保存區(qū)設(shè)計(jì)成環(huán)型隊(duì)列方式。
所述的方法,其中,所述步驟b)還包括
b11)根據(jù)出口跟蹤記錄函數(shù)的局部變量指針定位堆棧跟蹤記錄區(qū)的指針;b12)判斷函數(shù)調(diào)用記錄區(qū)是否為空,如為空,則退出;否則進(jìn)入步驟b13);b13)判斷函數(shù)調(diào)用記錄區(qū)是否滿,如已滿,再判斷丟棄函數(shù)調(diào)用數(shù)是否為0,如不為0,則丟棄函數(shù)調(diào)用數(shù)減1,并退出;否則繼續(xù)步驟b14);b14)根據(jù)當(dāng)前函數(shù)記錄索引回溯,查找到調(diào)用函數(shù)的記錄索引,在該調(diào)用函數(shù)的記錄區(qū)中根據(jù)當(dāng)前時(shí)間,計(jì)算并保存函數(shù)執(zhí)行時(shí)間,設(shè)置調(diào)用函數(shù)的記錄區(qū)為無效標(biāo)記;b15)所述堆棧跟蹤記錄區(qū)的函數(shù)嵌套深度減1,如果函數(shù)嵌套深度不為0,退出;否則繼續(xù)步驟b16);b16)設(shè)置函數(shù)起始記錄索引值為當(dāng)前函數(shù)記錄索引。
所述的方法,其中,所述分析調(diào)試函數(shù)包括第一調(diào)試函數(shù),顯示所有被跟蹤的堆棧標(biāo)識(shí)、堆棧運(yùn)行函數(shù);第二調(diào)試函數(shù),根據(jù)堆棧標(biāo)識(shí),顯示指定堆棧中的最近運(yùn)行的函數(shù),以及每個(gè)函數(shù)打印的內(nèi)容;第三調(diào)試函數(shù),根據(jù)堆棧標(biāo)識(shí),顯示指定堆棧最近打印的1K內(nèi)容。
所述的方法,其中,所述堆棧跟蹤記錄區(qū)放在保留內(nèi)存區(qū)中。
所述的方法,其中,所述步驟a)中對(duì)每個(gè)堆棧設(shè)置兩個(gè)堆棧跟蹤記錄區(qū),并在每次上電時(shí),切換堆棧跟蹤記錄區(qū),以保留上次運(yùn)行信息。
本發(fā)明所提供的一種嵌入式系統(tǒng)多任務(wù)并發(fā)調(diào)試的方法,由于通過在單板的保留內(nèi)存中給每個(gè)堆棧開辟一個(gè)堆棧跟蹤記錄區(qū),不存在互斥要求,因此不影響被測(cè)軟件的任務(wù)調(diào)度過程,并能順暢執(zhí)行多任務(wù)并發(fā)調(diào)試;調(diào)試過程中對(duì)軟件異常的分析直接利用該堆棧跟蹤記錄區(qū)記錄的信息,無需對(duì)硬件分析,因此實(shí)現(xiàn)簡(jiǎn)單,使用方便。
圖1是本發(fā)明方法的一個(gè)堆棧中發(fā)生的函數(shù)調(diào)用關(guān)系示意圖;圖2是本發(fā)明方法的函數(shù)執(zhí)行過程的嵌套深度變化示意圖;圖3是本發(fā)明方法的堆棧跟蹤記錄區(qū)的格式示意圖。
具體實(shí)施例方式
以下詳細(xì)對(duì)本發(fā)明方法進(jìn)行描述。
本發(fā)明通過在單板的保留內(nèi)存中給每個(gè)堆棧開辟一個(gè)堆棧跟蹤記錄區(qū),在堆棧跟蹤記錄區(qū)的環(huán)形隊(duì)列記錄最近在此堆棧內(nèi)執(zhí)行的函數(shù)和打印的信息,給調(diào)試者一個(gè)清晰的消息處理流程,可以節(jié)約大量的調(diào)試時(shí)間;在堆棧被完全破壞的情況下,通常的調(diào)試手段顯示不了函數(shù)調(diào)用過程,也可以通過該堆棧跟蹤記錄區(qū)顯示函數(shù)調(diào)用過程;本發(fā)明還可以在程序跑飛復(fù)位的情況下,通過再次上電,觀察單板保留內(nèi)存中的上次運(yùn)行的堆棧跟蹤記錄區(qū)信息,迅速定位跑飛的函數(shù)。
本發(fā)明的實(shí)施分為4大部分1.上電時(shí)調(diào)用相關(guān)初始化函數(shù)在單板的保留內(nèi)存中進(jìn)行堆棧跟蹤記錄區(qū)的分配和初始化。
2.在打印過程中調(diào)用打印內(nèi)容保存函數(shù)保存打印信息到堆棧跟蹤記錄區(qū)。
3.在應(yīng)用程序的函數(shù)入口處和出口處分別調(diào)用入口調(diào)用記錄函數(shù)和出口調(diào)用記錄函數(shù),進(jìn)行插樁;如果編譯器能夠自動(dòng)插樁,就不必手動(dòng)插樁。
4.調(diào)用用于堆棧跟蹤記錄區(qū)的分析調(diào)試函數(shù)來顯示所有堆棧跟蹤記錄區(qū)基本信息、指定堆棧跟蹤記錄區(qū)的函數(shù)調(diào)用過程和指定堆棧跟蹤記錄區(qū)的保存的打印內(nèi)容。
在嵌入式操作系統(tǒng)上開發(fā)的軟件一般比較復(fù)雜,一般為多個(gè)任務(wù)并發(fā)執(zhí)行,使用傳統(tǒng)的設(shè)置斷點(diǎn)進(jìn)行調(diào)試的方法,有時(shí)不能完全滿足需求。本發(fā)明可以跟蹤每個(gè)堆棧上執(zhí)行的最近若干個(gè)函數(shù)及其打印信息,彌補(bǔ)傳統(tǒng)調(diào)試方式的不足,可以作為軟件調(diào)試的有力幫助。
在嵌入式操作系統(tǒng)的軟件中,通常每個(gè)任務(wù)都有一個(gè)獨(dú)立的堆棧,如圖1所示的,在某一任務(wù)下執(zhí)行的函數(shù)一般都要占用堆棧中一塊內(nèi)存,在執(zhí)行完畢時(shí)釋放占用的堆棧內(nèi)存,隨著函數(shù)嵌套調(diào)用的增加,堆棧由頂部向底部開始增長(zhǎng)。如圖1中所示,在該堆棧中,函數(shù)f1調(diào)用函數(shù)f2,函數(shù)f2調(diào)用f3,如此等等。
本發(fā)明方法中的函數(shù)的執(zhí)行過程如圖2所示,縱軸表示函數(shù)嵌套,橫軸表示函數(shù)執(zhí)行過程。在t0時(shí)刻,開始進(jìn)入函數(shù)f1,嵌套深度為1;在t1時(shí)刻,進(jìn)入函數(shù)f2,嵌套深度為2;在t2時(shí)刻,進(jìn)入函數(shù)f3,嵌套深度為3;在t3時(shí)刻,退出函數(shù)f2,嵌套深度為2;在t4時(shí)刻,退出函數(shù)f1,嵌套深度為1;在t5時(shí)刻,退出函數(shù)f1,嵌套深度恢復(fù)為0。
堆棧跟蹤記錄區(qū)的結(jié)構(gòu)如圖3所示,從上到下依次是基本信息區(qū)、打印內(nèi)容保存區(qū)、函數(shù)調(diào)用記錄區(qū)?;拘畔^(qū)保存被跟蹤的堆棧信息,如堆棧名稱、標(biāo)識(shí)、棧頂、棧底、堆棧長(zhǎng)度等,當(dāng)前調(diào)用的函數(shù)嵌套深度,當(dāng)前函數(shù)記錄索引,當(dāng)前打印記錄索引;打印內(nèi)容保存區(qū)保存在該堆棧運(yùn)行的函數(shù)最近打印的字符串內(nèi)容,一般設(shè)置大小為1K;函數(shù)調(diào)用記錄區(qū)保存在此堆棧最近運(yùn)行的函數(shù)信息,根據(jù)內(nèi)存大小決定記錄區(qū)大小,一般至少記錄32個(gè)函數(shù)。
對(duì)于打印信息的記錄,不需要改變應(yīng)用程序,只需要在打印函數(shù)中增加一個(gè)打印信息記錄函數(shù),在該函數(shù)中保存打印信息到堆棧跟蹤記錄區(qū)的打印記錄區(qū)。對(duì)于調(diào)用函數(shù)記錄,需要應(yīng)用程序在每一個(gè)函數(shù)的入口處定義一個(gè)局部變量,可以為DWORD,填充一特殊值,如圖1的的函數(shù)標(biāo)記,再以函數(shù)標(biāo)記的地址和函數(shù)名字符串作為參數(shù)調(diào)用入口跟蹤記錄函數(shù),在函數(shù)出口處調(diào)用出口跟蹤記錄函數(shù),這樣才能完成在函數(shù)調(diào)用記錄區(qū)記錄調(diào)用函數(shù)的功能。
堆棧跟蹤記錄區(qū)可以放在保留內(nèi)存區(qū)中,即使軟件跑飛,也不被破壞。也可以對(duì)每個(gè)堆棧開辟兩個(gè)堆棧跟蹤記錄區(qū),每次上電時(shí),切換堆棧跟蹤記錄區(qū),從而實(shí)現(xiàn)保留上次運(yùn)行信息的目的。
本發(fā)明所述的嵌入式系統(tǒng)多任務(wù)并發(fā)調(diào)試的方法如下第一步所述堆棧跟蹤記錄區(qū)的初始化。這一步是在軟件上電初始化過程中完成,其主要步驟如下1.按每一個(gè)堆棧對(duì)應(yīng)至少一個(gè)堆棧跟蹤記錄區(qū)的原則規(guī)劃全部堆棧記錄區(qū)的內(nèi)存。主要是確定堆棧記錄區(qū)的內(nèi)存位置,堆棧記錄區(qū)的函數(shù)調(diào)用記錄區(qū)的大小等。
2.對(duì)每一個(gè)堆棧,分配并初始化至少一個(gè)堆棧跟蹤記錄區(qū),并在該堆棧跟蹤記錄區(qū)中填寫如基本信息區(qū)內(nèi)容、函數(shù)嵌套深度、當(dāng)前打印記錄索引等數(shù)據(jù),并對(duì)當(dāng)前函數(shù)記錄索引清零。為了提高入口跟蹤記錄函數(shù)和出口跟蹤記錄函數(shù)的效率,可以在堆棧的底部保存堆棧跟蹤記錄區(qū)的指針。
第二步打印信息記錄函數(shù)的執(zhí)行步驟。
1.首先根據(jù)打印信息記錄函數(shù)的局部變量的指針定位到堆棧跟蹤記錄區(qū)的指針。
2.根據(jù)堆棧跟蹤記錄區(qū)的當(dāng)前打印記錄索引,保存打印的字符串內(nèi)容到記錄區(qū)的打印內(nèi)容保存區(qū),同時(shí)更新當(dāng)前打印記錄索引,所述打印內(nèi)容保存區(qū)設(shè)計(jì)成環(huán)型隊(duì)列方式,這樣新的打印內(nèi)容將會(huì)覆蓋舊的打印內(nèi)容。
第三步入口跟蹤記錄函數(shù)的執(zhí)行步驟。入口跟蹤記錄函數(shù)是在應(yīng)用程序的函數(shù)入口處調(diào)用的,入口跟蹤記錄函數(shù)主要步驟如下1.根據(jù)入口跟蹤記錄函數(shù)的局部變量指針定位到所述堆棧跟蹤記錄區(qū)的指針。
2.判斷函數(shù)調(diào)用記錄區(qū)是否滿,如果已滿,則丟棄函數(shù)調(diào)用數(shù)加1,并退出。否則,進(jìn)入下述步驟3。
3.根據(jù)當(dāng)前函數(shù)記錄索引,在函數(shù)調(diào)用記錄區(qū)中記錄調(diào)用函數(shù)的相關(guān)信息如函數(shù)標(biāo)記地址、函數(shù)調(diào)用時(shí)間、函數(shù)名、嵌套深度等信息。最后更新當(dāng)前函數(shù)記錄索引,指向下一函數(shù)調(diào)用記錄。
第四步出口跟蹤記錄函數(shù)的執(zhí)行步驟。出口跟蹤記錄函數(shù)在應(yīng)用程序的函數(shù)出口處調(diào)用執(zhí)行,其包括以下步驟1.根據(jù)出口跟蹤記錄函數(shù)的局部變量指針定位堆棧跟蹤記錄區(qū)的指針。
2.判斷函數(shù)調(diào)用記錄區(qū)是否為空,如為空,則退出。否則進(jìn)入下述步驟3。
3.判斷函數(shù)調(diào)用記錄區(qū)是否滿,如已滿,再判斷丟棄函數(shù)調(diào)用數(shù)是否為0,如不為0,則丟棄函數(shù)調(diào)用數(shù)減1,并退出。否則繼續(xù)下述步驟4。
4.根據(jù)當(dāng)前函數(shù)記錄索引回溯,查找到調(diào)用函數(shù)的記錄索引,在該調(diào)用函數(shù)的記錄區(qū)中根據(jù)當(dāng)前時(shí)間,計(jì)算并保存函數(shù)執(zhí)行時(shí)間,設(shè)置調(diào)用函數(shù)的記錄區(qū)為無效標(biāo)記。
5.堆棧跟蹤記錄區(qū)的函數(shù)嵌套深度減1,如果函數(shù)嵌套深度不為0,退出。否則繼續(xù)下述步驟6。
6.設(shè)置函數(shù)起始記錄索引值為當(dāng)前函數(shù)記錄索引,以便開始新一輪的函數(shù)調(diào)用跟蹤記錄。
如果CPU中斷處理使用獨(dú)立的中斷棧,本發(fā)明方法還可以跟蹤在中斷棧中運(yùn)行的函數(shù)。如果CPU的中斷占用應(yīng)用程序堆棧,并要求跟蹤中斷處理中運(yùn)行的函數(shù),為實(shí)現(xiàn)互斥要求,需要在入口跟蹤記錄函數(shù)和出口跟蹤記錄函數(shù)中短暫地關(guān)閉中斷。
最后,還要提供若干個(gè)分析堆棧跟蹤記錄區(qū)的調(diào)試函數(shù)。主要有第一調(diào)試函數(shù)顯示所有被跟蹤的堆棧標(biāo)識(shí)、堆棧運(yùn)行函數(shù)(包括是否運(yùn)行完畢標(biāo)記)。這樣可以大致反映整個(gè)軟件運(yùn)行狀況。如是否全部運(yùn)行正?;蚴欠癖粩嘧 ?br>
第二調(diào)試函數(shù)根據(jù)堆棧標(biāo)識(shí),顯示指定堆棧中的最近運(yùn)行的函數(shù),以及每個(gè)函數(shù)打印的內(nèi)容。如果最近運(yùn)行的函數(shù)打印過多,則最多顯示最近打印的1K內(nèi)容;如果最近運(yùn)行的函數(shù)沒有打印,則不顯示打印內(nèi)容。
第三調(diào)試函數(shù)根據(jù)堆棧標(biāo)識(shí),顯示指定堆棧最近打印的1K內(nèi)容。
綜上,本發(fā)明的嵌入式系統(tǒng)多任務(wù)并發(fā)調(diào)試的方法,其優(yōu)點(diǎn)非常明顯,具體如下采用本發(fā)明所述方法,如果硬件提供一個(gè)高分辨率的計(jì)數(shù)器,由于所述堆棧跟蹤記錄區(qū)記錄有調(diào)試過程中的記錄信息,因此可以對(duì)最近運(yùn)行時(shí)刻的代碼進(jìn)行效率分析;采用本發(fā)明方法,如果硬件提供足夠的保留內(nèi)存,只要單板不掉電,還可以查詢上次程序跑飛的運(yùn)行過程;采用本發(fā)明所述方法,與現(xiàn)有的傳統(tǒng)的設(shè)置斷點(diǎn)調(diào)試技術(shù)相比,可以最大限度地減少對(duì)被測(cè)程序的干擾,在很多情況下,可以不用設(shè)置斷點(diǎn)進(jìn)行調(diào)試,節(jié)約大量調(diào)試時(shí)間;還可以查看被測(cè)程序最近運(yùn)行的狀態(tài),分析流程是否和設(shè)計(jì)一致,利于及早發(fā)現(xiàn)問題,這是傳統(tǒng)斷點(diǎn)調(diào)試技術(shù)難以做到的;通過堆棧記錄區(qū)的方式,對(duì)堆棧運(yùn)行函數(shù)調(diào)用過程做一備份,即使堆棧被破壞,也可以觀察到函數(shù)調(diào)用關(guān)系;采用本發(fā)明所述方法,與商用軟件CodeTEST等的軟件實(shí)現(xiàn)方式相比,更具有實(shí)時(shí)性和對(duì)被測(cè)軟件影響小的優(yōu)點(diǎn);與商用軟件CodeTEST等的硬件實(shí)現(xiàn)方式相比,本發(fā)明方法具有實(shí)現(xiàn)簡(jiǎn)單、使用方便等優(yōu)點(diǎn)。
應(yīng)當(dāng)理解的是,本發(fā)明方法對(duì)本領(lǐng)域普通技術(shù)人員來說,可以根據(jù)本發(fā)明的技術(shù)方案及其技術(shù)構(gòu)思做出各種可能的改變或替換,而所有這些改變或替換都應(yīng)屬于本發(fā)明所附權(quán)利要求的保護(hù)范圍。
權(quán)利要求
1.一種嵌入式系統(tǒng)多任務(wù)并發(fā)調(diào)試的方法,其包括以下步驟a)在存儲(chǔ)器中對(duì)每一堆棧設(shè)置至少一堆棧跟蹤記錄區(qū),并初始化;b)執(zhí)行打印信息記錄函數(shù),在打印過程中調(diào)用打印內(nèi)容保存函數(shù)保存打印信息到所述堆棧跟蹤記錄區(qū);c)分別在入口處執(zhí)行入口跟蹤記錄函數(shù)和在出口處執(zhí)行出口跟蹤記錄函數(shù),在應(yīng)用程序的函數(shù)入口處和出口處分別進(jìn)行插樁;d)調(diào)用用于堆棧跟蹤記錄區(qū)的分析調(diào)試函數(shù)來顯示所有堆棧跟蹤記錄區(qū)基本信息、指定堆棧跟蹤記錄區(qū)的函數(shù)調(diào)用過程和指定堆棧跟蹤記錄區(qū)的保存的打印內(nèi)容。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟a)還包括a1)規(guī)劃全部堆棧跟蹤記錄區(qū)的內(nèi)存,每一個(gè)堆棧對(duì)應(yīng)至少一個(gè)堆棧跟蹤記錄區(qū),確定堆棧跟蹤記錄區(qū)的內(nèi)存位置,函數(shù)調(diào)用記錄區(qū)的大??;a2)對(duì)每一個(gè)堆棧,初始化至少一個(gè)堆棧跟蹤記錄區(qū),填寫基本信息區(qū)內(nèi)容、函數(shù)嵌套深度、當(dāng)前打印記錄索引,并對(duì)當(dāng)前函數(shù)記錄索引清零。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述步驟a2)中在堆棧的底部保存堆棧跟蹤記錄區(qū)的指針。
4.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述步驟b)還包括b1)根據(jù)打印信息記錄函數(shù)的局部變量的指針定位堆棧跟蹤記錄區(qū)的指針;b2)根據(jù)堆棧跟蹤記錄區(qū)的當(dāng)前打印記錄索引,保存打印的字符串內(nèi)容到記錄區(qū)的打印內(nèi)容保存區(qū),同時(shí)更新當(dāng)前打印記錄索引,并將打印內(nèi)容保存區(qū)設(shè)計(jì)成環(huán)型隊(duì)列方式。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,所述步驟b)還包括b11)根據(jù)出口跟蹤記錄函數(shù)的局部變量指針定位堆棧跟蹤記錄區(qū)的指針;b12)判斷函數(shù)調(diào)用記錄區(qū)是否為空,如為空,則退出;否則進(jìn)入步驟b13);b13)判斷函數(shù)調(diào)用記錄區(qū)是否滿,如已滿,再判斷丟棄函數(shù)調(diào)用數(shù)是否為0,如不為0,則丟棄函數(shù)調(diào)用數(shù)減1,并退出;否則繼續(xù)步驟b14);b14)根據(jù)當(dāng)前函數(shù)記錄索引回溯,查找到調(diào)用函數(shù)的記錄索引,在該調(diào)用函數(shù)的記錄區(qū)中根據(jù)當(dāng)前時(shí)間,計(jì)算并保存函數(shù)執(zhí)行時(shí)間,設(shè)置調(diào)用函數(shù)的記錄區(qū)為無效標(biāo)記;b15)所述堆棧跟蹤記錄區(qū)的函數(shù)嵌套深度減1,如果函數(shù)嵌套深度不為0,退出;否則繼續(xù)步驟b16);b16)設(shè)置函數(shù)起始記錄索引值為當(dāng)前函數(shù)記錄索引。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述分析調(diào)試函數(shù)包括第一調(diào)試函數(shù),顯示所有被跟蹤的堆棧標(biāo)識(shí)、堆棧運(yùn)行函數(shù);第二調(diào)試函數(shù),根據(jù)堆棧標(biāo)識(shí),顯示指定堆棧中的最近運(yùn)行的函數(shù),以及每個(gè)函數(shù)打印的內(nèi)容;第三調(diào)試函數(shù),根據(jù)堆棧標(biāo)識(shí),顯示指定堆棧最近打印的1K內(nèi)容。
7.根據(jù)權(quán)利要求1~6任一權(quán)項(xiàng)所述的方法,其特征在于,所述堆棧跟蹤記錄區(qū)放在保留內(nèi)存區(qū)中。
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,所述步驟a)中對(duì)每個(gè)堆棧設(shè)置兩個(gè)堆棧跟蹤記錄區(qū),并在每次上電時(shí),切換堆棧跟蹤記錄區(qū),以保留上次運(yùn)行信息。
全文摘要
一種嵌入式系統(tǒng)多任務(wù)并發(fā)調(diào)試的方法,其包括以下步驟在存儲(chǔ)器中對(duì)每一堆棧設(shè)置至少一堆棧跟蹤記錄區(qū),并初始化;執(zhí)行打印信息記錄函數(shù),在打印過程中調(diào)用打印內(nèi)容保存函數(shù)保存打印信息到所述堆棧跟蹤記錄區(qū);分別在入口處執(zhí)行入口跟蹤記錄函數(shù)和在出口處執(zhí)行出口跟蹤記錄函數(shù),在應(yīng)用程序的函數(shù)入口處和出口處分別進(jìn)行插樁;調(diào)用用于堆棧跟蹤記錄區(qū)的分析調(diào)試函數(shù)來顯示所有堆棧跟蹤記錄區(qū)基本信息、指定堆棧跟蹤記錄區(qū)的函數(shù)調(diào)用過程和指定堆棧跟蹤記錄區(qū)的保存的打印內(nèi)容。本發(fā)明方法不影響被測(cè)軟件的任務(wù)調(diào)度過程,順暢執(zhí)行多任務(wù)并發(fā)調(diào)試;對(duì)軟件異常的分析直接利用該堆棧跟蹤記錄區(qū)記錄的信息,無需對(duì)硬件分析,因此實(shí)現(xiàn)簡(jiǎn)單,使用方便。
文檔編號(hào)G06F11/36GK1564137SQ20041002682
公開日2005年1月12日 申請(qǐng)日期2004年4月9日 優(yōu)先權(quán)日2004年4月9日
發(fā)明者鐘文昕, 趙良剛, 周元慶 申請(qǐng)人:中興通訊股份有限公司