專利名稱:嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及嵌入式系統(tǒng)中進(jìn)程的異常處理方法,特別涉及到異常進(jìn)程的異常信息處理, 提取的方法。
背景技術(shù):
在高端嵌入式系統(tǒng)如PDA,智能手機(jī)中,要求提供諸如文字處理,GUI界面,媒體播放器 等復(fù)雜應(yīng)用,并且用戶可以自行安裝和卸載新的程序,比如游戲、工具等等。在傳統(tǒng)的嵌入 式操作系統(tǒng)已經(jīng)不能夠滿足需要了。因此,在高端嵌入式系統(tǒng)都采用如Unux操作系統(tǒng),Whi(:li 操作系統(tǒng)這些更復(fù)雜的操作系統(tǒng)。,傳統(tǒng)的嵌入式操作系統(tǒng)相比,這些操作系統(tǒng)具有以F特點(diǎn)
1、 內(nèi)核運(yùn)行空間和用戶程序運(yùn)行空間分丌,使得用戶進(jìn)程的錯(cuò)誤不會(huì)造成整個(gè)系統(tǒng)的崩潰,提高了系統(tǒng)運(yùn)行的穩(wěn)定性
2、 不同的用戶進(jìn)程運(yùn)行在不同的地址空間,使得^個(gè)用戶程序的錯(cuò)誤不會(huì)影響到其他用 戶程序的運(yùn)行,提高了系統(tǒng)運(yùn)行的穩(wěn)定性;
3、 提供了虛擬地址和物理地址映射的管理,使得系統(tǒng)的內(nèi)存訪問(wèn)更加安全;
4、 提供復(fù)雜的文件系統(tǒng)支持,提供應(yīng)用程序和運(yùn)行庫(kù)動(dòng)態(tài)鏈接的能力,運(yùn)行庫(kù)和應(yīng)用程 序分開(kāi),從而使得系統(tǒng)具備了無(wú)限升級(jí)的能力。與傳統(tǒng)嵌入式系統(tǒng)-- 樣,高端嵌入式系統(tǒng)中應(yīng)用程序的丌發(fā)和調(diào)試也采用交義開(kāi)發(fā)模式, 應(yīng)用程序的編輯、編譯都在開(kāi)發(fā)主機(jī)上,在程序編譯完成后,生成的可執(zhí)行文件會(huì)被下載到 嵌入式系統(tǒng)中運(yùn)行,嵌入式系統(tǒng)上會(huì)同時(shí)運(yùn)行交叉調(diào)試代理,開(kāi)發(fā)主機(jī)h的調(diào)試器通過(guò)和嵌 入式系統(tǒng)上的調(diào)試代理通信來(lái)控制應(yīng)用程序的啟動(dòng)、運(yùn)行和停止。在用戶進(jìn)程發(fā)生異常時(shí), 常使用異常跟蹤工具來(lái)跟蹤和分析異常用戶程序在發(fā)生異常時(shí),操作系統(tǒng)內(nèi)核運(yùn)行一般是 會(huì)正常工作的,內(nèi)核可以把用戶程序發(fā)生異常的相關(guān)信息保存為文件,利用這些異常信息文 件,再結(jié)合用戶程序的調(diào)試版本文件,利用異常跟蹤工具(如GDB調(diào)試器的異常文件調(diào)試功 能等)就可以對(duì)發(fā)生異常的代碼進(jìn)行錯(cuò)誤定位。使用異常跟蹤工具,可以直接定位到發(fā)生異 常的函數(shù)源代碼,得到異常發(fā)生的堆棧調(diào)用順序,異常發(fā)生時(shí)的變量值。因此在用戶程序的 開(kāi)發(fā)階段非常有用。但是,這類工具有如下缺點(diǎn)
1、這些工具要求保存用戶程序?qū)?yīng)的調(diào)試版本,否則就不能定位到異常發(fā)生的源代碼, 也不能夠得到異常發(fā)生的堆棧調(diào)用順序,因此,使用比較麻煩,尤其是在產(chǎn)品已經(jīng)發(fā)布的情 況下,用戶程序發(fā)生的異常就很難使用這種方法; 2、 應(yīng)用程序和運(yùn)行庫(kù)是動(dòng)態(tài)鏈接的,如果異常跟蹤工具庫(kù)的配置和程序運(yùn)行時(shí)的庫(kù)配置 不一樣,也會(huì)造成無(wú)法定位異常,或錯(cuò)誤定位的情況; 3、 這類工具都要使用操作系統(tǒng)在內(nèi)核異常時(shí)保存的異常信息文件,而操作系統(tǒng)內(nèi)核保存 的異常文件是發(fā)生用戶程序異常時(shí)對(duì)用戶程序進(jìn)程的內(nèi)存空間的拷貝,用戶程序使用的內(nèi)存 空間越大,則保存的文件也就越大,因此,操作系統(tǒng)內(nèi)核在保存異常文件時(shí)都有 一個(gè)火小的 門限,超過(guò)門限的文件將無(wú)法保存,在開(kāi)發(fā)階段,嵌入式系統(tǒng)可以通過(guò)網(wǎng)絡(luò)使用幵發(fā)主機(jī).匕 的存儲(chǔ)資源,這個(gè)門限可以設(shè)置相對(duì)較大,方便調(diào)試,但在產(chǎn)品發(fā)布后,這個(gè)門限必須設(shè)置得 相對(duì)較小,以避免影響產(chǎn)品的功能。由于異常文件的大小不定,會(huì)出現(xiàn)用戶進(jìn)程異常不能保 存的情況,給異常跟蹤帶來(lái)不便。在傳統(tǒng)的實(shí)時(shí)嵌入式操作系統(tǒng)中也有針對(duì)程序執(zhí)行異常的分析工具,比如在VxWorks操作 系統(tǒng)中使用tt(任務(wù)跟蹤)工具。對(duì)于高端嵌入式操作系統(tǒng)來(lái)說(shuō),這類工具有如下缺點(diǎn)1、 首先,它們只能使用在物理地址空間運(yùn)行的情況下,不能使用在高端嵌入式操作系統(tǒng) 中虛實(shí)地址空間分JT-的情況下使用;2、 其次,它們只能使用在應(yīng)用程序與運(yùn)行庫(kù)做靜態(tài)鏈接的情況下,不適用于高端嵌入式 操作系統(tǒng)中使用動(dòng)態(tài)鏈接庫(kù)的情況;3、 最后,它們同樣要求應(yīng)用程序必須是調(diào)試版本,在編譯時(shí)必須帶有調(diào)試信息,否則就 不能解析出函數(shù)名字。發(fā)明內(nèi)容針對(duì)現(xiàn)有技術(shù)存在的缺陷和不足,本發(fā)明提供一種嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法。為達(dá)到上述目的,本發(fā)明采用以下技術(shù)方案本發(fā)明嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的 方法,包括如下步驟步驟A,當(dāng)進(jìn)程發(fā)生異常時(shí),獲取發(fā)生異常的用戶進(jìn)程的寄存器值和相關(guān)信息;步驟B,根據(jù)所述寄存器值,使用堆?;厮莸姆椒ㄕ业接脩暨M(jìn)程發(fā)生異常時(shí)函數(shù)的地址, 以及調(diào)用該函數(shù)的函數(shù)序列;歩驟C,使用動(dòng)態(tài)鏈接函數(shù)符號(hào)査找方法,根據(jù)歩驟B得到的函數(shù)地址,在相應(yīng)文件的 符號(hào)表查找出函數(shù)的符號(hào);
歩驟D,將歩驟A、 B、 C得到的結(jié)果保存到異常信息文件中。優(yōu)選的在所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法中,歩驟A具體為步驟A1,獲取發(fā)生異常的用戶進(jìn)程的寄存器值,主要有程序計(jì)數(shù)寄存器值,堆棧幀寄存器值,堆棧寄存器值,程序狀態(tài)寄存器值;歩驟A2,獲取發(fā)生異常進(jìn)程的相關(guān)信息,主要有進(jìn)程的任務(wù)名字,進(jìn)程標(biāo)識(shí)編兮、進(jìn)程的堆??臻g范圍、進(jìn)程的代碼空間范圍、進(jìn)程全局變量的空間范圍,進(jìn)程動(dòng)態(tài)分配的地址空間范圍。優(yōu)選的在所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法中,步驟B具體為 歩驟B1,根據(jù)步驟Ai獲取的堆棧幀寄存器值找到堆棧幀,從堆棧幀找到本函數(shù)的返回 地址;歩驟B2,判斷該返回地址是否是在本進(jìn)程內(nèi)存執(zhí)行空間內(nèi)的有效的可執(zhí)行地址;步驟B3,如果是,以該返回地址為起點(diǎn),向有效程序空間的低端搜索,搜索調(diào)用本函數(shù)的調(diào)用指令及其地址。優(yōu)選的在所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法中,步驟C具體為步驟CL,根據(jù)調(diào)用指令中的偏移地址,加上調(diào)用指令本身的地址,得到在調(diào)用本函數(shù)時(shí) 的跳轉(zhuǎn)地址;步驟C2,判斷該跳轉(zhuǎn)地址是直接跳轉(zhuǎn)還是間接動(dòng)態(tài)跳轉(zhuǎn)步驟C3,如果是直接跳轉(zhuǎn),就直接在本執(zhí)行文件中搜索函數(shù)的符號(hào);步驟C4,如果是間接動(dòng)態(tài)跳轉(zhuǎn),則查找對(duì)應(yīng)于該間接跳轉(zhuǎn)地址的實(shí)際跳轉(zhuǎn)地址-步驟C5,査找對(duì)應(yīng)該實(shí)際跳轉(zhuǎn)地址的函數(shù)名宇;歩驟C6、將搜索到函數(shù)名字、函數(shù)地址、文件名字一起保存步驟C7,根據(jù)保存的堆棧幀寄存器值找到堆棧幀,從堆棧幀得到上層函數(shù)的堆棧幀地址, 更新保存的堆棧幀寄存器值;步驟C8,使用保存的堆棧幀寄存器值,判斷該堆棧幀寄存器值是否在進(jìn)程的堆桟空間范 圍內(nèi),同時(shí)判斷搜索深度是否超過(guò)了最大限制,如果堆棧幀寄存器值有效,搜索深度也沒(méi)有 越界,則跳轉(zhuǎn)到歩驟B繼續(xù)運(yùn)行,否則,跳到步驟D。優(yōu)選的在所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法中,步驟C4具休為步驟C41,使用該間接動(dòng)態(tài)跳轉(zhuǎn)地址和操作系統(tǒng)提供的系統(tǒng)調(diào)用,找到該地址所屬的可 執(zhí)行文件,以及該文件在操作系統(tǒng)進(jìn)程中的虛擬地址區(qū)域,從虛擬地址區(qū)域得到改文件在進(jìn) 程內(nèi)存空間中的映射偏移地址歩驟C42,使用映射偏移地址和可執(zhí)行文件,得到該文件在進(jìn)程內(nèi)存空間中進(jìn)程鏈接表 的入口地址;步驟C43,利用入口地址判斷輸入地址是否在進(jìn)程鏈接表中;如果不是,則輸入地址為直接跳轉(zhuǎn)的實(shí)際跳轉(zhuǎn)地址,直接返回該地址,如果是,說(shuō)明輸入地址是間接跳轉(zhuǎn)的;歩驟C44,利用輸入地址和進(jìn)程鏈接表表項(xiàng)的結(jié)構(gòu)就可以得到由動(dòng)態(tài)鏈接器放置在進(jìn)程鏈接表表項(xiàng)中的實(shí)際跳轉(zhuǎn)地址,返回該實(shí)際跳轉(zhuǎn)地址。優(yōu)選的在所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法中,步驟C5具體為 步驟(:51,使用跳轉(zhuǎn)指令和該指令的地址,得到該指令執(zhí)行后的程序跳轉(zhuǎn)地址; 步驟C52,判斷該地址是否是有效的可執(zhí)行地址,如果不是,退出處理,返回失敗 步驟C53,如果是,以該地址為起點(diǎn),向有效程序空間的低端搜索,搜索調(diào)用本函數(shù)的跳轉(zhuǎn)指令及實(shí)際跳轉(zhuǎn)地址,即被調(diào)用函數(shù)的入口地址;步驟C54,如果實(shí)際跳轉(zhuǎn)地址是直接跳轉(zhuǎn)的靜態(tài)鏈接地址,則在當(dāng)前^執(zhí)行文件的符號(hào)表中搜索對(duì)應(yīng)地址的函數(shù)名宇,在符號(hào)表不存在的情況F,則直接返回地址和為零的函數(shù)名字,否則返回函數(shù)地址和在符號(hào)表中搜索到的函數(shù)名字;步驟C55,如果實(shí)際跳轉(zhuǎn)地址是間接跳轉(zhuǎn)的動(dòng)態(tài)鏈接地址,則找到實(shí)際跳轉(zhuǎn)地址所在的可執(zhí)行文件,然后在改可執(zhí)行文件的動(dòng)態(tài)符號(hào)表屮査找與跳轉(zhuǎn)地址對(duì)應(yīng)的函數(shù)名字; 步驟C56,返回搜索到的函數(shù)地址,函數(shù)名宇。優(yōu)選的在所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法中,步驟B3、 g休為 步驟L,設(shè)定最大循環(huán)搜尋次數(shù),以返回地址為起始搜索地址,開(kāi)始循環(huán)査找;步驟2,將搜索地址減去 一個(gè)指令長(zhǎng)度,判斷新的指令地址是否是有效的可執(zhí)行的地址;步驟3,如果是,取出新地址處的指令,判斷該指令是否是改變了程序計(jì)數(shù)器值的指令; 歩驟l,如果是,則跳出循環(huán),退出處理,返回搜索成功和搜索結(jié)果 步驟5,如果不是,將搜索次數(shù)加l,跳到歩驟2開(kāi)始繼續(xù)搜索。優(yōu)選的在所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法中,在步驟B2、歩驟B32、步 驟C53中判斷地址是否是有效的可執(zhí)行地址的歩驟為步驟1,輸入函數(shù)的地址到操作系統(tǒng)內(nèi)核提供的系統(tǒng)調(diào)用中,得出該地址是否在當(dāng)前進(jìn) 程的 一個(gè)虛擬地址空間區(qū)域內(nèi);步驟2,如果是,判斷該地址所屬于的虛擬地址空間區(qū)域的屬性是否是可執(zhí)行的如果 是,就說(shuō)明該函數(shù)的地址是有效的程序地址。優(yōu)選的在所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法中,步驟D還包括給所述異 常信息文件命名;命名方式有1、保存時(shí)間一進(jìn)程名字--進(jìn)程編號(hào),2、保存時(shí)間一進(jìn)程編 號(hào)一進(jìn)程名字,3、保存時(shí)間一進(jìn)程編號(hào)。
由于采用上述技術(shù)方案,本發(fā)明具有如下有益效果1、 由于在符號(hào)査找方法的改進(jìn),使得本方案不僅可以在軟件產(chǎn)品開(kāi)發(fā)時(shí)使用,也可以在 軟件產(chǎn)品發(fā)布后的穩(wěn)定測(cè)試,產(chǎn)品改進(jìn)中使用;2、 克服了傳統(tǒng)嵌入式操作系統(tǒng)工具的缺點(diǎn),不僅可用于靜態(tài)鏈接的應(yīng)用程序,也可以適 用于動(dòng)態(tài)鏈接的應(yīng)用程序;3、 需要保存的異常文件精簡(jiǎn),而且大小固定,克服了操作系統(tǒng)內(nèi)核保存的異常文件會(huì)隨 著應(yīng)用程序的內(nèi)存使用情況變化的缺點(diǎn),使得本方案更適用于在高端嵌入式系統(tǒng)中使用。
圖1為本發(fā)明嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法流程圖;圖2為可執(zhí)行地址判斷示意圖;圖3為調(diào)用函數(shù)跳轉(zhuǎn)指令搜索示意圖圖4為實(shí)際跳轉(zhuǎn)地址獲取示意圖;圖5為函數(shù)地址和符號(hào)獲取示意圖。
具體實(shí)施方式
本發(fā)明的基本設(shè)計(jì)思想是通過(guò)在用戶進(jìn)程發(fā)生異常的時(shí)候做現(xiàn)場(chǎng)分析,包括堆?;厮?, 符號(hào)査找,出錯(cuò)文件査找,結(jié)果保存。因?yàn)橹槐4娣治鼋Y(jié)果,而不是內(nèi)存的直接拷貝,所以 保存的異常文件很小,而且也不會(huì)隨著應(yīng)用程序占有的內(nèi)存變化而變化。同時(shí),本發(fā)明使用 分層設(shè)計(jì)、合理抽象的思想,將與處理器相關(guān)的處理、與操作系統(tǒng)的系統(tǒng)調(diào)用接口相關(guān)的處 理都獨(dú)立成為單獨(dú)模塊,同時(shí)固定相關(guān)接口,使得本發(fā)明可以方便的移植到不同的處理器和 不同的操作系統(tǒng)上。將本方案的入口加到操作系統(tǒng)內(nèi)核異常代碼中,操作系統(tǒng)在異常處理中 就可以直接調(diào)用本方案的異常處理了 。本發(fā)明的兩個(gè)關(guān)鍵技術(shù)是 一個(gè)是堆?;厮莸姆椒?, 一個(gè)是動(dòng)態(tài)鏈接庫(kù)的符號(hào)查找方法。 堆?;厮莸姆椒ㄊ窃卺槍?duì)C、 O+等高級(jí)語(yǔ)言的編譯中,對(duì)每--個(gè)函數(shù)都會(huì)構(gòu)造一段堆???間,函數(shù)的局部變量,部分輸入?yún)?shù)都放在堆??臻g內(nèi);在函數(shù)編譯后,編譯器會(huì)在函數(shù)的 入口添加一段匯編代碼,稱之為編譯序言,在這段匯編代碼里,會(huì)保存 一個(gè)堆棧幀到函數(shù)的 堆??臻g,在這個(gè)堆棧幀里主要保存了 1、本函數(shù)執(zhí)行完之后的返回地址;
2、 返回時(shí)的SP (堆棧寄存器)值;3、 返回時(shí)的FP (堆棧幀寄存器)值,也就是上一級(jí)函數(shù)FP的值,如果本函數(shù)已經(jīng)是最 頂層函數(shù),則該值為零。在保存了堆棧幀到堆棧空間后,會(huì)把該堆棧幀的地址放到當(dāng)前的FP(堆棧幀寄存器)里。 在函數(shù)的出口,編譯器同樣會(huì)添加一段做相反工作的匯編代碼,稱之為編譯尾聲,在這段代 碼里,會(huì)恢復(fù)保存在堆棧幀里的FP值到FP寄存器里,會(huì)恢復(fù)保存在堆棧幀里的SP值到SP 寄存器里,最后跳轉(zhuǎn)到堆棧幀里保存的返回地址去繼續(xù)執(zhí)行。因此,在用戶進(jìn)程發(fā)生異常的 時(shí)候,就可以利用堆棧幀寄存器的值和堆棧幀的內(nèi)容來(lái)回溯出堆棧幀序列。動(dòng)態(tài)鏈接函數(shù)符號(hào)查找的方法是根據(jù)上文所述的堆棧回溯方法,可以在堆棧幀中找到 當(dāng)前函數(shù)的返回地址,以這個(gè)返回地址為基礎(chǔ)向有效程序空間的低地址方向搜索,就可以找 到調(diào)用該函數(shù)的調(diào)用指令,分析出該指令的相對(duì)偏移地址,再加上該指令的地址,就可以得 到---個(gè)跳轉(zhuǎn)地址,在這里有兩種情況,L、如果該函數(shù)和調(diào)用它的函數(shù)是在同一個(gè)執(zhí)行文件里(直接鏈接),則該跳轉(zhuǎn)地址就是 被調(diào)用函數(shù)地址;2、如果該函數(shù)和調(diào)用它的函數(shù)不是在同一個(gè)文件中(動(dòng)態(tài)間接鏈接),得到的地址就只 是- 個(gè)動(dòng)態(tài)鏈接的進(jìn)程鏈接表表項(xiàng)地址,需要再?gòu)倪M(jìn)程鏈接表中取得被調(diào)函數(shù)的實(shí)際跳轉(zhuǎn)地址。對(duì)于直接鏈接的函數(shù)地址,在本執(zhí)行文件的符號(hào)表(在發(fā)布版中,符號(hào)表可能會(huì)被去掉) 中査找對(duì)應(yīng)地址的函數(shù)名字;對(duì)于動(dòng)態(tài)間接鏈接的地址,則須由該函數(shù)所在文件的動(dòng)態(tài)符號(hào) 表中査找對(duì)應(yīng)的函數(shù)名字。由于本本發(fā)明使用了動(dòng)態(tài)鏈接函數(shù)符號(hào)査找方法,所以使得本方案不僅可用于開(kāi)發(fā)階段 的程序調(diào)試,也可以用于在程序發(fā)布后的測(cè)試和產(chǎn)品改進(jìn)。參照附圖1,本發(fā)明包括如下步 驟步驟A,當(dāng)進(jìn)程發(fā)生異常時(shí),獲取發(fā)生異常的用戶進(jìn)程的寄存器值和相關(guān)信息;步驟B,根據(jù)所述寄存器值,使用堆?;厮莸姆椒ㄕ业接脩暨M(jìn)程發(fā)生異常時(shí)函數(shù)的地址,以及調(diào)用該函數(shù)的函數(shù)序列;歩驟C,使用動(dòng)態(tài)鏈接函數(shù)符號(hào)查找方法,根據(jù)歩驟B得到的函數(shù)地址,在相應(yīng)文件的符號(hào)表査找出函數(shù)的符號(hào);步驟D,將步驟A、 B、 C得到的結(jié)果保存到異常信息文件中,同時(shí)給所述異常信息文件命 名;命名方式有i、保存時(shí)間一進(jìn)程名字一進(jìn)程編號(hào)、2、保存時(shí)間一進(jìn)程編^一進(jìn)程名7-、 3、保存時(shí)間一進(jìn)程編號(hào)。下面結(jié)合附圖對(duì)本發(fā)明作詳細(xì)說(shuō)明第一步當(dāng)進(jìn)程發(fā)生異常時(shí),獲取發(fā)生異常的用戶進(jìn)程的寄存器值,主要有PC(程序計(jì) 數(shù)寄存器)值,F(xiàn)P(堆棧幀寄存器)值,SP(堆棧寄存器)值,PSR(程序狀態(tài)寄存器)值;第二步獲取發(fā)生異常進(jìn)程的相關(guān)信息,主要有進(jìn)程的任務(wù)名字,進(jìn)程標(biāo)識(shí)編號(hào)、進(jìn) 程的堆棧空間范圍、進(jìn)程的代碼空間范圍、進(jìn)程全局變量的空間范圍,進(jìn)程動(dòng)態(tài)分配的地址 空間范圍;第三步根據(jù)第二步取得的合法地址空間范圍來(lái)判斷發(fā)生異常的P(:值、FlMt、 SIM直是 否合法,如是合法值,則繼續(xù)處理,否則,跳轉(zhuǎn)到第九個(gè)步驟;第四步根據(jù)保存的FP值找到堆棧幀,從堆棧幀找到本函數(shù)的返回地址,首先判斷該地 址是否是在本進(jìn)程內(nèi)存執(zhí)行空間內(nèi)的地址,如果不是,則跳轉(zhuǎn)到第九個(gè)歩驟,否則繼續(xù)處ll。參照附圖2有效地址判斷的具體歩驟為1、 輸入的函數(shù)地址到操作系統(tǒng)內(nèi)核提供的系統(tǒng)調(diào)用中;2、 判斷該地址是否在當(dāng)前進(jìn)程的一個(gè)虛擬地址空間區(qū)域內(nèi)?3、 如果是,再判斷該地址所屬于的虛擬地址空間區(qū)域的屬性是否是可執(zhí)行的?1、如果是,就說(shuō)明該函數(shù)地址是有效的程序地址,反之,不是;最后返回判斷結(jié)果。 第五步以上-步取得的地址為起點(diǎn),向有效程序空間的低端搜索,以上文所述的動(dòng)態(tài) 鏈接函數(shù)符號(hào)査找的方法搜索調(diào)用本函數(shù)的調(diào)用指令及其地址;如果成功搜索到結(jié)果,繼續(xù) 卩一歩處理,否則,跳轉(zhuǎn)到第九個(gè)歩驟。 參照附圖3,搜索的具體歩驟為1、 、利用FP值得到當(dāng)甜函數(shù)的返回地址;2、 設(shè)定最大循環(huán)搜尋次數(shù),以返回地址為起始搜索地址,開(kāi)始循環(huán)査找;3、 每 -次循環(huán)開(kāi)始時(shí),將搜索地址減去-一個(gè)指令長(zhǎng)度;4、 判斷新的指令地址是否是有效的可執(zhí)行的地址(使用圖1詳細(xì)描述的方法)5、 如果不是,退出處理,返回失敗,反之,取出新地址處的指令;6、 判斷該指令是否是改變了 PC (程序計(jì)數(shù)器)值的指令(這--步與具體的處理器相關(guān), 不同的處理器比較的方法不同)?7、 如果是,則跳出循環(huán),退出處理,返回搜索成功和搜索結(jié)果;8、 否則,將搜索次數(shù)加t,跳到循環(huán)開(kāi)始繼續(xù)搜索,如果到達(dá)最大搜索次數(shù)也沒(méi)有搜索
到改變PC值的指令,則退出函數(shù),返回搜索失敗。 第六歩使用上一歩執(zhí)行結(jié)果,1、 根據(jù)調(diào)用指令中的偏移信息,加上調(diào)用指令本身的地址,得到在調(diào)用本函數(shù)時(shí)的跳轉(zhuǎn) 地址;2、 判斷該跳轉(zhuǎn)地址是直接跳轉(zhuǎn)還是間接動(dòng)態(tài)跳轉(zhuǎn),如果是直接跳轉(zhuǎn),就直接在本執(zhí)W文 件中搜索函數(shù)的符號(hào),否則使用附圖4描述的方法査找對(duì)應(yīng)于該間接跳轉(zhuǎn)地址的實(shí)際跳轉(zhuǎn)地 址;3、 如果搜索到函數(shù)名字,將函數(shù)地址、文件名字和函數(shù)名字一起保存,否則就只保存函 數(shù)地址和文件名字;同時(shí)保存其他-些函數(shù)的相關(guān)信息,如函數(shù)的調(diào)用地址,變量個(gè)數(shù)等等,參照附圖4,使用跳轉(zhuǎn)指令得到的跳轉(zhuǎn)地址找到真正程序跳轉(zhuǎn)地址的方法具體包括如F 歩驟1、 輸入要搜索的地址;2、 使用該地址和操作系統(tǒng)提供的系統(tǒng)調(diào)用,找到地址所屬的可執(zhí),:r文件,以及該文件A: 操作系統(tǒng)進(jìn)程中的虛擬地址區(qū)域;3、 從虛擬地址區(qū)域得到該文件在進(jìn)程內(nèi)存空間中的映射偏移地址;4、 使用映射偏移和可執(zhí)行文件得到該文件在進(jìn)程內(nèi)存空間中進(jìn)程鏈接表的入U(xiǎn)地址5、 利用入口地址判斷輸入地址是否在進(jìn)程鏈接表中?6、 如果不是,則輸入地址為直接跳轉(zhuǎn)的實(shí)際跳轉(zhuǎn)地址,直接返回改地址; 7如果是,說(shuō)明輸入地址是間接跳轉(zhuǎn)的,是進(jìn)程鏈接表表項(xiàng)的地址8、利用輸入地址和進(jìn)程鏈接表表項(xiàng)的結(jié)構(gòu),得到由動(dòng)態(tài)鏈接器放置在進(jìn)程鏈接表表項(xiàng)中 的實(shí)際跳轉(zhuǎn)地址,返回該實(shí)際跳轉(zhuǎn)地址,完成本方法的處理。參照附圖5,根據(jù)跳轉(zhuǎn)指令取得函數(shù)名字的方法具體包括如下歩驟 L、使用跳轉(zhuǎn)指令和該指令的地址得到該指令執(zhí)行后的程序跳轉(zhuǎn)地址;2、利用圖l描述的方法判斷該地址是否是有效的可執(zhí)行地址;如果不是,退出處理,返 回失??;3,如果是,禾U用圖3描述的方法得到執(zhí)行跳轉(zhuǎn)指令后,根據(jù)調(diào)用指令中的偏移信總,加 上調(diào)用指令本身的地址,得到在調(diào)用本函數(shù)時(shí)的跳轉(zhuǎn)地址,也即被調(diào)用函數(shù)的入口地址; 4,判斷該跳轉(zhuǎn)地址是否是動(dòng)態(tài)鏈接地址?5、如果實(shí)際跳轉(zhuǎn)地址是直接跳轉(zhuǎn)的靜態(tài)鏈接地址;執(zhí)行歩驟5-1; 5-1、判斷當(dāng)前文件符號(hào)表是否存在?5-2,如果存在,則在當(dāng)前可執(zhí)行文件的符號(hào)表中搜索對(duì)應(yīng)地址的函數(shù)名' :5-3,返回搜索到的函數(shù)名字和函數(shù)地址,并保存。5-4,在符號(hào)表不存在的情況下,則直接返回地址和為零的函數(shù)名字;6、 接步驟4的判斷,如果實(shí)際跳轉(zhuǎn)地址是間接跳轉(zhuǎn)的動(dòng)態(tài)鏈接地址,則找到實(shí)際跳轉(zhuǎn)地 址所在的可執(zhí)行文件,7、 在該可執(zhí)行文件的動(dòng)態(tài)符號(hào)表中,査找對(duì)應(yīng)該跳轉(zhuǎn)地址的函數(shù)名字;8、 與歩驟5-3相同,返回搜索到的函數(shù)地址,函數(shù)名字,并保存<第七歩根據(jù)保存的FP值找到堆棧幀,從堆棧幀得到上層函數(shù)的堆棧幀地址,更新保存 的FP值。第八歩使用保存的FP值,判斷該FP值是否在進(jìn)程的堆??臻g范圍內(nèi),同時(shí)判斷搜索深度是否超過(guò)了最大限制,如果FP值有效,搜索深度也沒(méi)有越界,則跳轉(zhuǎn)到第四歩繼續(xù)運(yùn)行,否則,跳轉(zhuǎn)到第九個(gè)歩驟。第九歩將保存下來(lái)有效的搜索結(jié)果(函數(shù)地址,文件名字和函數(shù)名字等)按調(diào)用順序 保存到異常文件中,同時(shí),將得到的進(jìn)程信息(任務(wù)名字,堆??諉?wèn)等),處理器的寄存器信 息(PC值,SP值),應(yīng)用程序的信息(版本號(hào),內(nèi)核版本號(hào))等等也保存到異常文件屮A。本發(fā)明根據(jù)發(fā)生異常時(shí)進(jìn)程的內(nèi)存信息,提取出發(fā)生異常的程序地址,處理器各寄存器 內(nèi)容,發(fā)生異常的可執(zhí)行文件名字,并且智能回溯出異常發(fā)生的函數(shù)調(diào)用順序,調(diào)用函數(shù)的 名字和所屬文件,并將這些信息保存到文件,通過(guò)保存的文件,可以清楚的看到導(dǎo)致進(jìn)程異常的函數(shù),函數(shù)的名字,進(jìn)程指針等內(nèi)容,從而定位發(fā)生異常的代碼位置。lnj時(shí),保存的文件去掉了不必要的冗余信息,所以保存文件的體積很小,特別適用于智能手機(jī),P1)A(個(gè)人數(shù)字助理)等高端嵌入式系統(tǒng)中應(yīng)用。本發(fā)明可以在開(kāi)發(fā)階段使用,也可以在產(chǎn)品的穩(wěn)定測(cè)試、發(fā)布版本中使用,因?yàn)楸景l(fā)明 保存的異常文件小,不會(huì)影響產(chǎn)品功能的使用,同時(shí),本發(fā)明生成的異常文件包含了足夠多 的調(diào)試信息,可以直接幫助定位引起異常的錯(cuò)誤原因,能夠大大提高對(duì)A品性能改進(jìn)的速度, 方便產(chǎn)品的錯(cuò)誤修改。
權(quán)利要求
1. 一種嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法,其特征在于包括如下步驟步驟A,當(dāng)進(jìn)程發(fā)生異常時(shí),獲取發(fā)生異常的用戶進(jìn)程的寄存器值和相關(guān)信息;步驟B,根據(jù)所述寄存器值,使用堆?;厮莸姆椒ㄕ业接脩暨M(jìn)程發(fā)生異常時(shí)函數(shù)的地址,以及調(diào)用該函數(shù)的函數(shù)序列;步驟C,使用動(dòng)態(tài)鏈接函數(shù)符號(hào)查找方法,根據(jù)步驟B得到的函數(shù)地址,在相應(yīng)文件的符號(hào)表查找出函數(shù)的符號(hào);步驟D,將步驟A、B、C得到的結(jié)果保存到異常信息文件中。
2、 根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)屮進(jìn)程異常跟蹤定位的方法,其特征在于歩驟A具 體為步驟A1,獲取發(fā)生異常的用戶進(jìn)程的寄存器值,主要有程序計(jì)數(shù)寄存器值,堆棧幀寄 存器值,堆棧寄存器值,程序狀態(tài)寄存器值;歩驟A2,獲取發(fā)生異常進(jìn)程的相關(guān)信息,主要有進(jìn)程的任務(wù)名字,進(jìn)程標(biāo)識(shí)編號(hào)、進(jìn) 程的堆??臻g范圍、進(jìn)程的代碼空間范圍、進(jìn)程全局變量的空間范圍,進(jìn)程動(dòng)態(tài)分配的地址 空間范闈。
3、 根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法,其特征在于歩驟B具 體為歩驟BL,根據(jù)歩驟A1獲取的堆棧幀寄存器值找到堆棧幀,從堆棧幀找到本函數(shù)的返回 地址;步驟B2,判斷該返回地址是否是在本進(jìn)程內(nèi)存執(zhí)行空間內(nèi)的有效的可執(zhí)行地址;步驟B3,如果是,以該返回地址為起點(diǎn),向有效程序空間的低端搜索,搜索調(diào)用本函數(shù)的調(diào)用指令及其地址。
4、 根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法,其特征在于步驟C具體為步驟C1,根據(jù)調(diào)用指令中的偏移地址,加上調(diào)用指令本身的地址,得到在調(diào)用本函數(shù)時(shí) 的跳轉(zhuǎn)地址;步驟C2,判斷該跳轉(zhuǎn)地址是直接跳轉(zhuǎn)還是間接動(dòng)態(tài)跳轉(zhuǎn)步驟C3,如果是直接跳轉(zhuǎn),就直接在本執(zhí)行文件中搜索函數(shù)的符號(hào);步驟C4,如果是間接動(dòng)態(tài)跳轉(zhuǎn),則査找對(duì)應(yīng)于該間接跳轉(zhuǎn)地址的實(shí)際跳轉(zhuǎn)地址;步驟C5,查找對(duì)應(yīng)該實(shí)際跳轉(zhuǎn)地址的函數(shù)名字;步驟C6、將搜索到函數(shù)名字、函數(shù)地址、文件名字一起保存-歩驟C7,根據(jù)保存的堆棧幀寄存器值找到堆棧幀,從堆棧幀得到上層函數(shù)的堆棧幀地址, 更新保存的堆棧幀寄存器值;歩驟C8,使用保存的堆棧幀寄存器值,判斷該堆棧幀寄存器值是否在進(jìn)程的堆??臻g范 圍內(nèi),同時(shí)判斷搜索深度是否超過(guò)了最大限制,如果堆棧幀寄存器值有效,搜索深度也沒(méi)有 越界,則跳轉(zhuǎn)到步驟B繼續(xù)運(yùn)行,否則,跳到歩驟D。
5、 根據(jù)權(quán)利要求4所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法,其特征在于步驟01具體為步驟C41,使用該間接動(dòng)態(tài)跳轉(zhuǎn)地址和操作系統(tǒng)提供的系統(tǒng)調(diào)用,找到該地址所屬的可 執(zhí)行文件,以及該文件在操作系統(tǒng)進(jìn)程中的虛擬地址區(qū)域,從虛擬地址區(qū)域得到該文件在進(jìn) 程內(nèi)存空間中的映射偏移地址;步驟C42,使用映射偏移地址和可執(zhí)行文件,得到該文件在進(jìn)程內(nèi)存空間中進(jìn)程鏈接表的入口地址;步驟C43,利用入口地址判斷輸入地址是否在進(jìn)程鏈接表中;如果不是,則輸入地址為 直接跳轉(zhuǎn)的實(shí)際跳轉(zhuǎn)地址,直接返回該地址,如果是,說(shuō)明輸入地址是間接跳轉(zhuǎn)的;步驟C44,利用輸入地址和進(jìn)程鏈接表表項(xiàng)的結(jié)構(gòu)就可以得到由動(dòng)態(tài)鏈接器放置在進(jìn)程 鏈接表表項(xiàng)中的實(shí)際跳轉(zhuǎn)地址,返回該實(shí)際跳轉(zhuǎn)地址。
6、 根據(jù)權(quán)利要求4所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法.其特征在于步驟C5 具體為步驟C51,使用跳轉(zhuǎn)指令和該指令的地址,得到該指令執(zhí)行后的程序跳轉(zhuǎn)地址 步驟C52,判斷該地址是否是有效的可執(zhí)行地址,如果不是,退出處理,返回失??; 步驟C53,如果是,以該地址為起點(diǎn),向有效程序空間的低端搜索,搜索調(diào)用本函數(shù)的跳轉(zhuǎn)指令及實(shí)際跳轉(zhuǎn)地址,即被調(diào)用函數(shù)的入口地址步驟C54,如果實(shí)際跳轉(zhuǎn)地址是直接跳轉(zhuǎn)的靜態(tài)鏈接地址,則在當(dāng)前可執(zhí)行文件的符號(hào)表中搜索對(duì)應(yīng)地址的函數(shù)名字,在符號(hào)表不存在的情況下,則直接返回地址和為零的函數(shù)名字,否則返回函數(shù)地址和在符號(hào)表中搜索到的函數(shù)名字;步驟C55,如果實(shí)際跳轉(zhuǎn)地址是間接跳轉(zhuǎn)的動(dòng)態(tài)鏈接地址,則找到實(shí)際跳轉(zhuǎn)地址所在的可執(zhí)行文件,然后在該可執(zhí)行文件的動(dòng)態(tài)符號(hào)表中査找與跳轉(zhuǎn)地址對(duì)應(yīng)的函數(shù)名,; 步驟C56,返回搜索到的函數(shù)地址,函數(shù)名字。
7、 根據(jù)權(quán)利要求3或6所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法,其特征在于步驟 B3、 C53具體為步驟l,設(shè)定最大循環(huán)搜尋次數(shù),以返回地址為起始搜索地址,開(kāi)始循環(huán)査找;步驟2,將搜索地址減去 一個(gè)指令長(zhǎng)度,判斷新的指令地址是否是有效的可執(zhí)行的地址;步驟3,如果是,取出新地址處的指令,判斷該指令是否是改變了程序計(jì)數(shù)器值的指令; 步驟4,如果是,則跳出循環(huán),退出處理,返回搜索成功和搜索結(jié)果 步驟5,如果不是,將搜索次數(shù)加],跳到步驟2開(kāi)始繼續(xù)搜索。
8、 根據(jù)權(quán)利要求2、 3或6所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法,其特征在于 在步驟B2、步驟B32、步驟C53中判斷地址是否是有效的可執(zhí)行地址的歩驟為步驟1,輸入函數(shù)的地址到操作系統(tǒng)內(nèi)核提供的系統(tǒng)調(diào)用中,得出該地址是否在3前進(jìn) 程的一個(gè)虛擬地址空間區(qū)域內(nèi);步驟2,如果是,判斷該地址所屬于的虛擬地址空間區(qū)域的屬性是否是p:r執(zhí)行的;如果是,就說(shuō)明該函數(shù)的地址是有效的程序地址。
9、 根據(jù)權(quán)利要求i所述的嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法,其特征在于步驟D還 包括給所述異常信息文件命名;命名方式有1、保存時(shí)間一進(jìn)程名,--進(jìn)程編號(hào),2、保 存時(shí)間一進(jìn)程編號(hào)一進(jìn)程名字,3、保存時(shí)間一進(jìn)程編號(hào)。
全文摘要
本發(fā)明公開(kāi)了一種嵌入式系統(tǒng)中進(jìn)程異常跟蹤定位的方法,解決了目前使用異常跟蹤工具中需要存儲(chǔ)空間大,配置麻煩,需要調(diào)試版本支持的問(wèn)題。本發(fā)明根據(jù)發(fā)生異常時(shí)進(jìn)程的內(nèi)存信息,提取出發(fā)生異常的程序地址,處理器各寄存器內(nèi)容,發(fā)生異常的可執(zhí)行文件名字,并且智能回溯出異常發(fā)生的函數(shù)調(diào)用順序,調(diào)用函數(shù)的名字和所屬文件,并將這些信息保存到文件,通過(guò)保存的文件,可以清楚的看到導(dǎo)致進(jìn)程異常的函數(shù),函數(shù)的名字,進(jìn)程指針等內(nèi)容,從而定位發(fā)生異常的代碼位置。同時(shí),保存的文件去掉了不必要的冗余信息,所以保存文件的體積很小,特別適用于智能手機(jī),PDA(個(gè)人數(shù)字助理)等高端嵌入式系統(tǒng)中應(yīng)用。
文檔編號(hào)G06F11/36GK101211309SQ200610167368
公開(kāi)日2008年7月2日 申請(qǐng)日期2006年12月29日 優(yōu)先權(quán)日2006年12月29日
發(fā)明者敬 繆, 蔣鯤鵬, 力 馬 申請(qǐng)人:中興通訊股份有限公司