本發(fā)明屬于嵌入式計(jì)算機(jī)的使用技術(shù),具體涉及一種復(fù)雜嵌入式軟件使用過程中,一種基于堆棧追溯的故障排查方法。
背景技術(shù):
隨著傳感器技術(shù)、自動(dòng)化控制技術(shù)、數(shù)字化技術(shù)的不斷發(fā)展,處理器的性能不斷提升,導(dǎo)致嵌入式計(jì)算機(jī)上運(yùn)行的功能越來越復(fù)雜,往往需要將多種功能軟件模塊集成到一個(gè)處理器上,共同滿足一個(gè)系統(tǒng)級功能,復(fù)雜度的提升,導(dǎo)致軟件、硬件設(shè)計(jì)中的缺陷更加難以避免,系統(tǒng)功能的驗(yàn)證,以及故障排查成為功能集成后,需不斷花費(fèi)時(shí)間進(jìn)行的一項(xiàng)工作。對于嵌入式系統(tǒng)的設(shè)計(jì),當(dāng)發(fā)生故障時(shí),往往通過硬件產(chǎn)生一個(gè)中斷,或者處理器自身上報(bào)一個(gè)內(nèi)部異常,讓用戶可以根據(jù)中斷或者內(nèi)部異常發(fā)生時(shí)的上下文狀態(tài),進(jìn)行故障的排查。
對于一個(gè)集成多種功能的復(fù)雜嵌入式軟件,系統(tǒng)級故障往往可能僅在極為特殊的環(huán)境下才能夠出現(xiàn)。如果在故障發(fā)生的那一瞬間,沒有記錄下足夠多的故障信息,那么由于難以再次營造出完全一樣的條件與環(huán)境再次復(fù)現(xiàn)故障,或者引發(fā)故障的條件是極為特殊,讓人難以意料到的組合條件,將極大的增加故障排查的難度。因此,在故障時(shí)刻記錄下盡可能詳盡的故障信息,是進(jìn)行故障排查的必要手段。
然而,對一些故障而言,引發(fā)故障的真實(shí)原因,其實(shí)發(fā)生在故障發(fā)生之前的某一時(shí)刻。缺陷起作用時(shí),故障可能并不會(huì)立刻發(fā)作,而是在系統(tǒng)又運(yùn)行了一段時(shí)間,缺陷不斷蔓延,最終才在系統(tǒng)級別反映出發(fā)生了一個(gè)故障,一種典型的例子,就是堆棧被錯(cuò)誤的修改,導(dǎo)致程序跳轉(zhuǎn)向錯(cuò)誤的地址。在這種情況下,僅僅記錄故障發(fā)生時(shí)刻的信息,仍舊不能為用戶的故障排查提供充分的信息。為此,需要提出一種故障記錄方法,能夠方便用戶對缺陷產(chǎn)生的實(shí)際位置進(jìn)行分析和追蹤。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的是:為幫助復(fù)雜嵌入式系統(tǒng)進(jìn)行不明原因的偶發(fā)故障排查,而提出的一種基于堆棧追溯來定位缺陷位置的方法。
本發(fā)明的技術(shù)方案:
提供一種基于堆棧追溯的故障排查裝置,其特征在于,包括:
堆棧追溯故障記錄模塊,在故障引發(fā)的硬件中斷或者處理器內(nèi)部異常響應(yīng)函數(shù)中堆棧追溯故障記錄模塊被觸發(fā),將故障發(fā)生時(shí)刻計(jì)算機(jī)內(nèi)部的通用寄存器信息、與故障相關(guān)的寄存器信息、堆棧存儲(chǔ)模塊中保存的各級函數(shù)調(diào)用堆棧指針信息、函數(shù)調(diào)用返回信息、堆棧存儲(chǔ)模塊中保存的各級中斷發(fā)生時(shí)中斷處理的堆棧指針信息、堆棧存儲(chǔ)模塊中保存的中斷發(fā)生時(shí)刻處理器運(yùn)行地址、中斷類型信息發(fā)送給故障記錄載體;
故障記錄載體:用于記錄故障發(fā)生后堆棧追溯故障記錄模塊傳輸來的所有信息,讓故障排查人員可以再次讀取到所有故障記錄信息;
目標(biāo)碼反匯編工具:故障排查人員可以借助目標(biāo)碼反匯編工具,將目標(biāo)碼中的函數(shù)地址信息解析出來,對照故障記錄信息中的地址,判斷堆棧存儲(chǔ)模塊中保存的地址信息隸屬于哪一個(gè)函數(shù)的哪一個(gè)功能語句中。
堆棧存儲(chǔ)模塊:堆棧存儲(chǔ)模塊用來保存函數(shù)調(diào)用以及中斷處理的歷史信息,由堆棧追溯故障記錄模塊將堆棧存儲(chǔ)模塊中的相應(yīng)信息讀取出來保存到故障記錄載體中。
提供一種基于堆棧追溯的故障排查方法,其特征在于,包括以下步驟:
步驟一:使得所有故障處理中斷及內(nèi)部異常的響應(yīng)函數(shù)能夠調(diào)用堆棧追溯故障記錄模塊,在初始堆棧中上一級堆棧指針位置處,存入數(shù)據(jù)0;
步驟二:當(dāng)故障發(fā)生后,觸發(fā)堆棧追溯故障記錄模塊,識別當(dāng)前進(jìn)入的故障中斷或者進(jìn)入的內(nèi)部異常的類型,將識別后的類型信息,故障發(fā)生時(shí)刻處理器上下文的全部寄存器信息發(fā)送給故障記錄載體;
步驟三:堆棧追溯故障記錄模塊將發(fā)生故障時(shí)的堆棧指針值,賦給堆棧追溯指針;
步驟四:堆棧追溯故障記錄模塊根據(jù)堆棧追溯指針當(dāng)前位置與保存的堆棧指針上一級位置之差值,以及堆棧上一級中保存的類型信息,判斷堆棧上一級中保存的是函數(shù)處理信息,還是中斷處理信息;如果是函數(shù)處理信息,則獲取上一級函數(shù)處理過程中的堆棧指針信息,以及堆棧存儲(chǔ)模塊中保存的函數(shù)返回運(yùn)行地址信息,傳輸給故障記錄載體,并將上一級堆棧指針傳遞給堆棧追溯指針,進(jìn)入步驟五,否則,將堆棧存儲(chǔ)模塊中保存的中斷發(fā)生時(shí)刻堆棧指針信息、中斷發(fā)生時(shí)刻處理器運(yùn)行地址信息,以及中斷類型信息同樣傳輸給故障記錄載體,進(jìn)行相應(yīng)的信息記錄,并將上一級堆棧指針傳遞給堆棧追溯指針,進(jìn)入步驟五;
步驟五:判斷堆棧追溯指針的上一級位置是否為0,若不是,則重復(fù)步驟四,否則進(jìn)入步驟六;
步驟六:由故障記錄載體中獲取故障發(fā)生時(shí)刻相應(yīng)的故障記錄信息,并配合目標(biāo)碼的反匯編工具,進(jìn)行故障缺陷位置的定位,若能夠定位,則結(jié)束,否則若不能定位進(jìn)入步驟七;
步驟七:由故障記錄載體中向上追溯獲取堆棧信息,并配合目標(biāo)碼反匯編工具,進(jìn)行故障缺陷位置的定位,若能夠定位,則結(jié)束,否則進(jìn)行向上追溯的堆棧指針是否為0的判斷,若不為0,重復(fù)步驟七,否則進(jìn)入步驟八;
步驟八:得出缺陷無法在堆棧追溯中進(jìn)行定位的結(jié)論,并將故障記錄載體中保存的所有信息進(jìn)行備份記錄。
進(jìn)一步的,步驟一中,定義堆棧追溯層次數(shù),當(dāng)在步驟五中重復(fù)次數(shù)達(dá)到定義的堆棧追溯層次數(shù),則進(jìn)入步驟六。
本發(fā)明的有益效果:通過本方面提出的方法和裝置,能夠極大限度的記錄下故障記錄發(fā)生的現(xiàn)場以及歷史原因,從而大幅度減少設(shè)計(jì)缺陷定位的難度。
附圖說明
圖1為一種基于堆棧追溯的故障排查裝置的組成示意圖;
圖2為一種基于堆棧追溯的故障排查方法的流程示意圖;
圖3為一種基于堆棧追溯的故障排查方法使用的實(shí)例如。
具體實(shí)施方式
參見圖1,提供一種基于堆棧追溯的故障排查裝置,其特征在于,包括:
堆棧追溯故障記錄模塊,在故障引發(fā)的硬件中斷或者處理器內(nèi)部異常響應(yīng)函數(shù)中堆棧追溯故障記錄模塊被觸發(fā),將故障發(fā)生時(shí)刻計(jì)算機(jī)內(nèi)部的通用寄存器信息、與故障相關(guān)的寄存器信息、堆棧存儲(chǔ)模塊中保存的各級函數(shù)調(diào)用堆棧指針信息、函數(shù)調(diào)用返回信息、堆棧存儲(chǔ)模塊中保存的各級中斷發(fā)生時(shí)中斷處理的堆棧指針信息、堆棧存儲(chǔ)模塊中保存的中斷發(fā)生時(shí)刻處理器運(yùn)行地址、中斷類型信息發(fā)送給故障記錄載體;
故障記錄載體:用于記錄故障發(fā)生后堆棧追溯故障記錄模塊傳輸來的所有信息,讓故障排查人員可以再次讀取到所有故障記錄信息,在實(shí)施例中,故障記錄載體可以在NVRAM、FLASH、EEPROM或者通過串口輸出后進(jìn)行記錄;
目標(biāo)碼反匯編工具:故障排查人員可以借助目標(biāo)碼反匯編工具,將目標(biāo)碼中的函數(shù)地址信息解析出來,對照故障記錄信息中的地址,判斷堆棧存儲(chǔ)模塊中保存的地址信息隸屬于哪一個(gè)函數(shù)的哪一個(gè)功能語句中,在實(shí)施例中,目標(biāo)碼反匯編工具可以為GCC的objdump工具。
堆棧存儲(chǔ)模塊:堆棧存儲(chǔ)模塊用來保存函數(shù)調(diào)用以及中斷處理的歷史信息,由堆棧追溯故障記錄模塊將堆棧存儲(chǔ)模塊中的相應(yīng)信息讀取出來保存到故障記錄載體中。
參見圖2,提供一種基于堆棧追溯的故障排查方法,其特征在于,包括以下步驟:
步驟一:使得所有故障處理中斷及內(nèi)部異常的響應(yīng)函數(shù)能夠調(diào)用堆棧追溯故障記錄模塊,在初始堆棧中上一級堆棧指針位置處,存入數(shù)據(jù)0;
步驟二:當(dāng)故障發(fā)生后,觸發(fā)堆棧追溯故障記錄模塊,識別當(dāng)前進(jìn)入的故障中斷或者進(jìn)入的內(nèi)部異常的類型,將識別后的類型信息,故障發(fā)生時(shí)刻處理器上下文的全部寄存器信息發(fā)送給故障記錄載體,在實(shí)施例中,故障中斷可為地址訪問超時(shí)中斷,內(nèi)部異??蔀槌惝惓!⒎欠ㄖ噶町惓?。;
步驟三:堆棧追溯故障記錄模塊將發(fā)生故障時(shí)的堆棧指針值,賦給堆棧追溯指針;
步驟四:堆棧追溯故障記錄模塊根據(jù)堆棧追溯指針當(dāng)前位置與保存的堆棧指針上一級位置之差值,以及堆棧上一級中保存的類型信息,判斷堆棧上一級中保存的是函數(shù)處理信息,還是中斷處理信息;如果是函數(shù)處理信息,則獲取上一級函數(shù)處理過程中的堆棧指針信息,以及堆棧存儲(chǔ)模塊中保存的函數(shù)返回運(yùn)行地址信息,傳輸給故障記錄載體,并將上一級堆棧指針傳遞給堆棧追溯指針,進(jìn)入步驟五,否則,將堆棧存儲(chǔ)模塊中保存的中斷發(fā)生時(shí)刻堆棧指針信息、中斷發(fā)生時(shí)刻處理器運(yùn)行地址信息,以及中斷類型信息同樣傳輸給故障記錄載體,進(jìn)行相應(yīng)的信息記錄,并將上一級堆棧指針傳遞給堆棧追溯指針,進(jìn)入步驟五,在實(shí)施例中個(gè),以powerpc755為例,若堆棧指針當(dāng)前位置與堆棧指針上一級位置之差為396,且堆棧的偏移0x10處保存了發(fā)生中斷的類型碼,則認(rèn)為堆棧上一級保存的是中斷處理信息,否則為函數(shù)處理信息。;
步驟五:判斷堆棧追溯指針的上一級位置是否為0,若不是,則重復(fù)步驟四,否則進(jìn)入步驟六;
步驟六:由故障記錄載體中獲取故障發(fā)生時(shí)刻相應(yīng)的故障記錄信息,并配合目標(biāo)碼的反匯編工具,進(jìn)行故障缺陷位置的定位,若能夠定位,則結(jié)束,否則若不能定位進(jìn)入步驟七;
步驟七:由故障記錄載體中向上追溯獲取堆棧信息,并配合目標(biāo)碼反匯編工具,進(jìn)行故障缺陷位置的定位,若能夠定位,則結(jié)束,否則進(jìn)行向上追溯的堆棧指針是否為0的判斷,若不為0,重復(fù)步驟七,否則進(jìn)入步驟八;
步驟八:得出缺陷無法在堆棧追溯中進(jìn)行定位的結(jié)論,并將故障記錄載體中保存的所有信息進(jìn)行備份記錄。
進(jìn)一步的,步驟一中,定義堆棧追溯層次數(shù),當(dāng)在步驟五中重復(fù)次數(shù)達(dá)到定義的堆棧追溯層次數(shù),則進(jìn)入步驟六。
如圖3所示,為在堆棧存儲(chǔ)模塊進(jìn)行堆棧向上追溯,并查找到缺陷的一個(gè)實(shí)例。
以上所揭露的僅為本發(fā)明較佳實(shí)施例而已,當(dāng)然不能以此來限定本發(fā)明之權(quán)利范圍,因此依本發(fā)明權(quán)利要求所作的等同變化,仍屬本發(fā)明所涵蓋的范圍。