欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

故障定位的方法和裝置的制作方法

文檔序號(hào):6462075閱讀:169來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):故障定位的方法和裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及無(wú)內(nèi)部互鎖流水級(jí)的孩支處理器領(lǐng)域,并且特別地, 涉及一種對(duì)無(wú)內(nèi)部互鎖流水級(jí)的微處理器的堆棧進(jìn)行故障定位的方 法和裝置。
背景技術(shù)
無(wú)內(nèi)部互鎖流水級(jí)的孩t處理器(MIPS)作為三大RISC CPU (powerpc、 arm、以及mips)之一,在嵌入式i殳備上4尋到廣S乏應(yīng)用, 越來(lái)越多的嵌入式程序運(yùn)行于MIPS CPU之上。當(dāng)應(yīng)用程序因?yàn)榭?指針、錯(cuò)誤指針、溢出等錯(cuò)誤導(dǎo)致異常崩潰時(shí),打印出的可供參考 的信息寥寥無(wú)幾。操作系統(tǒng)的異常處理程序里通常只是打印當(dāng)前 CPU的所有寄存器的值以及異常進(jìn)程異常時(shí)用戶空間程序指針 (pc),堆棧指針(sp)的值等。通常的定位故障的辦法是先反匯編異常進(jìn)程可執(zhí)行文件,然后 根據(jù)異常時(shí)打印的pc值去反匯編代碼中查找異常發(fā)生所在的函數(shù), 然而,這種方法有存在以下問(wèn)題第一,這種做法非常的繁瑣,并且不夠不直觀,需要反匯編代 碼、查找。并且對(duì)開(kāi)發(fā)人員有較高要求,很多上層業(yè)務(wù)開(kāi)發(fā)人員并 不熟悉這種反匯編定位故障的方法。第二,不能解決所有問(wèn)題。第一種情況是如果當(dāng)前異常函數(shù)被 很多函數(shù)調(diào)用,即使找到了異常函數(shù),依然無(wú)法定位是上面哪個(gè)函 數(shù)調(diào)用了以及哪個(gè)流程出了問(wèn)題,實(shí)際上,定位故障是定位一條函 凄t執(zhí)行流程。第二種種情況是異常有時(shí)發(fā)生在庫(kù)函數(shù)里(比如調(diào)用庫(kù)函數(shù)的函數(shù)傳給庫(kù)函數(shù)參lt錯(cuò)誤),異常記錄的pc值為庫(kù)函數(shù)i也 址,在反匯編用戶進(jìn)程里是無(wú)法找到與此pc值對(duì)應(yīng)的地址的。目前,在現(xiàn)有技術(shù)中,尚未提出能夠解決以上所述兩個(gè)問(wèn)題的 4支術(shù)方案。發(fā)明內(nèi)容考慮到上述問(wèn)題而做出本發(fā)明,為此,本發(fā)明的主要目的在于 提供一種故障定位的方法和裝置,以解決相關(guān)技術(shù)中故障定位繁瑣、 定位結(jié)果不直》見(jiàn)、以及故障定位不準(zhǔn)確的問(wèn)題。根據(jù)本發(fā)明的一個(gè)實(shí)施例,提供了一種故障定位方法,用于對(duì) 無(wú)內(nèi)部互鎖流水級(jí)的微處理器的堆棧進(jìn)行故障定位。該方法包括在由于函數(shù)調(diào)用異常導(dǎo)致進(jìn)程出現(xiàn)異常的情況下, 在程序空間中獲取異常進(jìn)程的程序指針的值和堆棧指針的值;根據(jù)獲取的程序指針的值和堆棧指針的值獲取堆棧指針指向的當(dāng)前函凄t堆棧的大小以及當(dāng)前函數(shù)堆棧的棧幀中所存儲(chǔ)的返回指令;根據(jù)當(dāng) 前函數(shù)堆棧的大小和堆棧指針的值獲取當(dāng)前函數(shù)堆棧之后的函數(shù)堆 棧的棧幀中存儲(chǔ)的函數(shù)的返回指令;查找異常進(jìn)程的可執(zhí)行文件, 并根據(jù)查找的可執(zhí)行文件查找異常進(jìn)程的符號(hào)表,根據(jù)在當(dāng)前棧幀 和其它棧幀中獲取的返回指令在符號(hào)表中查找相應(yīng)的函數(shù)。此外,獲取當(dāng)前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù) 的返回指令的處理具體為確定當(dāng)前堆棧指針的值;獲取當(dāng)前函數(shù) 堆棧中存儲(chǔ)的返回地址;確定當(dāng)前函數(shù)堆棧的大小;將確定的值和大小相加,將相加的結(jié)果作為當(dāng)前函數(shù)堆棧的下一個(gè)函數(shù)堆棧的棧 幀地址,并將下一個(gè)函數(shù)堆棧作為當(dāng)前函數(shù)堆棧。其中,在每次獲取了 一個(gè)函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù)的返回指令后,進(jìn)一步包括判斷獲取的返回指令所對(duì)應(yīng)的函數(shù)是否在調(diào) 用異常的函數(shù)體內(nèi),如果判斷為是,則繼續(xù)查找下個(gè)函^:堆棧;否 則停止查找函數(shù)堆棧。進(jìn)行判斷的處理具體為獲取當(dāng)前獲取的函 凄t堆棧的地址,并乂人程序空間獲取該函凄t堆棧的大小,并4艮據(jù)當(dāng)前 獲取的函數(shù)堆棧的地址和大小判斷其是否在函凄t體范圍內(nèi)。其中,根據(jù)獲取的返回指令在符號(hào)表中查找相應(yīng)的函數(shù)的處理 具體為將符號(hào)表中小于并且最接近于返回地址的函數(shù)地址作為對(duì) 應(yīng)于該返回地址的函數(shù)地址,并根據(jù)函數(shù)地址找到相應(yīng)函數(shù)。根據(jù)本發(fā)明的另一實(shí)施例,提供了一種故障定位裝置,用于對(duì) 無(wú)內(nèi)部互鎖流水級(jí)的樣i處理器的堆棧進(jìn)行故障定位。該裝置包括第一獲取模塊,用于在由于函數(shù)調(diào)用異常導(dǎo)致進(jìn) 程出現(xiàn)異常的情況下,在程序空間中獲取異常進(jìn)程的程序指針的值 和堆棧指針的值;第二獲取模塊,用于根據(jù)獲取的程序指針的值和 堆棧指針的值獲取堆棧指針指向的當(dāng)前函數(shù)堆棧的大小以及當(dāng)前函 數(shù)堆棧的棧幀中所存儲(chǔ)的返回指令;以及根據(jù)當(dāng)前函凄t堆棧的大小 和堆棧指針的值獲取當(dāng)前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲(chǔ)的 函數(shù)的返回指令;查找模塊,用于查找異常進(jìn)程的可執(zhí)行文件,并 根據(jù)查找的可執(zhí)行文件查找異常進(jìn)程的符號(hào)表,根據(jù)在當(dāng)前棧幀和 其它棧幀中獲取的返回指令在符號(hào)表中查找相應(yīng)的函數(shù)。其中,第二獲取模塊獲取當(dāng)前函數(shù)堆棧之后的函數(shù)堆棧的棧幀 中存儲(chǔ)的函數(shù)的返回指令的處理具體為確定當(dāng)前堆棧指針的值; 獲取當(dāng)前函凄t堆棧中存儲(chǔ)的返回地址;確定當(dāng)前函數(shù)堆棧的大??;將確定的值和大小相加,將相加的結(jié)果作為當(dāng)前函數(shù)堆棧的下一個(gè) 函數(shù)堆棧的棧幀地址,并將下一個(gè)函數(shù)堆棧作為當(dāng)前函數(shù)堆棧。此外,該裝置進(jìn)一步包括判斷模塊,用于在每次獲取了一個(gè) 函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù)的返回指令后,判斷獲取的返回指令 所對(duì)應(yīng)的函凄l(xiāng)是否在調(diào)用異常的函凄t體內(nèi),如果判斷為是,則繼續(xù) 查找下個(gè)函數(shù)堆棧;否則停止查找函數(shù)堆棧。判斷模塊進(jìn)行的判斷 處理具體為獲取當(dāng)前獲取的函數(shù)堆棧的地址,并從程序空間獲取 該函數(shù)堆棧的大小,并根據(jù)當(dāng)前獲取的函數(shù)堆棧的地址和大小判斷 其是否在函凄t體范圍內(nèi)。此外,查找模塊根據(jù)獲取的返回指令在符號(hào)表中查找相應(yīng)的函 數(shù)時(shí)所執(zhí)行的處理具體為將符號(hào)表中小于并且最接近于返回地址 的函數(shù)地址作為對(duì)應(yīng)于該返回地址的函數(shù)地址,并根據(jù)函數(shù)地址找 到^目應(yīng)函凄丈。綜上所述,借助于本發(fā)明的技術(shù)方案,能夠有效實(shí)現(xiàn)自動(dòng)化的 故障定位,大大提高了調(diào)試和故障定位的效率,簡(jiǎn)化了故障定位的 操作,并且使故障定位的操作結(jié)果更加直觀。


