專利名稱::一種Linux軟件在ARM芯片上的死機(jī)信息偵測方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及軟件
技術(shù)領(lǐng)域:
,特別是一種Linux軟件在ARM芯片上的死機(jī)信息偵測方法及系統(tǒng)。
背景技術(shù):
:目前,在ARM芯片上使用LINUX作為操作系統(tǒng)的產(chǎn)品越來越多。但是,對于LINUX上的多線程軟件,一般都是使用gcc編譯器,當(dāng)gcc編譯出來的軟件出現(xiàn)死機(jī)問題的測試調(diào)試手段尚缺乏有效的工具。目前定位死機(jī)問題主要是靠輸出的trace信息或者使用GDB來調(diào)試。而trace不能準(zhǔn)確及時(shí)得到死機(jī)前的調(diào)用棧,由于不知道什么時(shí)候死機(jī),因此需要打印很多信息,影響系統(tǒng)性能。而使用GDB來調(diào)試又依賴軟件編譯時(shí)打開選項(xiàng)支持,會影響軟件運(yùn)行速度,故此無法在真實(shí)運(yùn)行(即保障實(shí)時(shí)性條件)場景下進(jìn)行死機(jī)定位。而死機(jī)問題作為軟件穩(wěn)定性的重要問題,我們必須要有技術(shù)手段才能有效解決此問題。有鑒于此,我們有必要設(shè)計(jì)一種無需任何附加編譯選項(xiàng),對系統(tǒng)運(yùn)行性能無任何影響,即可實(shí)現(xiàn)真實(shí)場景下的死機(jī)定位的偵測方法及系統(tǒng)。
發(fā)明內(nèi)容本發(fā)明的主要目的在于解決現(xiàn)有技術(shù)中存在的問題,提供一種Linux軟件在ARM芯片上的死機(jī)信息偵測方法及系統(tǒng)。本發(fā)明的目的是通過下述技術(shù)方案予以實(shí)現(xiàn)的一種Linux軟件在ARM芯片上的死機(jī)信息偵測方法,其特征在于,包括檢測系統(tǒng)發(fā)生異常;獲取當(dāng)前函數(shù)的返回地址;判斷所獲取的返回地址是否在合理范圍之內(nèi);如果不在,則舍棄該函數(shù);如果在,則輸出該返回地址;跳轉(zhuǎn)至下一個(gè)函數(shù),并判斷該下一個(gè)函數(shù)是否合法;如果不合法,則結(jié)束偵測;如果合法,則返回所述獲取返回地址步驟。所述的合理范圍是從map里取得的[_executable_start,_etext]范圍。在所述輸出返回地址后,還設(shè)有返回地址解析步驟,具體包括根據(jù)內(nèi)建函數(shù)_builtin_frame_address查找與所輸出返回地址相對應(yīng)的函數(shù),并輸出該函數(shù)。在所述檢測系統(tǒng)發(fā)生異常步驟中,系統(tǒng)根據(jù)檢測到的SIGILL、SIGFPE、SIGSEGV、SIGALRM、SIGXCPU或SIGXFSZ非法指令,檢測系統(tǒng)所發(fā)生異常。一種Linux軟件在ARM芯片上的死機(jī)信息偵測系統(tǒng),其特征在于,包括異常檢測單元、返回地址獲取單元、返回地址判斷單元和函數(shù)跳轉(zhuǎn)單元;所述異常檢測單元,用于檢測系統(tǒng)發(fā)生異常;所述返回地址獲取單元,用于獲取當(dāng)前函數(shù)的返回地址;所述返回地址判斷單元,用于判斷所獲得的返回地址是否在合理范圍之內(nèi);如果不在,則舍棄該函數(shù);如果在,則輸出該返回地址;所述函數(shù)跳轉(zhuǎn)單元,用于跳轉(zhuǎn)至下一個(gè)函數(shù),并判斷該下一個(gè)函數(shù)是否合法;如果不合法,則結(jié)束偵測;如果合法,則將該下一個(gè)函數(shù)信息發(fā)送至返回地址獲取單元。所述的合理范圍是從map里取得的[—executable_start,—etext]范圍。還設(shè)有返回地址解析單元;所述返回地址解析單元,與返回地址判斷單元相連,用于根據(jù)內(nèi)建函數(shù)—builtin_frame_address查找與所輸出返回地址相對應(yīng)的函數(shù),并輸出該函數(shù)。所述異常檢測單元中,系統(tǒng)根據(jù)檢測到的SIGILL、SIGFPE,SIGSEGV,SIGALRM、SIGXCPU或SIGXFSZ非法指令,檢測系統(tǒng)所發(fā)生異常?!ねㄟ^本發(fā)明實(shí)施例,該死機(jī)信息偵測方法及系統(tǒng)是在系統(tǒng)發(fā)生異常后才開始對該軟件函數(shù)執(zhí)行順序進(jìn)行分析的,故此對系統(tǒng)運(yùn)行性能無任何影響,可實(shí)現(xiàn)真實(shí)場景下的死機(jī)定位。此處所說明的附圖用來提供對本發(fā)明的進(jìn)一步理解,構(gòu)成本申請的一部分,并不構(gòu)成對本發(fā)明的限定。在附圖中圖I為ARM芯片上執(zhí)行階段內(nèi)存分布示意圖;圖2為棧幀結(jié)構(gòu)示意圖;圖3為Linux軟件在ARM芯片上的死機(jī)信息偵測方法流程圖;圖4為Linux軟件在ARM芯片上的死機(jī)信息偵測系統(tǒng)結(jié)構(gòu)圖。具體實(shí)施例方式為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明白,下面結(jié)合實(shí)施方式和附圖,對本發(fā)明做進(jìn)一步詳細(xì)說明。在此,本發(fā)明的示意性實(shí)施方式及其說明用于解釋本發(fā)明,但并不作為對本發(fā)明的限定。在ARM芯片上,在執(zhí)行階段內(nèi)存分布一般是如下圖I所示。內(nèi)存分為堆棧區(qū)、堆區(qū)、BSS區(qū)、數(shù)據(jù)段區(qū)和代碼區(qū)五個(gè)部分。堆棧區(qū)(stack):在編譯和鏈接階段根據(jù)總內(nèi)存大小和各其它段的大小決定的;存放函數(shù)的參數(shù)值,局部變量的值,函數(shù)返回地址和一些寄存器的值等。操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧(LIF0),其分配可以向高地址增長也可以向低地址增長,一般都是向低地址增長。我們一般在ARM中都是向低地址增長表示棧申請了更多空間。堆區(qū)(heap):堆在鏈接階段確定大小,在運(yùn)行階段交給系統(tǒng)內(nèi)存管理。然后,由程序員通過標(biāo)準(zhǔn)接口分配(malloc,new)和釋放(free,delete)。BSS區(qū)(BlockStartedbySymbol)通常是指用來存放程序中未初始化的全局變量和靜態(tài)變量的一塊內(nèi)存區(qū)域。代碼中沒有初始化的全局變量都放在該區(qū),一般在boot階段自動清零。數(shù)據(jù)段區(qū)(data)用來存放可執(zhí)行文件中已初始化全局變量,也就是存放程序靜態(tài)分配的變量和全局變量。代碼區(qū)(text)用來存放代碼,該段為只讀。每個(gè)函數(shù)執(zhí)行,都會在堆棧區(qū)擁有自己專有的一個(gè)棧幀。棧幀的結(jié)構(gòu)如下圖2所示。如果某個(gè)函數(shù)調(diào)用到其他函數(shù),那將在ret下面把fp(framepointer,即函數(shù)堆棧信息指針)保存起來,同時(shí)將棧底指針下移。新函數(shù)馬上建立自己的棧幀,這時(shí)候下移的棧底指針作為了新的棧頂,棧底根據(jù)參數(shù)和局部變量等去移動。這樣,在程序運(yùn)行過程中,函數(shù)調(diào)用的關(guān)系將在棧中形成一系列連續(xù)的棧幀。每個(gè)棧幀的內(nèi)容可能不同,其起止為棧頂?shù)綏5?。而在ARM芯片上,由于內(nèi)建函數(shù)_1311;[11:;[11_;1^^1116_3(1(1代88返回且僅返回I級調(diào)用地址(即當(dāng)前的返回),因此我們可以利用這個(gè)地址去回溯所調(diào)用的相應(yīng)函數(shù)。本發(fā)明正是利用了這一點(diǎn)設(shè)計(jì)了一種Linux軟件在ARM芯片上的死機(jī)信息偵測方法及系統(tǒng)圖3為本發(fā)明Linux軟件在ARM芯片上的死機(jī)信息偵測方法流程圖。如圖所示,該Linux軟件在ARM芯片上的死機(jī)信息偵測方法,包括101:檢測系統(tǒng)發(fā)生異常。102:獲取當(dāng)前函數(shù)的返回地址。該返回地址也就是前述內(nèi)建函數(shù)_builtin_frame_address返回的I級調(diào)用地址。103:判斷所獲取的返回地址是否在合理范圍之內(nèi)?如果不在,則舍棄該函數(shù);如果在,則輸出該返回地址。這里,所述的合理范圍為代碼執(zhí)行地址范圍。具體地,是從map(即編譯器在鏈接階段產(chǎn)生的內(nèi)存映射文件)里取得的[—executable_start,—etext]范圍。這里,—executable_start、—etext是從map文件中的兩個(gè)地址值。合理范圍即大于_executablestart并同時(shí)小于—etext的地址范圍。如果返回地址在該合理范圍內(nèi),則說明該返回地址所對應(yīng)的函數(shù)為執(zhí)行函數(shù);如果返回地址不在該合理范圍內(nèi),則說明該返回地址是運(yùn)行地址,并非執(zhí)行函數(shù)返回地址,因此需要過濾掉。104:跳轉(zhuǎn)至下一個(gè)函數(shù),并判斷該下一個(gè)函數(shù)是否合法?如果不合法,則結(jié)束偵測;如果合法,則返回步驟102。本發(fā)明所設(shè)計(jì)的死機(jī)信息偵測方法,在檢測到系統(tǒng)發(fā)生異常后,通過回溯遞推輸出執(zhí)行函數(shù)的返回地址,并依賴執(zhí)行函數(shù)與返回地址之間的一一對應(yīng)關(guān)系,則可輸出該軟件函數(shù)執(zhí)行順序的記錄,以供分析人員分析對該軟件死機(jī)進(jìn)行定位。該死機(jī)信息偵測方法是在系統(tǒng)發(fā)生異常后才開始對該軟件函數(shù)執(zhí)行順序進(jìn)行分析的,在軟件運(yùn)行過程中并不會如GDB需要打開選項(xiàng)支持,故此對系統(tǒng)運(yùn)行性能無任何影響,可實(shí)現(xiàn)真實(shí)場景下的死機(jī)定位。本發(fā)明在所述步驟103輸出返回地址后,還設(shè)有返回地址解析步驟,具體包括根據(jù)內(nèi)建函數(shù)—builtin_frame_address查找與所輸出返回地址相對應(yīng)的函數(shù),并輸出該函數(shù)。通過該步驟可以在系統(tǒng)內(nèi)自動完成對返回地址所對應(yīng)函數(shù)的解析,從而直接輸出相對應(yīng)函數(shù),以方便分析人員進(jìn)行死機(jī)定位。另外,所述步驟101檢測系統(tǒng)發(fā)生異常中,可以根據(jù)需要自己控制在不同場合下去捕獲并查看調(diào)用棧。具體來說,本實(shí)施例提供根據(jù)系統(tǒng)檢測到的SIGILL、SIGFPE、SIGSEGV、SIGALRM、SIGXCPU或SIGXFSZ非法指令,檢測系統(tǒng)所發(fā)生異常。并根據(jù)所檢測到的系統(tǒng)異常啟動本發(fā)明Linux軟件在ARM芯片上的死機(jī)信息偵測方法。圖4為本發(fā)明Linux軟件在ARM芯片上的死機(jī)信息偵測系統(tǒng)結(jié)構(gòu)圖。如圖所示,該Linux軟件在ARM芯片上的死機(jī)信息偵測系統(tǒng),包括異常檢測單元、返回地址獲取單元、返回地址判斷單元和函數(shù)跳轉(zhuǎn)單元。所述異常檢測單元,用于檢測系統(tǒng)發(fā)生異常。所述返回地址獲取單元,用于獲取當(dāng)前函數(shù)的返回地址。該返回地址也就是前述內(nèi)建函數(shù)_builtin_frame_address返回的I級調(diào)用地址。所述返回地址判斷單元,用于判斷所獲得的返回地址是否在合理范圍之內(nèi)?如果不在,則舍棄該函數(shù);如果在,則輸出該返回地址。這里,所述的合理范圍為代碼執(zhí)行地址范圍。具體地,是從map里取得的[―executable_start,—etext]范圍。如果返回地址在該合理范圍內(nèi),貝U說明該返回地址所對應(yīng)的函數(shù)為執(zhí)行函數(shù);如果返回地址不在該合理范圍內(nèi),則說明該返回地址是運(yùn)行地址,并非執(zhí)行函數(shù)返回地址,因此需要過濾掉。所述函數(shù)跳轉(zhuǎn)單元,用于跳轉(zhuǎn)至下一個(gè)函數(shù),并判斷該下一個(gè)函數(shù)是否合法?如果不合法,則結(jié)束偵測;如果合法,則將該下一個(gè)函數(shù)信息發(fā)送至返回地址獲取單元。如圖4所示,本發(fā)明死機(jī)信息偵測系統(tǒng)中還設(shè)有返回地址解析單元。所述返回地址解析單元,與返回地址判斷單元相連,用于根據(jù)內(nèi)建函數(shù)—builtin_frame_address查找與所輸出返回地址相對應(yīng)的函數(shù),并輸出該函數(shù)。通過該返回地址解析單元可以在系統(tǒng)內(nèi)自動完成對返回地址所對應(yīng)函數(shù)的解析,從而直接輸出相對應(yīng)函數(shù),以方便分析人員進(jìn)行死機(jī)定位。另外,所述異常檢測單元中,可以根據(jù)需要自己控制在不同場合下去捕獲并查看調(diào)用棧。具體來說,本實(shí)施例提供根據(jù)系統(tǒng)檢測到的SIGILL、SIGFPE、SIGSEGV、SIGALRM、SIGXCPU或SIGXFSZ非法指令,檢測系統(tǒng)所發(fā)生異常。并根據(jù)所檢測到的系統(tǒng)異常啟動本發(fā)明Linux軟件在ARM芯片上的死機(jī)信息偵測方法。綜上所述,本發(fā)明提供了一種Linux軟件在ARM芯片上的死機(jī)信息偵測方法及系統(tǒng)。該死機(jī)信息偵測方法及系統(tǒng)通過回溯遞推輸出執(zhí)行函數(shù)的返回地址,并依賴執(zhí)行函數(shù)與返回地址之間的一一對應(yīng)關(guān)系,則可輸出該軟件函數(shù)執(zhí)行順序的記錄,以供分析人員分析對該軟件死機(jī)進(jìn)行定位。該死機(jī)信息偵測方法及系統(tǒng)是在系統(tǒng)發(fā)生異常后才開始對該軟件函數(shù)執(zhí)行順序進(jìn)行分析的,在軟件運(yùn)行過程中并不會如GDB需要打開選項(xiàng)支持,故此對系統(tǒng)運(yùn)行性能無任何影響,可實(shí)現(xiàn)真實(shí)場景下的死機(jī)定位。本領(lǐng)域技術(shù)人員在此設(shè)計(jì)思想之下所做任何不具有創(chuàng)造性的改造,均應(yīng)視為在本發(fā)明的保護(hù)范圍之內(nèi)。權(quán)利要求1.一種Linux軟件在ARM芯片上的死機(jī)信息偵測方法,其特征在于,包括檢測系統(tǒng)發(fā)生異常;獲取當(dāng)前函數(shù)的返回地址;判斷所獲取的返回地址是否在合理范圍之內(nèi);如果不在,則舍棄該函數(shù);如果在,則輸出該返回地址;跳轉(zhuǎn)至下一個(gè)函數(shù),并判斷該下一個(gè)函數(shù)是否合法;如果不合法,則結(jié)束偵測;如果合法,則返回所述獲取返回地址步驟。2.如權(quán)利要求I所述的Linux軟件在ARM芯片上的死機(jī)信息偵測方法,其特征在于所述的合理范圍是從map里取得的[—executable_start,—etext]范圍。3.如權(quán)利要求I所述的Linux軟件在ARM芯片上的死機(jī)信息偵測方法,其特征在于在所述輸出返回地址后,還設(shè)有返回地址解析步驟,具體包括根據(jù)內(nèi)建函數(shù)—builtin_frame_address查找與所輸出返回地址相對應(yīng)的函數(shù),并輸出該函數(shù)。4.如權(quán)利要求I所述的Linux軟件在ARM芯片上的死機(jī)信息偵測方法,其特征在于在所述檢測系統(tǒng)發(fā)生異常步驟中,系統(tǒng)根據(jù)檢測到的SIGILL、SIGFPE、SIGSEGV、SIGALRM、SIGXCPU或SIGXFSZ非法指令,檢測系統(tǒng)所發(fā)生異常。5.一種Linux軟件在ARM芯片上的死機(jī)信息偵測系統(tǒng),其特征在于,包括異常檢測單v元、返回地址獲取單元、返回地址判斷單元和函數(shù)跳轉(zhuǎn)單元;所述異常檢測單元,用于檢測系統(tǒng)發(fā)生異常;所述返回地址獲取單元,用于獲取當(dāng)前函數(shù)的返回地址;所述返回地址判斷單元,用于判斷所獲得的返回地址是否在合理范圍之內(nèi);如果不在,則舍棄該函數(shù);如果在,則輸出該返回地址;所述函數(shù)跳轉(zhuǎn)單元,用于跳轉(zhuǎn)至下一個(gè)函數(shù),并判斷該下一個(gè)函數(shù)是否合法;如果不合法,則結(jié)束偵測;如果合法,則將該下一個(gè)函數(shù)信息發(fā)送至返回地址獲取單元。6.如權(quán)利要求5所述的Linux軟件在ARM芯片上的死機(jī)信息偵測系統(tǒng),其特征在于所述的合理范圍是從map里取得的[_executable_start,_etext]范圍。7.如權(quán)利要求5所述的Linux軟件在ARM芯片上的死機(jī)信息偵測系統(tǒng),其特征在于還設(shè)有返回地址解析單元;所述返回地址解析單元,與返回地址判斷單元相連,用于根據(jù)內(nèi)建函數(shù)—builtin_frame_address查找與所輸出返回地址相對應(yīng)的函數(shù),并輸出該函數(shù)。8.如權(quán)利要求5所述的Linux軟件在ARM芯片上的死機(jī)信息偵測系統(tǒng),其特征在于所述異常檢測單元中,系統(tǒng)根據(jù)檢測到的SIGILL、SIGFPE,SIGSEGV,SIGALRM、SIGXCPU或SIGXFSZ非法指令,檢測系統(tǒng)所發(fā)生異常。全文摘要本發(fā)明提供了一種Linux軟件在ARM芯片上的死機(jī)信息偵測方法及系統(tǒng),包括檢測系統(tǒng)發(fā)生異常;獲取當(dāng)前函數(shù)的返回地址;判斷所獲取的返回地址是否在合理范圍之內(nèi);如果不在,則舍棄該函數(shù);如果在,則輸出該返回地址;跳轉(zhuǎn)至下一個(gè)函數(shù),并判斷該下一個(gè)函數(shù)是否合法;如果不合法,則結(jié)束偵測;如果合法,則返回所述獲取返回地址步驟。該死機(jī)信息偵測方法及系統(tǒng)是在系統(tǒng)發(fā)生異常后才開始對該軟件函數(shù)執(zhí)行順序進(jìn)行分析的,故此對系統(tǒng)運(yùn)行性能無任何影響,可實(shí)現(xiàn)真實(shí)場景下的死機(jī)定位。文檔編號G06F11/30GK102880538SQ201210369270公開日2013年1月16日申請日期2012年9月27日優(yōu)先權(quán)日2012年9月27日發(fā)明者劉建軍申請人:邦訊技術(shù)股份有限公司