專利名稱:一種基于mips架構(gòu)cpu的異常點(diǎn)定位診斷方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)通信領(lǐng)域,尤其涉及一種基于MIPS (Million Instructions Per Second,每秒處理的百萬(wàn)級(jí)的機(jī)器語(yǔ)言指令數(shù))CPU架構(gòu)的數(shù)據(jù)通信產(chǎn) 品在運(yùn)行過(guò)程中因硬件或軟件原因發(fā)生異常時(shí)的異常點(diǎn)定位診斷方法。
背景技術(shù):
隨著數(shù)據(jù)通信技術(shù)的飛速發(fā)展,各類數(shù)據(jù)通信產(chǎn)品不斷更新?lián)Q代,如交 換機(jī)、路由器等都是非常復(fù)雜的系統(tǒng),包羅紛繁復(fù)雜的硬件器件,同時(shí)運(yùn)行 著數(shù)以百萬(wàn)條機(jī)器指令。如此一來(lái),在系統(tǒng)運(yùn)行過(guò)程中, 一旦出現(xiàn)硬件或軟 件故障,故障異常點(diǎn)的定位和診斷就顯得格外重要。 一般情況下,系統(tǒng)運(yùn)行 過(guò)程中常會(huì)產(chǎn)生如下幾個(gè)問(wèn)題1、在產(chǎn)品系統(tǒng)軟件開(kāi)發(fā)過(guò)程中,由于軟件缺陷導(dǎo)致系統(tǒng)死機(jī)(拋異常)。
遇到這類故障,在異常處理程序里邊,可以獲取直接導(dǎo)致異常的指令 EPC,根據(jù)這一EPC指令可以知道發(fā)生異常的函數(shù)。但是更多的時(shí)候僅僅知 道引起異常的函數(shù)還不夠精確定位,因?yàn)樵摵瘮?shù)可能被很多個(gè)函數(shù)調(diào)用,這 個(gè)時(shí)候就用到函數(shù)回溯(tracing),也就是從當(dāng)前函數(shù)找到其調(diào)用函數(shù)。如果 一個(gè)函數(shù)只被一個(gè)函數(shù)調(diào)用,那么直接從代碼邏輯上就可以找到其調(diào)用函 數(shù);但是如果一個(gè)函數(shù)被多個(gè)函數(shù)調(diào)用,要找到其調(diào)用函數(shù)就不那么容易了, 而在不同的情況下調(diào)用效果是不一樣的。
如圖1所示,圖中的字母表示函數(shù),箭頭表示函數(shù)調(diào)用關(guān)系,函數(shù)p可 能從不同的路徑上被不同的函數(shù)調(diào)用,其效果很不一樣,如圖所示的例子, 存在如下幾種調(diào)用關(guān)系a—f—m—p; b—g—m—p; b—g—n—p; c—g—m —p; c—g—n—p; c—h—n—p; d—h—n—p; d—i—n—p; e—i—n—p。假 設(shè)某時(shí)刻函數(shù)p執(zhí)行過(guò)程中出現(xiàn)了嚴(yán)重錯(cuò)誤,即系統(tǒng)在執(zhí)行某條指令PC時(shí)
產(chǎn)生了異常,根據(jù)PC地址僅知道異常發(fā)生在p函數(shù)中,但是到底是上述哪 條路徑調(diào)用導(dǎo)致了異常則需要進(jìn)一步的定位,如果能從函數(shù)p回溯出其調(diào)用 函數(shù)將給故障診斷和定位帶來(lái)極大的幫助。X86體系架構(gòu)的CPU和基于PowerPC架構(gòu)的CPU很容易實(shí)現(xiàn)這一點(diǎn), 以基于PowerPC架構(gòu)的CPU為例,因?yàn)镻owerPC ABI (Application Binary Interface,應(yīng)用二進(jìn)制接口 )規(guī)定了其函數(shù)棧結(jié)構(gòu),如圖2所示,PowerPC 的每個(gè)函數(shù)棧都有一個(gè)統(tǒng)一的函數(shù)棧頭Frame Header (如圖2所示的斜線部 分)位于其函數(shù)棧的底部(low address)處,用于存放返回地址和其父函數(shù) (即調(diào)用函數(shù))的函數(shù)棧指針sp (stackpointer)。隨著函數(shù)的層層調(diào)用,函 數(shù)棧之間如同串成了一條鏈表,如圖2中的箭頭所示,所以回溯起來(lái)就如遍 歷鏈表一樣。根據(jù)當(dāng)前的函數(shù)棧指針sp,便有如下規(guī)律返回地址二氣(in,)sp + l) 父函數(shù)棧指針-^((int"^)根據(jù)這個(gè)公式遞歸向上回溯,便可以將整個(gè)函數(shù)調(diào)用關(guān)系輸出出來(lái)。然而,基于MIPS架構(gòu)(如交換機(jī)、路由器等)的CPU就無(wú)法實(shí)現(xiàn)這一 點(diǎn),這是由于MIPS ABI并沒(méi)有定義如同PowerPC架構(gòu)的函數(shù)棧頭(Frame Header),而是僅僅提供了一個(gè)松散的函數(shù)棧結(jié)構(gòu),根據(jù)這種函數(shù)棧結(jié)構(gòu)無(wú) 法精確定位。如圖3所示,基于MIPS架構(gòu)的CPU函數(shù)棧僅僅定義了三個(gè)區(qū), 即局部變量區(qū)、寄存器區(qū)和參數(shù)傳遞區(qū),每個(gè)寄存器在寄存器區(qū)的具體什么 位置存放是在編譯時(shí)隨機(jī)確定的,其函數(shù)棧里并沒(méi)有像PowerPC那樣固定的 Fmme Header,無(wú)法從當(dāng)前函數(shù)棧上獲取返回地址和父函數(shù)的桟指針,如此 就使得函數(shù)回溯幾乎無(wú)法實(shí)現(xiàn)。相反像X86體系架構(gòu)的CPU和IBM的 PowerPC體系架構(gòu)的CPU都在ABI規(guī)范上提供了支持,他們嚴(yán)格規(guī)定了各 寄存器、返回地址等在其函數(shù)棧中的存放位置,使得在這些架構(gòu)的CPU上 可以很簡(jiǎn)單的實(shí)現(xiàn)函數(shù)回溯。如此一來(lái),當(dāng)基于MIPS架構(gòu)的CPU執(zhí)行過(guò)程中出現(xiàn)一些故障時(shí),就無(wú) 法根據(jù)出錯(cuò)函數(shù)追溯到其調(diào)用函數(shù),從而給故障診斷和定位帶來(lái)不便。2、 硬件故障定位?;贛IPS CPU架構(gòu)的數(shù)據(jù)通信產(chǎn)品中包羅了上萬(wàn)顆硬件芯片,如果某個(gè)硬件芯片出現(xiàn)故障,那么一條機(jī)器指令去訪問(wèn)該硬件的時(shí)候,往往就會(huì)拋出bus error的異常。硬件的故障,不一定就是電路設(shè)計(jì)上的問(wèn)題,可能是某 些信號(hào)的臨界導(dǎo)致的,如果是這種問(wèn)題導(dǎo)致系統(tǒng)死機(jī),那么硬件開(kāi)發(fā)人員是 很難通過(guò)走讀硬件電路設(shè)計(jì)圖來(lái)完成故障定位的,這時(shí)候一般需要通過(guò)軟件 人員調(diào)試信息的定位跟蹤,與上個(gè)例子存在一樣問(wèn)題的是MIPS松散的函數(shù) 棧結(jié)構(gòu)無(wú)法幫助精確定位,只能通過(guò)初步的定位進(jìn)行猜測(cè)、 一定程度的盲調(diào)。3、 設(shè)備在用戶使用過(guò)程中的故障定位。設(shè)備賣給客戶之后不可避免地還是會(huì)出現(xiàn)故障, 一些嚴(yán)重的死機(jī)問(wèn)題往 往會(huì)拋出異常信息,這些異常信息指示出了系統(tǒng)運(yùn)行過(guò)程中哪些指令導(dǎo)致了 當(dāng)前異常,如果還能在這些異常信息中指標(biāo)出,導(dǎo)致故障的指令的函數(shù)棧調(diào) 用情況,則為設(shè)備產(chǎn)商定位故障節(jié)約了寶貴的時(shí)間,更重要的是,可以使客 戶的網(wǎng)絡(luò)盡快恢復(fù)使用。但是MIPS架構(gòu)的CPU由于其松散的函數(shù)棧結(jié)構(gòu) 無(wú)法做到這一點(diǎn),在出現(xiàn)故障時(shí)只能指出異常指令,無(wú)法打印出函數(shù)調(diào)用情 況。發(fā)明內(nèi)容本發(fā)明要解決的技術(shù)問(wèn)題是,根據(jù)系統(tǒng)發(fā)生異常時(shí)的指令PC ,定位出 發(fā)生異常時(shí)的整個(gè)函數(shù)調(diào)用路徑,實(shí)現(xiàn)系統(tǒng)軟件或硬件故障的診斷。本發(fā)明的主要目的在于提供一種基于MIPS架構(gòu)CPU的異常點(diǎn)定位診斷 方法,該方法基于MIPSABI定義的函數(shù)棧,從中獲取當(dāng)前函數(shù)的返回地址 和父函數(shù)的函數(shù)棧指針,實(shí)現(xiàn)MIPS架構(gòu)CPU上的函數(shù)回溯(tmcing),以解 決上述現(xiàn)有技術(shù)中所指出的問(wèn)題。根據(jù)本發(fā)明的一較佳實(shí)施方式,提供一種基于MIPS架構(gòu)CPU的異常點(diǎn) 定位診斷方法,該方法包括下列步驟掃描當(dāng)前函數(shù)的機(jī)器碼;解析構(gòu)建函
數(shù)棧指令中的偏移,計(jì)算出調(diào)用函數(shù)的函數(shù)桟指針;解析返回地址存放指令 中的偏移,計(jì)算出返回地址在當(dāng)前函數(shù)的函數(shù)棧中的存放位置,得到返回地 址。通過(guò)本發(fā)明實(shí)施方式的方法,可以實(shí)現(xiàn)準(zhǔn)確的函數(shù)回溯效果,準(zhǔn)確定位 故障,方便故障診斷。
此處所說(shuō)明的附圖用來(lái)提供對(duì)本發(fā)明的進(jìn)一步理解,構(gòu)成本申請(qǐng)的一部 分,并不構(gòu)成對(duì)本發(fā)明的限定。在附圖中-圖l為現(xiàn)有技術(shù)中的函數(shù)調(diào)用關(guān)系圖; 圖2為現(xiàn)有技術(shù)中的PowerPC函數(shù)棧結(jié)構(gòu)圖; 圖3為現(xiàn)有技術(shù)中的MIPS函數(shù)棧結(jié)構(gòu)圖; 圖4為構(gòu)建函數(shù)棧的示意圖;圖5為保存返回地址的示意圖;圖6為本發(fā)明的函數(shù)回溯方法的流程圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,下面結(jié)合附圖,對(duì) 本發(fā)明實(shí)施方式做進(jìn)一步詳細(xì)說(shuō)明。在此,本發(fā)明的示意性實(shí)施方式及其說(shuō) 明用于解釋本發(fā)明,但并不作為對(duì)本發(fā)明的限定。本發(fā)明提供一種基于MIPS架構(gòu)CPU的異常點(diǎn)定位診斷方法,通過(guò)MIPS 架構(gòu)CPU上的函數(shù)回溯,定位診斷異常點(diǎn)。本發(fā)明的方法是通過(guò)如下步驟 來(lái)實(shí)現(xiàn)的首先,構(gòu)建函數(shù)棧,由于子函數(shù)的函數(shù)棧緊貼于父函數(shù)的函數(shù)棧的底部, 而且子函數(shù)棧的構(gòu)造一般均在子函數(shù)入口處完成,所以這個(gè)步驟是將父函數(shù)的棧指針減一個(gè)偏移,構(gòu)建出子函數(shù)的函數(shù)棧,即sp子函數(shù)-sp父函數(shù)-offset,如 圖4所示,對(duì)應(yīng)到MIPS的機(jī)器指令上,可以通過(guò)構(gòu)建函數(shù)棧指令"addiu sp,sp,-offset"實(shí)現(xiàn),其中的offset是一個(gè)立即數(shù)。然后,保存返回地址,子函數(shù)將其返回地址保存到其函數(shù)棧的一預(yù)定位 置,以便函數(shù)返回,如圖5所示。例如,對(duì)應(yīng)MIPS32架構(gòu),可以使用返回 地址存放指令"swm,imi(sp)"實(shí)現(xiàn),該指令即表示將返回地址存放到當(dāng)前函 數(shù)的偏移imi處,其中,"ra"表示寄存器ra存放返回地址,"sp"表示寄存 器sp存放函數(shù)棧指針,"imi"為立即數(shù)。又例如,對(duì)應(yīng)MIPS64架構(gòu),可以 使用返回地址存放指令"sdm,imi(sp)"實(shí)現(xiàn),該指令同樣表示將返回地址存 放到當(dāng)前函數(shù)的偏移imi處,其他含義相同。上述兩個(gè)步驟是根據(jù)函數(shù)調(diào)用原理必定存在的兩個(gè)動(dòng)作,對(duì)所有架構(gòu)的 CPU均適用,且不依賴于任何ABI規(guī)范。因?yàn)楫?dāng)前函數(shù)的函數(shù)棧指針sp通 過(guò)讀寄存器就可以獲得,因此,本發(fā)明的方法就是在上述兩個(gè)步驟的基礎(chǔ)上,通過(guò)掃描當(dāng)前函數(shù)(子函數(shù))的機(jī)器碼,解析構(gòu)建函數(shù)桟指令中的偏移offset, 計(jì)算出父函數(shù)的函數(shù)桟指針;以及解析返回地址存放指令中的偏移imi,計(jì) 算出返回地址在棧中的存放位置,從而得到當(dāng)前函數(shù)的返回地址。以此類推, 將該當(dāng)前函數(shù)的函數(shù)調(diào)用關(guān)系輸出出來(lái)。也就是說(shuō),如果是這個(gè)當(dāng)前函數(shù)出 現(xiàn)了故障,通過(guò)本發(fā)明的方法得出的函數(shù)調(diào)用關(guān)系,回溯出該當(dāng)前函數(shù)的調(diào) 用函數(shù),即可準(zhǔn)確定位故障,方便故障診斷。例如,假設(shè)函數(shù)A調(diào)用函數(shù)B,則函數(shù)A為父函數(shù)(調(diào)用函數(shù)),函數(shù) B為子函數(shù)(當(dāng)前函數(shù)),那么,掃描當(dāng)前函數(shù)B的機(jī)器碼,解析構(gòu)建函數(shù) 棧指令"addiusp,sp,-offset"中的偏移offs,計(jì)算出父函數(shù)A的函數(shù)棧指針 spA=spB + offset;另外,還要解析返回地址存放指令"sdm,imi(sp)"中的偏 移imi,計(jì)算出返回地址在函數(shù)棧中的存放位置,得到返回地址=* (unsigned * ) ( spB + imi)。下面以block—commit—write函數(shù)為例介紹本發(fā)明的函數(shù)回溯方法,本實(shí) 施方式就是要通過(guò)本發(fā)明的方法找到函數(shù)block—commit—write的調(diào)用關(guān)系。 假設(shè)函數(shù)block一comm、write的部分匯編指令如下 0022da30 <block—commit_write>:22da30:27bdfff8addiu sp,sp,-822da34:afb麵Osw ra,O(sp)22da38:00801821move vl,aO22da3c:8c820008lw v0,8(a0)22da40:00a04021move tO,al22da44:00c03821move a3,a222da48:8c440020lw a0,32(v0)22da4c:00602821move al,vl22da50:0c08b526jal 22d498 <_block—commit—write>22da54:01003021move a2,t022da58:00001021move vO,zero22da5c:8fbf0000lw ra,O(sp)22da60:03e00008jr m22da64:27bd0008addiu sp,sp,8其中,第--列表示的是指令存放的地址;第二列表示的是CPU可以識(shí)別的二進(jìn)制指令,也即機(jī)器碼,每條指令占用4個(gè)字節(jié);第三列表示的是與 第二列的機(jī)器碼一一對(duì)應(yīng)的匯編指令,該匯編指令就是人們所能看懂的指 令。假設(shè)系統(tǒng)在執(zhí)行block—commit_write函數(shù)中的指令8c440020時(shí)出現(xiàn)故 障,該指令對(duì)應(yīng)的反匯編代碼是"lw a0,32(v0)",對(duì)應(yīng)的PC等于0x22da48 (圖中下劃線位置),block—commit—write函數(shù)棧指針sp可以直接從寄存器 中讀取。根據(jù)本發(fā)明的方法,要找到該函數(shù)block—commit—write的調(diào)用關(guān)系, 需要做的就是從異常指令PC (即0x22da48)開(kāi)始向上掃描機(jī)器碼,找出構(gòu) 建函數(shù)棧的指令和存放返回地址的指令,掃描的終結(jié)點(diǎn)是該函數(shù)入口,也就 是該函數(shù)的第一條指令的地址,函數(shù)的入口地址可以從符號(hào)表中取得,對(duì)于 本實(shí)施方式的block—commit—write函數(shù)來(lái)說(shuō),如上述的匯編指令所示,函數(shù) 的入口地址為0x22da30,該實(shí)施方式是從PC=0x22da48處的機(jī)器指令開(kāi)始掃描。下面結(jié)合圖6所示的機(jī)器碼掃描流程圖對(duì)上述實(shí)施方式進(jìn)行詳細(xì)說(shuō)明, 如圖6所示,首先讀取上述地址的機(jī)器碼指令;然后判斷該指令是否為返回地址存放指令,如"swm,imi(sp)",如果是,則開(kāi)始解析該返回地址存放指 令,如果不是,則繼續(xù)判斷該指令是否為構(gòu)建函數(shù)棧指令,如"addiu sp,sp,-offset"。在本例中,PC二0x22da48對(duì)應(yīng)的指令"lwa0,32(v0)"顯然既 不是返回地址存放指令,也不是構(gòu)建函數(shù)棧指令,則繼續(xù)掃描下一條指令, 即PC-4對(duì)應(yīng)的指令,即PC二0x22da44,重復(fù)上述步驟,直到PC地址小于 該函數(shù)的入口地址0x22da30。當(dāng)掃描到PC=0x22da34時(shí),找到返回地址存 放指令"swra,O(sp)",解析出立即數(shù)imi二O,則從內(nèi)存位置sp+imi處取得 返回地址ret一addr = * (unsigned*) (sp + imi) =* (unsigned*) (sp + 0); 另外,當(dāng)掃描到PC=0x22da30時(shí),找到構(gòu)建函數(shù)棧指令"addiu sp,sp,-8", 解析出立即數(shù)0ffset=8,得到父函數(shù)的函數(shù)棧指針=子函數(shù)棧指針+ 8,也 即父函數(shù)棧指針father sp = sp+offset = sp+8。因?yàn)閞et—addr實(shí)際上就是父函數(shù)的一條指令的地址,而現(xiàn)在也知道了 父函數(shù)的桟指針fatherjp,所以根據(jù)本發(fā)明的方法,如圖6所示的流程圖就 可以回溯出父函數(shù)的父函數(shù),如此遞歸下去,整個(gè)的函數(shù)調(diào)用關(guān)系就可以回 溯出來(lái)了。如果是該函數(shù)block—commit—write執(zhí)行過(guò)程中出現(xiàn)了嚴(yán)重錯(cuò)誤,就可以 根據(jù)該函數(shù)回溯其調(diào)用函數(shù),找到故障所在,進(jìn)行故障診斷。以上所述是根據(jù)本發(fā)明的一個(gè)實(shí)施方式,而本發(fā)明的保護(hù)范圍不限于 此,例如判斷當(dāng)前掃描的機(jī)器碼的指令是否為返回地址存放指令與判斷當(dāng)前 掃描的機(jī)器碼的指令是否為構(gòu)建函數(shù)棧指令的步驟可以互換,不限定其先后 順序。如下所示的函數(shù)調(diào)用關(guān)系,就是根據(jù)本發(fā)明的方法,在某時(shí)刻從函數(shù) sys—touch_watchdog中回溯出來(lái)的整個(gè)函數(shù)棧,根據(jù)這個(gè)函數(shù)棧顯示的函數(shù)
調(diào)用關(guān)系,可以很準(zhǔn)確地定位故障,為故障診斷提供依據(jù)。MIPS Stack Trace:sy s一touch一watchdog—CE1 —tx—start—CE1 —intf—output—send_keepalive_p acket—outp_packet_process—netif_send—ip_output—iplocal—send—raw_ sendmsg—sock—sendmsg—sy s一sendmsg—sendmsg—ospf_packet—send—o spf_packet—write—ospf_hdlo_send—ospf_hello—timer—ospf一start一ospf一t hread—TCC一Task一She11— 〈end〉根據(jù)本發(fā)明的方法得到的調(diào)用函數(shù)的函數(shù)棧指針和返回地址,便可以將 當(dāng)前函數(shù)的調(diào)用關(guān)系輸出出來(lái),以便進(jìn)行故障定位和故障診斷。本發(fā)明的基于MIPS架構(gòu)CPU的異常點(diǎn)定位診斷方法極大提高了開(kāi)發(fā)效 率和診斷能力,下面分別從對(duì)軟件故障和硬件故障的定位各舉一例進(jìn)行說(shuō) 明。實(shí)施例一軟件故障定位該實(shí)施例是以發(fā)生在RSR50路由器上的一個(gè)軟件故障為例,其現(xiàn)象是RS R50路由器在烤機(jī)情況下偶爾拋出一個(gè)TLB異常TLB Invalid,也就是空指針 異常,根據(jù)本發(fā)明的方法,可以回溯出發(fā)生TLB異常時(shí)的整個(gè)函數(shù)調(diào)用路徑,如下所示Exception: TLB invalidEPC: 0x3EB71CTracing:一free_pages一一alloc—freejpages—kernel—mem—alloc—alloc一skb一pq2—fee—sync—rx—isr—cpm—sync—recv一data—pq2一cpm一sync—isr —irq_do_action_cpu —Interrupt一Process一Loop—0從上述可以看到函數(shù)的調(diào)用路徑和異常信息。分析可知是在中斷中進(jìn)行 內(nèi)存的動(dòng)態(tài)申請(qǐng),并最終在-freejages函數(shù)中執(zhí)行0x3EB71C處的指令時(shí)拋 出了該異常。按照上面的回溯信息,檢查—freejages函數(shù)存在如下一段代 碼<formula>formula see original document page 11</formula>其中,Current表示當(dāng)前線程,但是由于是在中斷上下文,所以current就 是NULL,可是個(gè)空指針,故代碼中current—flags就是操作了空指針導(dǎo)致了 TLB Invalid異常,故障得到了定位和診斷,再經(jīng)過(guò)修訂后,系統(tǒng)即可正常 工作。因?yàn)閏mrent在線程上下文中是不為NULL的,所以函數(shù)—freejages在線 程上下文中調(diào)用是不會(huì)有問(wèn)題的,由此可見(jiàn)如果沒(méi)有異常的精確定位,該問(wèn) 題是很難找到原因的。實(shí)施例二硬件故障定位該實(shí)施例是以發(fā)生在RSR50路由器上的一個(gè)硬件故障為例,其現(xiàn)象是機(jī) 器正常跑起后系統(tǒng)隔一段時(shí)間就拋出一個(gè)bus error的異常。根據(jù)本發(fā)明的方
法回溯出整個(gè)調(diào)用路徑如下Exception: Bus Error EPC: 0x7cD030 Tracing:sys_touch_v/atchdog—CEl—tx—start一 CE1 —intf—output一 send—keepalive_packet—outp jpacket_process—netif_send—ip—output—iplocal一send—raw—sendmsg—sock—sendmsg—sys—sendmsg一 sendmsg一 ospf_packet_send—ospf_packet_write—ospf_hello—send一 ospf—hello—timer—ospf一start—ospf—thread—TCC_Task_Shell
從上面的回溯信息可以看到,系統(tǒng)是在sys一touch—watchdog函數(shù)中的指 令0x7cD030拋了bus error異常,經(jīng)過(guò)檢查sysJouch—watchdog函數(shù),并沒(méi)有 發(fā)現(xiàn)軟件上存在什么漏洞,但是經(jīng)過(guò)反復(fù)的試驗(yàn)發(fā)現(xiàn)每次都會(huì)在
sys—touch—watohdog拋異常,所以初步判斷是硬件問(wèn)題,經(jīng)過(guò)硬件信號(hào)的檢 查是硬件CPLD存在問(wèn)題,導(dǎo)致每次執(zhí)行軟件喂狗操作的時(shí)候?qū)嶋H上操作了 一個(gè)沒(méi)有硬件影射的地址空間,而出現(xiàn)了問(wèn)題。綜上所述,通過(guò)本發(fā)明的基于MIPS架構(gòu)CPU的異常點(diǎn)定位診斷方法,避 開(kāi)了MIPS的ABI缺陷,通過(guò)掃描機(jī)器碼的方式,實(shí)現(xiàn)了函數(shù)回溯和故障的精 確定位。以上所述的具體實(shí)施方式
,對(duì)本發(fā)明的目的、技術(shù)方案和有益效果進(jìn)行 了進(jìn)一步詳細(xì)說(shuō)明,所應(yīng)理解的是,以上所述僅為本發(fā)明的具體實(shí)施方式
而 已,并不用于限定本發(fā)明的保護(hù)范圍,凡在本發(fā)明的精神和原則之內(nèi),所做 的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1、 一種基于MIPS架構(gòu)CPU的異常點(diǎn)定位診斷方法,其特征在于,該方法包括下列步驟掃描當(dāng)前函數(shù)的機(jī)器碼;解析構(gòu)建函數(shù)棧指令中的偏移,計(jì)算出調(diào)用函數(shù)的函數(shù)棧指針; 解析返回地址存放指令中的偏移,計(jì)算出返回地址在當(dāng)前函數(shù)的函數(shù)棧 中的存放位置,得到返回地址。
2、 根據(jù)權(quán)利要求1所述的方法,其特征在于,該方法還包括下列步驟 判斷所述機(jī)器碼對(duì)應(yīng)的指令是否為返回地址存放指令或構(gòu)建函數(shù)棧指令,如果不是,則掃描當(dāng)前函數(shù)的下一條機(jī)器碼,直到該當(dāng)前函數(shù)的入口。
3、 根據(jù)權(quán)利要求2所述的方法,其特征在于,如果為返回地址存放指 令,則解析返回地址存放指令中的偏移,計(jì)算出返回地址在當(dāng)前函數(shù)的函數(shù) 棧中的存放位置,得到返回地址,并掃描下一條機(jī)器碼以尋找構(gòu)建函數(shù)棧指令。
4、 根據(jù)權(quán)利要求2所述的方法,其特征在于,如果為構(gòu)建函數(shù)桟指令, 則解析構(gòu)建函數(shù)棧指令中的偏移,計(jì)算出調(diào)用函數(shù)的函數(shù)棧指針,并掃描下 一條機(jī)器碼以尋找返回地址存放指令。
5、 根據(jù)權(quán)利要求2所述的方法,其特征在于,所述下一條機(jī)器碼的指 令地址為所述機(jī)器碼的指令地址減4。
6、 根據(jù)權(quán)利要求1所述的方法,其特征在于,所述構(gòu)建函數(shù)棧指令為 "addiu sp,sp,-offset",則構(gòu)建函數(shù)棧指令中的偏移為offset;所述返回地址存放指令為"swra,imi(sp)"或"sd m,imi(sp)",則返回地址存放指令中的偏 移為imi。
7、 根據(jù)權(quán)利要求6所述的方法,其特征在于,所述調(diào)用函數(shù)的函數(shù)棧 指針=當(dāng)前函數(shù)的函數(shù)棧指針sp+offset。
8、 根據(jù)權(quán)利要求6所述的方法,其特征在于,所述返回地址二吖unsigned *)(當(dāng)前函數(shù)的函數(shù)棧指針sp + imi)。
全文摘要
本發(fā)明提供一種基于MIPS架構(gòu)CPU的異常點(diǎn)定位診斷方法,該方法包括下列步驟掃描當(dāng)前函數(shù)的機(jī)器碼;解析構(gòu)建函數(shù)棧指令中的偏移,計(jì)算出調(diào)用函數(shù)的函數(shù)棧指針;解析返回地址存放指令中的偏移,計(jì)算出返回地址在當(dāng)前函數(shù)的函數(shù)棧中的存放位置,得到返回地址。根據(jù)本發(fā)明的方法得到的調(diào)用函數(shù)的函數(shù)棧指針和返回地址,便可以將當(dāng)前函數(shù)的調(diào)用關(guān)系輸出出來(lái),以便進(jìn)行故障定位和故障診斷。
文檔編號(hào)G06F11/36GK101122881SQ20071012202
公開(kāi)日2008年2月13日 申請(qǐng)日期2007年9月20日 優(yōu)先權(quán)日2007年9月20日
發(fā)明者伍劍峰 申請(qǐng)人:福建星網(wǎng)銳捷網(wǎng)絡(luò)有限公司