MIPS系統(tǒng)異?,F(xiàn)場(chǎng)分析工具的設(shè)計(jì)與實(shí)現(xiàn)
MIPS是一款RISC體系結(jié)構(gòu)的中央處理器,在嵌入式應(yīng)用的場(chǎng)合,和ARM一樣,MIPS核作為IP授權(quán)給各集成電路設(shè)計(jì)廠商根據(jù)自己的特定應(yīng)用生產(chǎn)專用的SOC(single on chip)解決方案。
本文引用地址:http://m.butianyuan.cn/article/201609/304029.htm為節(jié)省成本,很多嵌入MIPS的SOC實(shí)現(xiàn),省掉了MIPS的J—TAG支持;或者應(yīng)用MIPS核的系統(tǒng),在形成產(chǎn)品應(yīng)用到實(shí)際環(huán)境時(shí),才出現(xiàn)死機(jī)等異常情況。無論哪種情況,都使得要解決遇到的死機(jī)問題變得非常困難。
1 異常處理機(jī)制
任何一個(gè)CPU都要提供一個(gè)詳細(xì)的異常和中斷處理機(jī)制。一個(gè)軟件系統(tǒng),如操作系統(tǒng),就是一個(gè)時(shí)序邏輯系統(tǒng),通過時(shí)鐘,外部事件來驅(qū)動(dòng)整個(gè)預(yù)先定義好的邏輯行為。本文通過設(shè)計(jì)工具載入異常內(nèi)存數(shù)據(jù)(dump),然后進(jìn)行反匯編,得到系統(tǒng)發(fā)生異常情況,定位異常所在位置及引起異常的調(diào)用堆棧,反序列出函數(shù)調(diào)用清單。
2 工具設(shè)計(jì)與實(shí)現(xiàn)
2.1 設(shè)計(jì)思路及流程
產(chǎn)品軟件在工作中,引起死機(jī)的原因,一般是非法指令或指令訪問了非法地址。而這類非法訪問,在支持虛擬地址的CPU體系中,都會(huì)引起系統(tǒng)的指令異常,從而進(jìn)入異常服務(wù)程序。該工具根據(jù)異常的堆棧數(shù)據(jù),配合整個(gè)程序空間的指令,列出引起死機(jī)問題的有效指令(引起異常的指令地址和函數(shù)調(diào)用返回的地址)的調(diào)用序列。從而避免到處懷疑代碼,加入各種觀察代碼勞心費(fèi)力的抓取死機(jī)現(xiàn)象來解決問題這種低效的方式。該工具對(duì)其他的硬件原因引起的死機(jī)問題,不在分析之列。流程圖如圖1。
2.2 設(shè)計(jì)準(zhǔn)備
1)在發(fā)布系統(tǒng)程序前,確保系統(tǒng)中異常服務(wù)程序,處于活動(dòng)狀態(tài);異常服務(wù)程序中,對(duì)于數(shù)據(jù)和指令引起的異常,要輸出(dump)引起異常任務(wù)當(dāng)時(shí)的堆棧數(shù)據(jù)。
2)發(fā)布系統(tǒng)程序時(shí),保留源碼和系統(tǒng)對(duì)應(yīng)的反匯編代碼備用。
3)在系統(tǒng)運(yùn)行過程中,保持對(duì)系統(tǒng)串口的接收就緒狀態(tài),一旦系統(tǒng)發(fā)生異常引起死機(jī),將接收的數(shù)據(jù)保存到文件(即所指的serial.log文件)。
2.3 反匯編解析
1)復(fù)制腳本文件disassemble.sh到y(tǒng)gwinsrcgnutoolsmipsisa32-elfbin目錄下。
2)打開Cygwin,在命令行運(yùn)行disassemble.shOBERON.elf,生成OBERON.elf.lst文件。如圖2。
3)運(yùn)行MStarAnaWexe軟件,在反匯編文件欄添加OBERONelf.list文件,在輸出記錄欄添加serial.log文件,如圖3。
4)添加serial.log文件之后系統(tǒng)自動(dòng)切換到檢查堆棧信息界面,如圖4。
2.4 堆棧分析
1)一般情況下,本工具自動(dòng)完成結(jié)果,在屏幕上依次顯示堆棧調(diào)用情況,前面的是被調(diào)用函數(shù),后面的是調(diào)用者。
2)在分析過程中,可能會(huì)需要使用者輸入兩個(gè)參數(shù),這時(shí)需要使用這根據(jù)輸出結(jié)果分析匯編代碼,輸入正確的值這兩個(gè)值一個(gè)是匯編函數(shù)的返回地址所在的對(duì)邊偏移,一個(gè)是本函數(shù)的堆棧使用情況。返回地址要查看兩個(gè)相關(guān)的匯編代碼,“jr ra”即為函數(shù)返回指令,與之相關(guān)的另一條指令為“swra,xx(sp)”,“lw ra,xx(sp)”,前者是將ra寄存器的值保存到以sp為基址偏移為xx的堆棧中,后者從以sp為基址偏移xx的堆棧中取得數(shù)據(jù)載入ra寄存器。因此只需要從其中任意一個(gè)指令都能得到返回地址在堆棧中的偏移當(dāng)一個(gè)函數(shù)中有兩個(gè)以上的單向改變sp內(nèi)容的指令出現(xiàn)以后,本工具就無法推算出正確的函數(shù)占用堆棧情況了,此時(shí)需要使用者閱讀匯編代碼,輸入正確的值。一般這類指令為
“addi sp,sp,-xx”,“addiu sp,sp,-xx”,“addiu sp,reg,mm”,只要sp跟在指令后面,那就有可能是改變了堆?;羔?。然后根據(jù)從函數(shù)開始到調(diào)用(屏幕上)上一個(gè)函數(shù)出現(xiàn)的位置,將其偏移值累加,相應(yīng)的,“sw ra,xx(sp)”后面出現(xiàn)的sp變化值也要累加到返回值偏移上去。
3)就圖3而言,在堆棧指針偏移欄中輸入40,在返回地址基于堆棧指針的偏移欄中輸入32,然后確定,就會(huì)自動(dòng)跳轉(zhuǎn)到如圖5。
4)同樣在相應(yīng)的選項(xiàng)中輸入對(duì)應(yīng)的指針偏移量之后,確定。得到如圖6。
5)堆棧分析完成,死機(jī)的情況是由于圖5中的5個(gè)函數(shù)(最后倆個(gè)去除)引起。
6)可拷貝函數(shù)之前的地址(如:_Zapper_Signal函數(shù)的地址是80041e98)到OBERON.elf.lst文件查找對(duì)應(yīng)的匯編運(yùn)行代碼,如圖7。
7)依以上步驟查看導(dǎo)致錯(cuò)誤的匯編代碼或者在工程文件中對(duì)應(yīng)函數(shù)加入調(diào)試,查看代碼中存在那些錯(cuò)誤。
3 結(jié)束語
正確快速查找出現(xiàn)的異常并能快速分析解決軟件健壯性和穩(wěn)定性的關(guān)鍵問題,該工具在滿足以上條件的同時(shí),實(shí)現(xiàn)如MIPS指令模擬器、MIPS斷點(diǎn)調(diào)試等功能的擴(kuò)展,具有比較強(qiáng)的推廣性。
評(píng)論