此處所說(shuō)明的附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申 請(qǐng)的一部分,本發(fā)明的示意性實(shí)施例及其說(shuō)明用于解釋本發(fā)明,并 不構(gòu)成對(duì)本發(fā)明的不當(dāng)限定。在附圖中圖i是才艮據(jù)本發(fā)明方法實(shí)施例的故障定位方法的流禾呈圖;圖2是根據(jù)相關(guān)技術(shù)的mips棧幀結(jié)構(gòu)圖;以及圖3是根據(jù)本發(fā)明裝置實(shí)施例的故障定位裝置的框圖。
具體實(shí)施方式
方法實(shí)施例在本實(shí)施例中,4是供了一種故障定位方法,用于對(duì)無(wú)內(nèi)部互鎖 流水級(jí)的孩吏處理器的堆棧進(jìn)行故障定位。圖1是故障定位方法的流程圖,如圖1所示,該方法包括步驟S102,在由于函數(shù)調(diào)用異常導(dǎo)致進(jìn)程出現(xiàn)異常的情況下, 在程序空間中獲取異常進(jìn)程的程序指針的值和堆棧指針的值;步驟 S104,根據(jù)獲取的程序指針的值和堆棧指針的值獲取堆棧指針指向 的當(dāng)前函數(shù)堆棧的大小以及當(dāng)前函數(shù)堆棧的棧幀中所存儲(chǔ)的返回指 令;步驟S106,根據(jù)當(dāng)前函數(shù)堆棧的大小和堆棧指針的值獲取當(dāng)前 函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù)的返回指令;步驟 S108,查找異常進(jìn)程的可^M于文件,并才艮據(jù)查找的可執(zhí)4于文件查找 異常進(jìn)程的符號(hào)表,根據(jù)在當(dāng)前棧幀和其它棧幀中獲取的返回指令 在符號(hào)表中查找相應(yīng)的函數(shù)。也就是說(shuō),定位一條函數(shù)執(zhí)行流程可以通過(guò)堆棧回溯的方法, 每個(gè)函數(shù)執(zhí)行時(shí)有一個(gè)棧幀,棧幀里保存有每個(gè)函數(shù)的返回地址, 在異常時(shí)將堆棧幀里存儲(chǔ)的各個(gè)函數(shù)地址回溯可以精確復(fù)現(xiàn)函數(shù)執(zhí) 4亍調(diào)用關(guān)系,就可以解決在反匯編用戶進(jìn)程里是無(wú)法找到與此pc ^直對(duì)應(yīng)的地址的問(wèn)題。但是,問(wèn)題的關(guān)鍵是確定每個(gè)棧幀的大小及每個(gè)函數(shù)返回地址 保存于棧幀中的位置,僅僅通過(guò)堆棧和異?,F(xiàn)場(chǎng)的mips的32個(gè)寄 存器是無(wú)法實(shí)現(xiàn)的。此外,獲取當(dāng)前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù) 的返回指令的處理具體為確定當(dāng)前堆棧指針的值;獲取當(dāng)前函數(shù)堆棧中存儲(chǔ)的返回地址;確定當(dāng)前函數(shù)堆棧的大??;將確定的值和 大小相加,將相加的結(jié)果作為當(dāng)前函數(shù)堆棧的下一個(gè)函數(shù)堆棧的棧 幀地址,并將下一個(gè)函數(shù)堆棧作為當(dāng)前函lt堆棧。其中,在每次獲取了一個(gè)函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù)的返回 指令后,進(jìn)一步包括判斷獲取的返回指令所對(duì)應(yīng)的函數(shù)是否在調(diào)用異常的函數(shù)體內(nèi),如果判斷為是,則繼續(xù)查找下個(gè)函數(shù)堆棧;否 則停止查找函數(shù)堆棧。進(jìn)行判斷的處理具體為獲取當(dāng)前獲取的函 數(shù)堆棧的地址,并從程序空間獲取該函凄t堆棧的大小,并才艮據(jù)當(dāng)前 獲取的函數(shù)堆棧的地址和大小判斷其是否在函數(shù)體范圍內(nèi)。當(dāng)進(jìn)程發(fā)生異常時(shí),操作系統(tǒng)會(huì)保護(hù)進(jìn)程用戶空間現(xiàn)場(chǎng)進(jìn)入異 常處理程序。根據(jù)異常時(shí)進(jìn)程PC和SP值在此進(jìn)程程序空間.text區(qū) 搜索MIPS關(guān)鍵二進(jìn)制指令,以獲得當(dāng)前函數(shù)堆棧大小及返回指令 存儲(chǔ)于此棧幀位置,gcc編譯mips代碼時(shí)有固有的特點(diǎn),某些指令 包含了函數(shù)開(kāi)始初分配棧幀空間的大小,某些指令指出了函數(shù)返回 地址保存寄存器ra保存于棧幀里的相對(duì)位置。搜索到這些特定指令 即可以獲得當(dāng)前函數(shù)堆棧大小及r a保存于棧幀中位置。將sp加上當(dāng)前函數(shù)堆棧大小即獲得下一棧幀的sp,從棧幀中取 出ra或直接從ra中可獲得返回指令地址,返回指令地址即位于調(diào)用 此異常函數(shù)的母函數(shù)體內(nèi),反復(fù)重復(fù)上一過(guò)程,即獲得了導(dǎo)致此異 常的函lt流禾呈里的所有函凄t返回;也址。此外,根據(jù)獲取的返回指令在符號(hào)表中查找相應(yīng)的函數(shù)的處理 具體為將符號(hào)表中小于并且最接近于返回地址的函數(shù)地址作為對(duì) 應(yīng)于該返回地址的函數(shù)地址,并根據(jù)函數(shù)地址找到相應(yīng)函數(shù)。至此,如果只是簡(jiǎn)單的將各個(gè)函數(shù)返回地址打印出來(lái),對(duì)開(kāi)發(fā) 人員仍然不方便,依然存在繁瑣和不直觀的問(wèn)題,而對(duì)照符號(hào)表就可以將函數(shù)返回地址對(duì)應(yīng)的函數(shù)名查找出來(lái),這樣通過(guò)將各個(gè)函數(shù) 名打印出來(lái)就可以對(duì)出現(xiàn)故障的流程里的各個(gè)函數(shù)一 目了然。具體地,可以找到此進(jìn)程存放在文件系統(tǒng)里的可執(zhí)行文件,打 開(kāi),按照可執(zhí)行文件格式找到符號(hào)表,通過(guò)函數(shù)地址查找符號(hào)表找 到函數(shù)名。前面獲得的是函數(shù)返回地址,并非函數(shù)起始地址,而函數(shù)符號(hào)對(duì)應(yīng)的是函數(shù)起始地址,可以采用如下算法在符號(hào)表里, 搜索比返回地址值小并且兩者間距最小的符號(hào)地址即為函數(shù)符號(hào)。圖2是根據(jù)相關(guān)技術(shù)的mips棧幀的結(jié)構(gòu)示意圖。下面,將結(jié)合 圖2描述根據(jù)本實(shí)施例的對(duì)MIPS堆棧回溯定位故障的方法。Leaf函數(shù)是指內(nèi)部沒(méi)有調(diào)用其他函數(shù)的函數(shù)。函數(shù)調(diào)用leaf函 數(shù)時(shí)返回地址保存于ra中,在leaf函數(shù)里因?yàn)闊o(wú)需再調(diào)用其他函數(shù), 所以通常ra無(wú)需壓一戔,可以直4妄乂人ra中獲4尋返回i也址。Leaf函彰: 是否需要建立堆棧是依據(jù)具體函數(shù)的,mips的gCC編譯器在函數(shù)入口一次性的為此函數(shù)分配堆棧大小。如圖2所示,堆棧大小包括三 部分為函ft內(nèi)臨時(shí)變量分配空間、 一些內(nèi)部寄存器保存、為內(nèi)部 4皮調(diào)用函數(shù)建立參數(shù)的空間。mips有32個(gè)內(nèi)部寄存器,內(nèi)部寄存 器可以做為臨時(shí)變量,做被調(diào)用函數(shù)輸入?yún)?shù)等,前提是這些寄存 器器夠用,所以并非每個(gè)函數(shù)編譯器都會(huì)為其建立堆棧。Nonleaf函數(shù)為內(nèi)部調(diào)用了其他函數(shù)的函數(shù),nonleaf函數(shù)通常 在函數(shù)入口處要建立堆棧,因?yàn)橹辽賠a需要保存于堆棧中。建立堆棧的做法是編譯器計(jì)算出要為此函數(shù)分配的堆棧大小, 然后一次性設(shè)定,在函lt入口處將sp減去此堆棧大小,然后所有在 堆棧中的數(shù)據(jù)都通過(guò)Sp加上固定的偏移量來(lái)獲取,在函凄t出口處將 sp加上堆棧大小恢復(fù)前一堆棧值。Mips指令為32bit長(zhǎng),里面包含操作碼(opcode ),操作寄存器, 操作數(shù)等,每條指令都有其固定編碼格式,將32bit的指令與特定掩 碼相與提取出操作數(shù),操作寄存器等,則可以確定此指令。下面的 搜索指令均采用此方法。才艮據(jù)pc值在用戶進(jìn)程程序空間中往前4臾索如果搜索到swra, x(sp),這條指令指出ra保存于堆棧sp+x處, 從指令提取出偏移量x,而一個(gè)函數(shù)的sp是固定指向此函數(shù)堆棧頂 的,所以從堆棧sp+x處可以取處保存的ra值,而ra里存方文的是此 函凄t的返回地J止。如果沒(méi)有搜索到sw ra, x(sp),則表明此函數(shù)沒(méi)有保存m于堆 棧里,則ra里存放的就是返回地址,從寄存器器ra里直接可以獲得 函凄t返回i也址。如果搜索到addiusp, sp, +-offset指令,這條指令通常位于函 數(shù)入口最開(kāi)始處由編譯器用來(lái)為此函數(shù)分配堆棧大小,在函數(shù)返回 之前由編譯器回收堆棧。異常通常發(fā)生在用戶代碼里,而我們是根 據(jù)pc往前4叟索,所以4臾索到的應(yīng)該是addiusp, sp, -offset, 乂人此 指令中提取立即數(shù)offset,此即為此函數(shù)棧幀大小。如果沒(méi)有4臾索到 此指令,表示此函數(shù)沒(méi)有分配堆棧,則下一函數(shù)堆棧指針依然為此 sp值。直到搜索到另一個(gè)函數(shù)體內(nèi)肯定是錯(cuò)誤的為止,有兩個(gè)結(jié)束條 件 一個(gè)是搜索到addiu sp, sp, -offset指令。 一個(gè)是搜索到j(luò)r ra 指令,jr ra是每個(gè)函數(shù)的返回指令,如果搜索到此指令表示已搜索 脫離了本函數(shù),進(jìn)入此函數(shù)相鄰的函數(shù)里了 ,則此時(shí)搜索應(yīng)該結(jié)束。上述操作的輸入是當(dāng)前函數(shù)體內(nèi)的一個(gè)pc值;當(dāng)前函數(shù)的堆 棧起始地址sp。輸出是調(diào)用此函數(shù)的返回地址,此返回地址位于調(diào)用函數(shù)的地址范圍內(nèi);當(dāng)前函數(shù)堆棧大小,加上當(dāng)前堆棧起始地 址,即,獲得調(diào)用函數(shù)的堆棧起始地址。將輸出再次作為輸入,重 復(fù)上述過(guò)程就可以獲得一個(gè)完整的調(diào)用鏈里所有函凄t體內(nèi)的一個(gè)地 址值。進(jìn)程在內(nèi)核的進(jìn)程控制塊里保存有進(jìn)程的用戶空間堆棧開(kāi)始地 址;用戶空間程序開(kāi)始及結(jié)束地址,上述循環(huán)搜索始終判斷獲得函 數(shù)堆棧地址,函數(shù)地址是否在范圍之類(lèi),如果不在,循環(huán)4臾索結(jié)束。可執(zhí)行文件格式很多,本實(shí)施例以ELF格式為例進(jìn)行說(shuō)明。 找到此進(jìn)程在文件系統(tǒng)里的elf文件,打開(kāi),按照elf文件格式,提 取出4個(gè)section: .dynsym、 .symtab、 .dynstr、 .strtab、 .dynsym, 其 中,.symtab為符號(hào)表,.dynstr和.strtab為符號(hào)對(duì)應(yīng)字符串。其中,符號(hào)表里每個(gè)符號(hào)對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)為 typedef structElf32—Word st—name;/*符號(hào)名索引號(hào)*/ Elf32—Addr st—value;/*才尋號(hào);也址^f直*/ Elfi2—Word st—size;/*符號(hào)對(duì)應(yīng)的代碼長(zhǎng)度*/ unsigned char st—info;/*符號(hào)類(lèi)型和4邦定4言息*/ unsigned char st一other; /*未用,值為0 */ Elf32—Section st—shndx;/*所在節(jié)的節(jié)索引號(hào)*/} Elf32—Sym;前面搜索出的是一條返回地址鏈,并非每個(gè)函數(shù)的初始地址, 返回地址位于每個(gè)函數(shù)地址范圍內(nèi),可以采用如下算法計(jì)算處函數(shù) 初始地址在符號(hào)表里,搜索比返回地址值小并且兩者間距最小的 符號(hào)i也址(即st—value)即為函凄t初始i也址,它對(duì)應(yīng)的st_name為符 號(hào)名索引號(hào),通過(guò)此索引號(hào)到.dynstr節(jié)或.strtab節(jié)即可以獲得每個(gè) 函數(shù)的符號(hào)名。將每個(gè)函數(shù)的符號(hào)名逐一打印出來(lái)就可以看到異常發(fā)生時(shí)整個(gè) 調(diào)用關(guān)系里的所有函數(shù)名,定位故障位置直^L、方遍、并且迅速。裝置實(shí)施例在本實(shí)施例中,提供了一種故障定位裝置,用于對(duì)無(wú)內(nèi)部互鎖 流水級(jí)的;f效處理器的堆棧進(jìn)行故障定位。圖3為這種故障定位裝置的流程圖,如圖3所示,該裝置包括第一獲取模塊302,用于在由于函數(shù)調(diào)用異常導(dǎo)致進(jìn)程出現(xiàn)異 常的情況下,在程序空間中獲取異常進(jìn)程的程序指針的值和堆棧指 針的值;第二獲取模塊304,用于根據(jù)獲取的程序指針的值和堆棧 指針的值獲取堆棧指針指向的當(dāng)前函數(shù)堆棧的大小以及當(dāng)前函數(shù)堆 棧的棧幀中所存儲(chǔ)的返回指令;以及根據(jù)當(dāng)前函數(shù)堆棧的大小和堆 棧指針的值獲取當(dāng)前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù) 的返回指令;查找模塊306,用于查找異常進(jìn)程的可4丸行文件,并 根據(jù)查找的可執(zhí)行文件查找異常進(jìn)程的符號(hào)表,根據(jù)在當(dāng)前棧幀和 其它棧幀中獲取的返回指令在符號(hào)表中查找相應(yīng)的函數(shù)。其中,第二獲取模塊304獲取當(dāng)前函數(shù)堆棧之后的函數(shù)堆棧的 棧幀中存儲(chǔ)的函數(shù)的返回指令的處理具體為確定當(dāng)前堆棧指針的值;獲取當(dāng)前函數(shù)堆棧中存儲(chǔ)的返回地址;確定當(dāng)前函數(shù)堆棧的大 ??;將確定的值和大小相加,將相加的結(jié)果作為當(dāng)前函數(shù)堆棧的下 一個(gè)函數(shù)堆棧的棧幀地址,并將下一個(gè)函數(shù)堆棧作為當(dāng)前函數(shù)堆棧。該裝置還包括判斷模塊,用于在每次獲取了一個(gè)函數(shù)堆棧的 棧幀中存儲(chǔ)的函數(shù)的返回指令后,判斷獲取的返回指令所對(duì)應(yīng)的函 數(shù)是否在調(diào)用異常的函數(shù)體內(nèi),如果判斷為是,則繼續(xù)查找下個(gè)函 數(shù)堆棧;否則停止查找函數(shù)堆棧。判斷模塊進(jìn)行的判斷處理具體為 獲取當(dāng)前獲取的函數(shù)堆棧的地址,并從程序空間獲取該函lt堆棧的 大小,并根據(jù)當(dāng)前獲取的函數(shù)堆棧的地址和大小判斷其是否在函數(shù) 體范圍內(nèi)。此外,查找模塊306根據(jù)獲取的返回指令在符號(hào)表中查找相應(yīng) 的函數(shù)時(shí)所執(zhí)行的處理具體為將符號(hào)表中小于并且最接近于返回 地址的函數(shù)地址作為對(duì)應(yīng)于該返回地址的函數(shù)地址,并才艮據(jù)函數(shù)地 址找到相應(yīng)函數(shù)。綜上所述,本發(fā)明能夠通過(guò)堆棧回溯的方法,乂人可執(zhí)4亍文件里 直接提取出符號(hào)表查找以找到函數(shù)名。借助于本發(fā)明的技術(shù)方案, 能夠有效實(shí)現(xiàn)自動(dòng)化的故障定位,大大"t是高了調(diào)試和故障定位的效 率,簡(jiǎn)化了故障定位的操作,并且使故障定位的操作結(jié)果更加直觀。以上所述^f又為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明, 對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),本發(fā)明可以有各種更改和變化。凡在 本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等, 均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1. 一種故障定位方法,用于對(duì)無(wú)內(nèi)部互鎖流水級(jí)的微處理器的堆棧進(jìn)行故障定位,其特征在于,所述方法包括在由于函數(shù)調(diào)用異常導(dǎo)致進(jìn)程出現(xiàn)異常的情況下,在程序空間中獲取異常進(jìn)程的程序指針的值和堆棧指針的值;根據(jù)獲取的所述程序指針的值和所述堆棧指針的值獲取所述堆棧指針指向的當(dāng)前函數(shù)堆棧的大小以及所述當(dāng)前函數(shù)堆棧的棧幀中所存儲(chǔ)的返回指令;根據(jù)所述當(dāng)前函數(shù)堆棧的大小和所述堆棧指針的值獲取所述當(dāng)前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù)的返回指令;查找所述異常進(jìn)程的可執(zhí)行文件,并根據(jù)查找的所述可執(zhí)行文件查找所述異常進(jìn)程的符號(hào)表,根據(jù)在當(dāng)前棧幀和其它棧幀中獲取的所述返回指令在所述符號(hào)表中查找相應(yīng)的函數(shù)。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,獲取所述當(dāng)前函數(shù) 堆棧之后的函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù)的返回指令的處理 具體為確定當(dāng)前堆棧指針的值;獲取所述當(dāng)前函數(shù)堆棧中存儲(chǔ)的返回地址;確定當(dāng)前函數(shù)堆棧的大?。粚⒋_定的所述值和所述大小相加,將相加的結(jié)果作為所述 當(dāng)前函數(shù)堆棧的下一個(gè)函tt堆棧的棧幀地址,并將所述下一個(gè) 函數(shù)堆棧作為所述當(dāng)前函數(shù)堆棧。
3. 根據(jù)權(quán)利要求2所述的方法,其特征在于,在每次獲取了一個(gè) 函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù)的返回指令后,進(jìn)一步包括判斷獲取的所述返回指令所對(duì)應(yīng)的函數(shù)是否在調(diào)用異常 的函數(shù)體內(nèi),如果判斷為是,則繼續(xù)查找下個(gè)函數(shù)堆棧;否則 停止查找函數(shù)堆棧。
4. 根據(jù)權(quán)利要求3所述的方法,其特征在于,進(jìn)行所述判斷的處 理具體為獲取當(dāng)前獲取的所述函數(shù)堆棧的地址,并乂人所述程序空間 獲取該函數(shù)堆棧的大小,并根據(jù)所述當(dāng)前獲取的所述函數(shù)堆棧 的地址和大小判斷其是否在所述函數(shù)體范圍內(nèi)。
5. 根據(jù)權(quán)利要求1至4中任一項(xiàng)所述的方法,其特征在于,根據(jù) 獲取的所述返回指令在所述符號(hào)表中查找相應(yīng)的函數(shù)的處理 具體為將所述符號(hào)表中小于并且最接近于所述返回地址的函數(shù) 地址作為對(duì)應(yīng)于該返回地址的函數(shù)地址,并一艮據(jù)所述函ft地址 ^戈到相應(yīng)函凄文。
6. —種故障定位裝置,用于對(duì)無(wú)內(nèi)部互鎖流水級(jí)的孩t處理器的堆 棧進(jìn)行故障定位,其特征在于,所述裝置包括第 一獲取模塊,用于在由于函數(shù)調(diào)用異常導(dǎo)致進(jìn)程出現(xiàn)異 常的情況下,在程序空間中獲取異常進(jìn)程的程序指針的值和堆 棧指針的值;第二獲取模塊,用于根據(jù)獲取的所述程序指針的值和所述 堆棧指針的值獲取所述堆棧指針指向的當(dāng)前函數(shù)堆棧的大小 以及所述當(dāng)前函數(shù)堆棧的棧幀中所存儲(chǔ)的返回指令;以及根據(jù) 所述當(dāng)前函數(shù)堆棧的大小和所述堆棧指針的值獲取所述當(dāng)前 函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存4諸的函凌t的返回指令;查找模塊,用于查找所述異常進(jìn)程的可執(zhí)行文件,并根據(jù) 查找的所述可執(zhí)行文件查找所述異常進(jìn)程的符號(hào)表,根據(jù)在當(dāng) 前棧幀和其它棧幀中獲取的所述返回指令在所述符號(hào)表中查 才戈才目應(yīng)的函凄t。
7. 根據(jù)權(quán)利要求6所述的裝置,其特征在于,所述第二獲取模塊 獲取所述當(dāng)前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù) 的返回指令的處理具體為確定當(dāng)前堆棧指針的值;獲取所述當(dāng)前函數(shù)堆棧中存儲(chǔ)的返回地址;確定當(dāng)前函數(shù)堆棧的大小;將確定的所述值和所述大小相力。,將相加的結(jié)果作為所述 當(dāng)前函數(shù)堆棧的下一個(gè)函數(shù)堆棧的棧幀地址,并將所述下一個(gè) 函數(shù)堆棧作為所述當(dāng)前函數(shù)堆棧。
8. 根據(jù)權(quán)利要求7所述的裝置,其特征在于,進(jìn)一步包括判斷模塊,用于在每次獲取了 一個(gè)函數(shù)堆棧的棧幀中存儲(chǔ) 的函數(shù)的返回指令后,判斷獲取的所述返回指令所對(duì)應(yīng)的函數(shù) 是否在調(diào)用異常的函數(shù)體內(nèi),如果判斷為是,則繼續(xù)查找下個(gè) 函數(shù)堆棧;否則停止查找函數(shù)堆棧。
9. 根據(jù)權(quán)利要求8所述的裝置,其特征在于,所述判斷模塊進(jìn)行 的判斷處理具體為獲耳又當(dāng)前獲取的所述函凄t堆棧的地址,并/人所述程序空間 獲取該函數(shù)堆棧的大小,并根據(jù)所述當(dāng)前獲取的所述函數(shù)堆棧 的地址和大小判斷其是否在所述函數(shù)體范圍內(nèi)。
10. 根據(jù)權(quán)利要求6至9中任一項(xiàng)所述的裝置,其特征在于,所述 查找模塊根據(jù)獲取的所述返回指令在所述符號(hào)表中查找相應(yīng) 的函數(shù)時(shí)所執(zhí)行的處理具體為將所述符號(hào)表中小于并且最接近于所述返回地址的函f欠 地址作為對(duì)應(yīng)于該返回地址的函凄史地址,并4艮據(jù)所述函凄t地址 找到相應(yīng)函凄史。
全文摘要
本發(fā)明公開(kāi)了一種故障定位的方法,該方法包括在由于函數(shù)調(diào)用異常導(dǎo)致進(jìn)程出現(xiàn)異常的情況下,在程序空間中獲取異常進(jìn)程的程序指針的值和堆棧指針的值;根據(jù)獲取的程序指針的值和堆棧指針的值獲取堆棧指針指向的當(dāng)前函數(shù)堆棧的大小以及當(dāng)前函數(shù)堆棧的棧幀中所存儲(chǔ)的返回指令;根據(jù)當(dāng)前函數(shù)堆棧的大小和堆棧指針的值獲取當(dāng)前函數(shù)堆棧之后的函數(shù)堆棧的棧幀中存儲(chǔ)的函數(shù)的返回指令;查找異常進(jìn)程的可執(zhí)行文件,并根據(jù)查找的可執(zhí)行文件查找異常進(jìn)程的符號(hào)表,根據(jù)在當(dāng)前棧幀和其它棧幀中獲取的返回指令在符號(hào)表中查找相應(yīng)的函數(shù)。此外,本發(fā)明還公開(kāi)了一種故障定位的裝置。
文檔編號(hào)G06F11/36GK101261603SQ20081008991
公開(kāi)日2008年9月10日 申請(qǐng)日期2008年4月9日 優(yōu)先權(quán)日2008年4月9日
發(fā)明者朱懷云, 李金虎 申請(qǐng)人:中興通訊股份有限公司
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
杭锦后旗| 沿河| 五河县| 石景山区| 阿拉善左旗| 琼结县| 奉新县| 祁门县| 易门县| 昌吉市| 宁津县| 深州市| 永昌县| 石景山区| 大宁县| 遂川县| 若尔盖县| 东方市| 边坝县| 同仁县| 广灵县| 尚义县| 鲁甸县| 怀安县| 霍林郭勒市| 剑河县| 黄梅县| 肇东市| 彰武县| 防城港市| 芜湖县| 剑川县| 嘉定区| 揭东县| 阿尔山市| 托克托县| 交口县| 红原县| 金阳县| 太和县| 东乡族自治县|