專利名稱:故障定位的方法和裝置的制作方法
技術領域:
本發(fā)明涉及無內(nèi)部互鎖流水級的孩支處理器領域,并且特別地, 涉及一種對無內(nèi)部互鎖流水級的微處理器的堆棧進行故障定位的方 法和裝置。
背景技術:
無內(nèi)部互鎖流水級的孩t處理器(MIPS)作為三大RISC CPU (powerpc、 arm、以及mips)之一,在嵌入式i殳備上4尋到廣S乏應用, 越來越多的嵌入式程序運行于MIPS CPU之上。當應用程序因為空 指針、錯誤指針、溢出等錯誤導致異常崩潰時,打印出的可供參考 的信息寥寥無幾。操作系統(tǒng)的異常處理程序里通常只是打印當前 CPU的所有寄存器的值以及異常進程異常時用戶空間程序指針 (pc),堆棧指針(sp)的值等。通常的定位故障的辦法是先反匯編異常進程可執(zhí)行文件,然后 根據(jù)異常時打印的pc值去反匯編代碼中查找異常發(fā)生所在的函數(shù), 然而,這種方法有存在以下問題第一,這種做法非常的繁瑣,并且不夠不直觀,需要反匯編代 碼、查找。并且對開發(fā)人員有較高要求,很多上層業(yè)務開發(fā)人員并 不熟悉這種反匯編定位故障的方法。第二,不能解決所有問題。第一種情況是如果當前異常函數(shù)被 很多函數(shù)調(diào)用,即使找到了異常函數(shù),依然無法定位是上面哪個函 數(shù)調(diào)用了以及哪個流程出了問題,實際上,定位故障是定位一條函 凄t執(zhí)行流程。第二種種情況是異常有時發(fā)生在庫函數(shù)里(比如調(diào)用庫函數(shù)的函數(shù)傳給庫函數(shù)參lt錯誤),異常記錄的pc值為庫函數(shù)i也 址,在反匯編用戶進程里是無法找到與此pc值對應的地址的。目前,在現(xiàn)有技術中,尚未提出能夠解決以上所述兩個問題的 4支術方案。發(fā)明內(nèi)容考慮到上述問題而做出本發(fā)明,為此,本發(fā)明的主要目的在于 提供一種故障定位的方法和裝置,以解決相關技術中故障定位繁瑣、 定位結果不直》見、以及故障定位不準確的問題。根據(jù)本發(fā)明的一個實施例,提供了一種故障定位方法,用于對 無內(nèi)部互鎖流水級的微處理器的堆棧進行故障定位。該方法包括在由于函數(shù)調(diào)用異常導致進程出現(xiàn)異常的情況下, 在程序空間中獲取異常進程的程序指針的值和堆棧指針的值;根據(jù)獲取的程序指針的值和堆棧指針的值獲取堆棧指針指向的當前函凄t堆棧的大小以及當前函數(shù)堆棧的棧幀中所存儲的返回指令;根據(jù)當 前函數(shù)堆棧的大小和堆棧指針的值獲取當前函數(shù)堆棧之后的函數(shù)堆 棧的棧幀中存儲的函數(shù)的返回指令;查找異常進程的可執(zhí)行文件, 并根據(jù)查找的可執(zhí)行文件查找異常進程的符號表,根據(jù)在當前棧幀 和其它棧幀中獲取的返回指令在符號表中查找相應的函數(shù)。此外,獲取當前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲的函數(shù) 的返回指令的處理具體為確定當前堆棧指針的值;獲取當前函數(shù) 堆棧中存儲的返回地址;確定當前函數(shù)堆棧的大??;將確定的值和大小相加,將相加的結果作為當前函數(shù)堆棧的下一個函數(shù)堆棧的棧 幀地址,并將下一個函數(shù)堆棧作為當前函數(shù)堆棧。其中,在每次獲取了 一個函數(shù)堆棧的棧幀中存儲的函數(shù)的返回指令后,進一步包括判斷獲取的返回指令所對應的函數(shù)是否在調(diào) 用異常的函數(shù)體內(nèi),如果判斷為是,則繼續(xù)查找下個函^:堆棧;否 則停止查找函數(shù)堆棧。進行判斷的處理具體為獲取當前獲取的函 凄t堆棧的地址,并乂人程序空間獲取該函凄t堆棧的大小,并4艮據(jù)當前 獲取的函數(shù)堆棧的地址和大小判斷其是否在函凄t體范圍內(nèi)。其中,根據(jù)獲取的返回指令在符號表中查找相應的函數(shù)的處理 具體為將符號表中小于并且最接近于返回地址的函數(shù)地址作為對 應于該返回地址的函數(shù)地址,并根據(jù)函數(shù)地址找到相應函數(shù)。根據(jù)本發(fā)明的另一實施例,提供了一種故障定位裝置,用于對 無內(nèi)部互鎖流水級的樣i處理器的堆棧進行故障定位。該裝置包括第一獲取模塊,用于在由于函數(shù)調(diào)用異常導致進 程出現(xiàn)異常的情況下,在程序空間中獲取異常進程的程序指針的值 和堆棧指針的值;第二獲取模塊,用于根據(jù)獲取的程序指針的值和 堆棧指針的值獲取堆棧指針指向的當前函數(shù)堆棧的大小以及當前函 數(shù)堆棧的棧幀中所存儲的返回指令;以及根據(jù)當前函凄t堆棧的大小 和堆棧指針的值獲取當前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲的 函數(shù)的返回指令;查找模塊,用于查找異常進程的可執(zhí)行文件,并 根據(jù)查找的可執(zhí)行文件查找異常進程的符號表,根據(jù)在當前棧幀和 其它棧幀中獲取的返回指令在符號表中查找相應的函數(shù)。其中,第二獲取模塊獲取當前函數(shù)堆棧之后的函數(shù)堆棧的棧幀 中存儲的函數(shù)的返回指令的處理具體為確定當前堆棧指針的值; 獲取當前函凄t堆棧中存儲的返回地址;確定當前函數(shù)堆棧的大小;將確定的值和大小相加,將相加的結果作為當前函數(shù)堆棧的下一個 函數(shù)堆棧的棧幀地址,并將下一個函數(shù)堆棧作為當前函數(shù)堆棧。此外,該裝置進一步包括判斷模塊,用于在每次獲取了一個 函數(shù)堆棧的棧幀中存儲的函數(shù)的返回指令后,判斷獲取的返回指令 所對應的函凄l(xiāng)是否在調(diào)用異常的函凄t體內(nèi),如果判斷為是,則繼續(xù) 查找下個函數(shù)堆棧;否則停止查找函數(shù)堆棧。判斷模塊進行的判斷 處理具體為獲取當前獲取的函數(shù)堆棧的地址,并從程序空間獲取 該函數(shù)堆棧的大小,并根據(jù)當前獲取的函數(shù)堆棧的地址和大小判斷 其是否在函凄t體范圍內(nèi)。此外,查找模塊根據(jù)獲取的返回指令在符號表中查找相應的函 數(shù)時所執(zhí)行的處理具體為將符號表中小于并且最接近于返回地址 的函數(shù)地址作為對應于該返回地址的函數(shù)地址,并根據(jù)函數(shù)地址找 到^目應函凄丈。綜上所述,借助于本發(fā)明的技術方案,能夠有效實現(xiàn)自動化的 故障定位,大大提高了調(diào)試和故障定位的效率,簡化了故障定位的 操作,并且使故障定位的操作結果更加直觀。
此處所說明的附圖用來提供對本發(fā)明的進一步理解,構成本申 請的一部分,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并 不構成對本發(fā)明的不當限定。在附圖中圖i是才艮據(jù)本發(fā)明方法實施例的故障定位方法的流禾呈圖;圖2是根據(jù)相關技術的mips棧幀結構圖;以及圖3是根據(jù)本發(fā)明裝置實施例的故障定位裝置的框圖。
具體實施方式
方法實施例在本實施例中,4是供了一種故障定位方法,用于對無內(nèi)部互鎖 流水級的孩吏處理器的堆棧進行故障定位。圖1是故障定位方法的流程圖,如圖1所示,該方法包括步驟S102,在由于函數(shù)調(diào)用異常導致進程出現(xiàn)異常的情況下, 在程序空間中獲取異常進程的程序指針的值和堆棧指針的值;步驟 S104,根據(jù)獲取的程序指針的值和堆棧指針的值獲取堆棧指針指向 的當前函數(shù)堆棧的大小以及當前函數(shù)堆棧的棧幀中所存儲的返回指 令;步驟S106,根據(jù)當前函數(shù)堆棧的大小和堆棧指針的值獲取當前 函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲的函數(shù)的返回指令;步驟 S108,查找異常進程的可^M于文件,并才艮據(jù)查找的可執(zhí)4于文件查找 異常進程的符號表,根據(jù)在當前棧幀和其它棧幀中獲取的返回指令 在符號表中查找相應的函數(shù)。也就是說,定位一條函數(shù)執(zhí)行流程可以通過堆?;厮莸姆椒?, 每個函數(shù)執(zhí)行時有一個棧幀,棧幀里保存有每個函數(shù)的返回地址, 在異常時將堆棧幀里存儲的各個函數(shù)地址回溯可以精確復現(xiàn)函數(shù)執(zhí) 4亍調(diào)用關系,就可以解決在反匯編用戶進程里是無法找到與此pc ^直對應的地址的問題。但是,問題的關鍵是確定每個棧幀的大小及每個函數(shù)返回地址 保存于棧幀中的位置,僅僅通過堆棧和異?,F(xiàn)場的mips的32個寄 存器是無法實現(xiàn)的。此外,獲取當前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲的函數(shù) 的返回指令的處理具體為確定當前堆棧指針的值;獲取當前函數(shù)堆棧中存儲的返回地址;確定當前函數(shù)堆棧的大??;將確定的值和 大小相加,將相加的結果作為當前函數(shù)堆棧的下一個函數(shù)堆棧的棧 幀地址,并將下一個函數(shù)堆棧作為當前函lt堆棧。其中,在每次獲取了一個函數(shù)堆棧的棧幀中存儲的函數(shù)的返回 指令后,進一步包括判斷獲取的返回指令所對應的函數(shù)是否在調(diào)用異常的函數(shù)體內(nèi),如果判斷為是,則繼續(xù)查找下個函數(shù)堆棧;否 則停止查找函數(shù)堆棧。進行判斷的處理具體為獲取當前獲取的函 數(shù)堆棧的地址,并從程序空間獲取該函凄t堆棧的大小,并才艮據(jù)當前 獲取的函數(shù)堆棧的地址和大小判斷其是否在函數(shù)體范圍內(nèi)。當進程發(fā)生異常時,操作系統(tǒng)會保護進程用戶空間現(xiàn)場進入異 常處理程序。根據(jù)異常時進程PC和SP值在此進程程序空間.text區(qū) 搜索MIPS關鍵二進制指令,以獲得當前函數(shù)堆棧大小及返回指令 存儲于此棧幀位置,gcc編譯mips代碼時有固有的特點,某些指令 包含了函數(shù)開始初分配棧幀空間的大小,某些指令指出了函數(shù)返回 地址保存寄存器ra保存于棧幀里的相對位置。搜索到這些特定指令 即可以獲得當前函數(shù)堆棧大小及r a保存于棧幀中位置。將sp加上當前函數(shù)堆棧大小即獲得下一棧幀的sp,從棧幀中取 出ra或直接從ra中可獲得返回指令地址,返回指令地址即位于調(diào)用 此異常函數(shù)的母函數(shù)體內(nèi),反復重復上一過程,即獲得了導致此異 常的函lt流禾呈里的所有函凄t返回;也址。此外,根據(jù)獲取的返回指令在符號表中查找相應的函數(shù)的處理 具體為將符號表中小于并且最接近于返回地址的函數(shù)地址作為對 應于該返回地址的函數(shù)地址,并根據(jù)函數(shù)地址找到相應函數(shù)。至此,如果只是簡單的將各個函數(shù)返回地址打印出來,對開發(fā) 人員仍然不方便,依然存在繁瑣和不直觀的問題,而對照符號表就可以將函數(shù)返回地址對應的函數(shù)名查找出來,這樣通過將各個函數(shù) 名打印出來就可以對出現(xiàn)故障的流程里的各個函數(shù)一 目了然。具體地,可以找到此進程存放在文件系統(tǒng)里的可執(zhí)行文件,打 開,按照可執(zhí)行文件格式找到符號表,通過函數(shù)地址查找符號表找 到函數(shù)名。前面獲得的是函數(shù)返回地址,并非函數(shù)起始地址,而函數(shù)符號對應的是函數(shù)起始地址,可以采用如下算法在符號表里, 搜索比返回地址值小并且兩者間距最小的符號地址即為函數(shù)符號。圖2是根據(jù)相關技術的mips棧幀的結構示意圖。下面,將結合 圖2描述根據(jù)本實施例的對MIPS堆棧回溯定位故障的方法。Leaf函數(shù)是指內(nèi)部沒有調(diào)用其他函數(shù)的函數(shù)。函數(shù)調(diào)用leaf函 數(shù)時返回地址保存于ra中,在leaf函數(shù)里因為無需再調(diào)用其他函數(shù), 所以通常ra無需壓一戔,可以直4妄乂人ra中獲4尋返回i也址。Leaf函彰: 是否需要建立堆棧是依據(jù)具體函數(shù)的,mips的gCC編譯器在函數(shù)入口一次性的為此函數(shù)分配堆棧大小。如圖2所示,堆棧大小包括三 部分為函ft內(nèi)臨時變量分配空間、 一些內(nèi)部寄存器保存、為內(nèi)部 4皮調(diào)用函數(shù)建立參數(shù)的空間。mips有32個內(nèi)部寄存器,內(nèi)部寄存 器可以做為臨時變量,做被調(diào)用函數(shù)輸入?yún)?shù)等,前提是這些寄存 器器夠用,所以并非每個函數(shù)編譯器都會為其建立堆棧。Nonleaf函數(shù)為內(nèi)部調(diào)用了其他函數(shù)的函數(shù),nonleaf函數(shù)通常 在函數(shù)入口處要建立堆棧,因為至少ra需要保存于堆棧中。建立堆棧的做法是編譯器計算出要為此函數(shù)分配的堆棧大小, 然后一次性設定,在函lt入口處將sp減去此堆棧大小,然后所有在 堆棧中的數(shù)據(jù)都通過Sp加上固定的偏移量來獲取,在函凄t出口處將 sp加上堆棧大小恢復前一堆棧值。Mips指令為32bit長,里面包含操作碼(opcode ),操作寄存器, 操作數(shù)等,每條指令都有其固定編碼格式,將32bit的指令與特定掩 碼相與提取出操作數(shù),操作寄存器等,則可以確定此指令。下面的 搜索指令均采用此方法。才艮據(jù)pc值在用戶進程程序空間中往前4臾索如果搜索到swra, x(sp),這條指令指出ra保存于堆棧sp+x處, 從指令提取出偏移量x,而一個函數(shù)的sp是固定指向此函數(shù)堆棧頂 的,所以從堆棧sp+x處可以取處保存的ra值,而ra里存方文的是此 函凄t的返回地J止。如果沒有搜索到sw ra, x(sp),則表明此函數(shù)沒有保存m于堆 棧里,則ra里存放的就是返回地址,從寄存器器ra里直接可以獲得 函凄t返回i也址。如果搜索到addiusp, sp, +-offset指令,這條指令通常位于函 數(shù)入口最開始處由編譯器用來為此函數(shù)分配堆棧大小,在函數(shù)返回 之前由編譯器回收堆棧。異常通常發(fā)生在用戶代碼里,而我們是根 據(jù)pc往前4叟索,所以4臾索到的應該是addiusp, sp, -offset, 乂人此 指令中提取立即數(shù)offset,此即為此函數(shù)棧幀大小。如果沒有4臾索到 此指令,表示此函數(shù)沒有分配堆棧,則下一函數(shù)堆棧指針依然為此 sp值。直到搜索到另一個函數(shù)體內(nèi)肯定是錯誤的為止,有兩個結束條 件 一個是搜索到addiu sp, sp, -offset指令。 一個是搜索到jr ra 指令,jr ra是每個函數(shù)的返回指令,如果搜索到此指令表示已搜索 脫離了本函數(shù),進入此函數(shù)相鄰的函數(shù)里了 ,則此時搜索應該結束。上述操作的輸入是當前函數(shù)體內(nèi)的一個pc值;當前函數(shù)的堆 棧起始地址sp。輸出是調(diào)用此函數(shù)的返回地址,此返回地址位于調(diào)用函數(shù)的地址范圍內(nèi);當前函數(shù)堆棧大小,加上當前堆棧起始地 址,即,獲得調(diào)用函數(shù)的堆棧起始地址。將輸出再次作為輸入,重 復上述過程就可以獲得一個完整的調(diào)用鏈里所有函凄t體內(nèi)的一個地 址值。進程在內(nèi)核的進程控制塊里保存有進程的用戶空間堆棧開始地 址;用戶空間程序開始及結束地址,上述循環(huán)搜索始終判斷獲得函 數(shù)堆棧地址,函數(shù)地址是否在范圍之類,如果不在,循環(huán)4臾索結束??蓤?zhí)行文件格式很多,本實施例以ELF格式為例進行說明。 找到此進程在文件系統(tǒng)里的elf文件,打開,按照elf文件格式,提 取出4個section: .dynsym、 .symtab、 .dynstr、 .strtab、 .dynsym, 其 中,.symtab為符號表,.dynstr和.strtab為符號對應字符串。其中,符號表里每個符號對應的數(shù)據(jù)結構為 typedef structElf32—Word st—name;/*符號名索引號*/ Elf32—Addr st—value;/*才尋號;也址^f直*/ Elfi2—Word st—size;/*符號對應的代碼長度*/ unsigned char st—info;/*符號類型和4邦定4言息*/ unsigned char st一other; /*未用,值為0 */ Elf32—Section st—shndx;/*所在節(jié)的節(jié)索引號*/} Elf32—Sym;前面搜索出的是一條返回地址鏈,并非每個函數(shù)的初始地址, 返回地址位于每個函數(shù)地址范圍內(nèi),可以采用如下算法計算處函數(shù) 初始地址在符號表里,搜索比返回地址值小并且兩者間距最小的 符號i也址(即st—value)即為函凄t初始i也址,它對應的st_name為符 號名索引號,通過此索引號到.dynstr節(jié)或.strtab節(jié)即可以獲得每個 函數(shù)的符號名。將每個函數(shù)的符號名逐一打印出來就可以看到異常發(fā)生時整個 調(diào)用關系里的所有函數(shù)名,定位故障位置直^L、方遍、并且迅速。裝置實施例在本實施例中,提供了一種故障定位裝置,用于對無內(nèi)部互鎖 流水級的;f效處理器的堆棧進行故障定位。圖3為這種故障定位裝置的流程圖,如圖3所示,該裝置包括第一獲取模塊302,用于在由于函數(shù)調(diào)用異常導致進程出現(xiàn)異 常的情況下,在程序空間中獲取異常進程的程序指針的值和堆棧指 針的值;第二獲取模塊304,用于根據(jù)獲取的程序指針的值和堆棧 指針的值獲取堆棧指針指向的當前函數(shù)堆棧的大小以及當前函數(shù)堆 棧的棧幀中所存儲的返回指令;以及根據(jù)當前函數(shù)堆棧的大小和堆 棧指針的值獲取當前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲的函數(shù) 的返回指令;查找模塊306,用于查找異常進程的可4丸行文件,并 根據(jù)查找的可執(zhí)行文件查找異常進程的符號表,根據(jù)在當前棧幀和 其它棧幀中獲取的返回指令在符號表中查找相應的函數(shù)。其中,第二獲取模塊304獲取當前函數(shù)堆棧之后的函數(shù)堆棧的 棧幀中存儲的函數(shù)的返回指令的處理具體為確定當前堆棧指針的值;獲取當前函數(shù)堆棧中存儲的返回地址;確定當前函數(shù)堆棧的大 ??;將確定的值和大小相加,將相加的結果作為當前函數(shù)堆棧的下 一個函數(shù)堆棧的棧幀地址,并將下一個函數(shù)堆棧作為當前函數(shù)堆棧。該裝置還包括判斷模塊,用于在每次獲取了一個函數(shù)堆棧的 棧幀中存儲的函數(shù)的返回指令后,判斷獲取的返回指令所對應的函 數(shù)是否在調(diào)用異常的函數(shù)體內(nèi),如果判斷為是,則繼續(xù)查找下個函 數(shù)堆棧;否則停止查找函數(shù)堆棧。判斷模塊進行的判斷處理具體為 獲取當前獲取的函數(shù)堆棧的地址,并從程序空間獲取該函lt堆棧的 大小,并根據(jù)當前獲取的函數(shù)堆棧的地址和大小判斷其是否在函數(shù) 體范圍內(nèi)。此外,查找模塊306根據(jù)獲取的返回指令在符號表中查找相應 的函數(shù)時所執(zhí)行的處理具體為將符號表中小于并且最接近于返回 地址的函數(shù)地址作為對應于該返回地址的函數(shù)地址,并才艮據(jù)函數(shù)地 址找到相應函數(shù)。綜上所述,本發(fā)明能夠通過堆?;厮莸姆椒ǎ瑏V人可執(zhí)4亍文件里 直接提取出符號表查找以找到函數(shù)名。借助于本發(fā)明的技術方案, 能夠有效實現(xiàn)自動化的故障定位,大大"t是高了調(diào)試和故障定位的效 率,簡化了故障定位的操作,并且使故障定位的操作結果更加直觀。以上所述^f又為本發(fā)明的優(yōu)選實施例而已,并不用于限制本發(fā)明, 對于本領域的技術人員來說,本發(fā)明可以有各種更改和變化。凡在 本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等, 均應包含在本發(fā)明的保護范圍之內(nèi)。
權利要求
1. 一種故障定位方法,用于對無內(nèi)部互鎖流水級的微處理器的堆棧進行故障定位,其特征在于,所述方法包括在由于函數(shù)調(diào)用異常導致進程出現(xiàn)異常的情況下,在程序空間中獲取異常進程的程序指針的值和堆棧指針的值;根據(jù)獲取的所述程序指針的值和所述堆棧指針的值獲取所述堆棧指針指向的當前函數(shù)堆棧的大小以及所述當前函數(shù)堆棧的棧幀中所存儲的返回指令;根據(jù)所述當前函數(shù)堆棧的大小和所述堆棧指針的值獲取所述當前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲的函數(shù)的返回指令;查找所述異常進程的可執(zhí)行文件,并根據(jù)查找的所述可執(zhí)行文件查找所述異常進程的符號表,根據(jù)在當前棧幀和其它棧幀中獲取的所述返回指令在所述符號表中查找相應的函數(shù)。
2. 根據(jù)權利要求1所述的方法,其特征在于,獲取所述當前函數(shù) 堆棧之后的函數(shù)堆棧的棧幀中存儲的函數(shù)的返回指令的處理 具體為確定當前堆棧指針的值;獲取所述當前函數(shù)堆棧中存儲的返回地址;確定當前函數(shù)堆棧的大??;將確定的所述值和所述大小相加,將相加的結果作為所述 當前函數(shù)堆棧的下一個函tt堆棧的棧幀地址,并將所述下一個 函數(shù)堆棧作為所述當前函數(shù)堆棧。
3. 根據(jù)權利要求2所述的方法,其特征在于,在每次獲取了一個 函數(shù)堆棧的棧幀中存儲的函數(shù)的返回指令后,進一步包括判斷獲取的所述返回指令所對應的函數(shù)是否在調(diào)用異常 的函數(shù)體內(nèi),如果判斷為是,則繼續(xù)查找下個函數(shù)堆棧;否則 停止查找函數(shù)堆棧。
4. 根據(jù)權利要求3所述的方法,其特征在于,進行所述判斷的處 理具體為獲取當前獲取的所述函數(shù)堆棧的地址,并乂人所述程序空間 獲取該函數(shù)堆棧的大小,并根據(jù)所述當前獲取的所述函數(shù)堆棧 的地址和大小判斷其是否在所述函數(shù)體范圍內(nèi)。
5. 根據(jù)權利要求1至4中任一項所述的方法,其特征在于,根據(jù) 獲取的所述返回指令在所述符號表中查找相應的函數(shù)的處理 具體為將所述符號表中小于并且最接近于所述返回地址的函數(shù) 地址作為對應于該返回地址的函數(shù)地址,并一艮據(jù)所述函ft地址 ^戈到相應函凄文。
6. —種故障定位裝置,用于對無內(nèi)部互鎖流水級的孩t處理器的堆 棧進行故障定位,其特征在于,所述裝置包括第 一獲取模塊,用于在由于函數(shù)調(diào)用異常導致進程出現(xiàn)異 常的情況下,在程序空間中獲取異常進程的程序指針的值和堆 棧指針的值;第二獲取模塊,用于根據(jù)獲取的所述程序指針的值和所述 堆棧指針的值獲取所述堆棧指針指向的當前函數(shù)堆棧的大小 以及所述當前函數(shù)堆棧的棧幀中所存儲的返回指令;以及根據(jù) 所述當前函數(shù)堆棧的大小和所述堆棧指針的值獲取所述當前 函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存4諸的函凌t的返回指令;查找模塊,用于查找所述異常進程的可執(zhí)行文件,并根據(jù) 查找的所述可執(zhí)行文件查找所述異常進程的符號表,根據(jù)在當 前棧幀和其它棧幀中獲取的所述返回指令在所述符號表中查 才戈才目應的函凄t。
7. 根據(jù)權利要求6所述的裝置,其特征在于,所述第二獲取模塊 獲取所述當前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲的函數(shù) 的返回指令的處理具體為確定當前堆棧指針的值;獲取所述當前函數(shù)堆棧中存儲的返回地址;確定當前函數(shù)堆棧的大??;將確定的所述值和所述大小相力。,將相加的結果作為所述 當前函數(shù)堆棧的下一個函數(shù)堆棧的棧幀地址,并將所述下一個 函數(shù)堆棧作為所述當前函數(shù)堆棧。
8. 根據(jù)權利要求7所述的裝置,其特征在于,進一步包括判斷模塊,用于在每次獲取了 一個函數(shù)堆棧的棧幀中存儲 的函數(shù)的返回指令后,判斷獲取的所述返回指令所對應的函數(shù) 是否在調(diào)用異常的函數(shù)體內(nèi),如果判斷為是,則繼續(xù)查找下個 函數(shù)堆棧;否則停止查找函數(shù)堆棧。
9. 根據(jù)權利要求8所述的裝置,其特征在于,所述判斷模塊進行 的判斷處理具體為獲耳又當前獲取的所述函凄t堆棧的地址,并/人所述程序空間 獲取該函數(shù)堆棧的大小,并根據(jù)所述當前獲取的所述函數(shù)堆棧 的地址和大小判斷其是否在所述函數(shù)體范圍內(nèi)。
10. 根據(jù)權利要求6至9中任一項所述的裝置,其特征在于,所述 查找模塊根據(jù)獲取的所述返回指令在所述符號表中查找相應 的函數(shù)時所執(zhí)行的處理具體為將所述符號表中小于并且最接近于所述返回地址的函f欠 地址作為對應于該返回地址的函凄史地址,并4艮據(jù)所述函凄t地址 找到相應函凄史。
全文摘要
本發(fā)明公開了一種故障定位的方法,該方法包括在由于函數(shù)調(diào)用異常導致進程出現(xiàn)異常的情況下,在程序空間中獲取異常進程的程序指針的值和堆棧指針的值;根據(jù)獲取的程序指針的值和堆棧指針的值獲取堆棧指針指向的當前函數(shù)堆棧的大小以及當前函數(shù)堆棧的棧幀中所存儲的返回指令;根據(jù)當前函數(shù)堆棧的大小和堆棧指針的值獲取當前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲的函數(shù)的返回指令;查找異常進程的可執(zhí)行文件,并根據(jù)查找的可執(zhí)行文件查找異常進程的符號表,根據(jù)在當前棧幀和其它棧幀中獲取的返回指令在符號表中查找相應的函數(shù)。此外,本發(fā)明還公開了一種故障定位的裝置。
文檔編號G06F11/36GK101261603SQ20081008991
公開日2008年9月10日 申請日期2008年4月9日 優(yōu)先權日2008年4月9日
發(fā)明者朱懷云, 李金虎 申請人:中興通訊股份有限公司