專利名稱:一種嵌入式軟件動態(tài)內(nèi)存檢測的方法
技術(shù)領(lǐng)域:
本發(fā)明屬于嵌入式系統(tǒng)的內(nèi)存動態(tài)檢測領(lǐng)域,特別是涉及一種將數(shù)據(jù)采集 和測試分離的交叉測試的方法。
背景技術(shù):
隨著嵌入式技術(shù)的發(fā)展,嵌入式應(yīng)用的不斷增長以及嵌入式系統(tǒng)復(fù)雜性不 斷提高,嵌入式軟件的規(guī)模和復(fù)雜性也不斷提高,有限的硬件資源和功能越來 越強(qiáng)的需求依然是嵌入式軟件開發(fā)領(lǐng)域的主要矛盾,嵌入式軟件必須做到精簡 高效、穩(wěn)定可靠。嵌入式軟件的質(zhì)量和開發(fā)周期對產(chǎn)品的最終質(zhì)量和上市時(shí)間 起到?jīng)Q定性的影B向,這使得嵌入式軟件的開發(fā)、分析與測試成為了研究的熱點(diǎn)。
嵌入式軟件與個(gè)人微機(jī)軟件有著巨大的差別,這表現(xiàn)在它與硬件關(guān)系緊 密、內(nèi)存不豐富,可靠性和實(shí)時(shí)性要求高的幾個(gè)方面。嵌入式軟件如果出現(xiàn)內(nèi) 存泄漏等問題,勢必導(dǎo)致系統(tǒng)可用內(nèi)存減少,嚴(yán)重的可能引起系統(tǒng)的崩潰。
如何有效管理內(nèi)存泄露、內(nèi)存碎片和內(nèi)存崩潰等問題對嵌入式軟件開發(fā)變 得越來越突出。同時(shí),考慮到嵌入式平臺主要利用率的問題,測試應(yīng)該盡可能 的減小開銷。
目前,內(nèi)存使用錯誤的預(yù)防和處理方法分為靜態(tài)分析和動態(tài)分析兩類,靜 態(tài)分析工具研制復(fù)雜,目前還沒有得到廣泛使用的高效工具。動態(tài)分析又分為
源代碼插裝法(SCI: Source Code Instrument)、目標(biāo)碼插裝法(OCI: Object Code Instrument)和添加保護(hù)字節(jié)法三類。
SCI法對原始程序進(jìn)行語法掃描、分析,然后插入檢測代碼將其轉(zhuǎn)換成新
的、等價(jià)的源代碼,這一過程對用戶來說是完全透明的。在整個(gè)過程中,原始 代碼文件沒有被修改,也不需要用戶的任何介入。加工好的源文件最后被鏈接 成可執(zhí)行文件,從而為檢測程序運(yùn)行時(shí)錯誤做好準(zhǔn)備。
OCI法對每個(gè)目標(biāo)文件和庫進(jìn)行加工,并工作在匯編碼級。在鏈接時(shí),對
每個(gè)文件進(jìn)行解碼,分析每條指令,發(fā)現(xiàn)與內(nèi)存有關(guān)的指令,插入額外的代碼 以檢查內(nèi)存存取的準(zhǔn)確性,并以臨時(shí)文件的形式建立等價(jià)的模塊。在所有的模 塊被改造完畢后,連接成最后的可執(zhí)行程序。
添加保護(hù)字節(jié)法在每個(gè)內(nèi)存塊的邊界添加保護(hù)字節(jié),這些額外的字節(jié)用來 標(biāo)志該內(nèi)存塊并動態(tài)記錄內(nèi)存塊的狀態(tài)。在程序執(zhí)行過程中,如果程序讀寫處 于圍墻上的字節(jié),就被判為錯誤。同時(shí),通過分析保護(hù)字節(jié)的信息,可以檢測
出該內(nèi)存塊是否被釋放,從而判斷是否發(fā)生內(nèi)存泄漏。同SCI與OCI方法相
比,此方法在實(shí)現(xiàn)上難度更大一些,而且添加的保護(hù)字節(jié)要占用大量的內(nèi)存空 間,對于大型的應(yīng)用程序使用此方法檢測效率很低。
常用的動態(tài)內(nèi)存檢測工具如Purify、 Valgrind、 Mpatro、 Memtrace, Memprof
等都是基于源代碼插裝法,F(xiàn)ENSE則采用了源代碼插裝法和添加保護(hù)字節(jié)法相 結(jié)合的方式。然而這些工具都是在同一個(gè)主機(jī)上采集和分析數(shù)據(jù),對于資源緊 缺的嵌入式平臺而言,這些測試工具影響系統(tǒng)資源的利用率。
發(fā)明內(nèi)容
本發(fā)明的目的在于克服現(xiàn)有技術(shù)的不足,提出了一種數(shù)據(jù)采集和測試分離 的交叉測試方法,該方法能夠準(zhǔn)確度、可靠性、及時(shí)性的檢測嵌入式軟件的內(nèi) 存問題,同時(shí)保證嵌入式平臺資源的利用率。
為了實(shí)現(xiàn)上述發(fā)明目的,采用的技術(shù)方案如下
一種嵌入式軟件動態(tài)內(nèi)存檢測的方法,將數(shù)據(jù)采集和數(shù)據(jù)測試分析相分
離,即對涉及動態(tài)內(nèi)存檢測所需的數(shù)據(jù)采集步驟和數(shù)據(jù)測試分析歩驟分別在不 同的嵌入式主機(jī)進(jìn)行,且進(jìn)行數(shù)據(jù)測試分析的主機(jī)與進(jìn)行數(shù)據(jù)采集的主機(jī)相互 連接。
上述技術(shù)方案中,進(jìn)行數(shù)據(jù)測試分析為開發(fā)機(jī),開發(fā)機(jī)上設(shè)置有內(nèi)存探測 模塊和插裝庫,進(jìn)行數(shù)據(jù)釆集為目標(biāo)機(jī),目標(biāo)機(jī)上設(shè)置測試代理模塊,所述內(nèi)
存探測模塊集成于Edipse平臺,包括通信模塊、數(shù)據(jù)管理模塊、顯示模塊,所 述通信模塊與目標(biāo)機(jī)上的測試代理模塊建立連接,所述數(shù)據(jù)管理模塊通過通信 模塊向測試代理模塊發(fā)送可執(zhí)行文件,并接收測試代理模塊執(zhí)行文件過程中發(fā) 送過來的數(shù)據(jù),所述顯示模塊進(jìn)行分析數(shù)據(jù)和圖形顯示。
所述目標(biāo)機(jī)的測試代理模塊包括接收和執(zhí)行文件模塊、微觀測試模塊、宏 觀測試模塊三部分,所述接收和執(zhí)行文件模塊與開發(fā)機(jī)建立通信,接收在開發(fā) 機(jī)上經(jīng)過交叉編譯生成的可執(zhí)行文件,并把微觀測試模塊和宏觀測試模塊獲得 的數(shù)據(jù)傳輸給開發(fā)機(jī),所述微觀測試模塊捕捉可執(zhí)行文件的內(nèi)存操作行為,所 述宏觀測試模塊根據(jù)嵌入式系統(tǒng)內(nèi)存的變化判斷是否出現(xiàn)內(nèi)存問題。
所述插裝庫是內(nèi)存信息統(tǒng)計(jì)庫,在開發(fā)機(jī)上和被測試文件一起交叉編譯生
成可執(zhí)行文件。
本發(fā)明具體包括如下步驟
(1) 嵌入式軟件在開發(fā)機(jī)上進(jìn)行交叉編譯,把插裝庫和嵌入式軟件一起 編譯生成相對于目標(biāo)機(jī)的可執(zhí)行文件;
(2) 開發(fā)機(jī)上的內(nèi)存探測模塊把可執(zhí)行文件發(fā)送到目標(biāo)機(jī)卜.,目標(biāo)機(jī)通 過測試代理模塊的接收和執(zhí)行文件模塊接收并且執(zhí)行相應(yīng)的文件;
(3) 在目標(biāo)機(jī)上執(zhí)行可執(zhí)行文件的同時(shí),微觀測試模塊和宏觀測試模塊 收集數(shù)據(jù),再通過測試代理模塊把數(shù)據(jù)發(fā)送給開發(fā)機(jī),開發(fā)機(jī)上的數(shù)據(jù)管理模 塊接收數(shù)據(jù),再通過顯示模塊進(jìn)行分析,并顯示分析結(jié)果。
步驟(1)中插裝庫是源代碼插裝庫,這個(gè)庫主要是用來統(tǒng)計(jì)內(nèi)存操作信
息,嵌入式軟件一般都要通過編譯鏈交叉編譯生成可執(zhí)行文件;
步驟(2)中,開發(fā)機(jī)和目標(biāo)機(jī)之間通過TCP/IP協(xié)議建立連接;
步驟(3)中的微觀測試模塊和宏觀測試模塊負(fù)責(zé)采集目標(biāo)機(jī)數(shù)據(jù),但是
不進(jìn)行分析,具體分析操作是開發(fā)機(jī)的顯示模塊負(fù)責(zé),這樣做的目的大大減少
了測試開銷。
假設(shè)T執(zhí)ff表示被測試文件執(zhí)行時(shí)間;Tsi集表示采集數(shù)據(jù)時(shí)間;T分ff表示分 析數(shù)據(jù)時(shí)間;T^表示傳輸時(shí)間;如果數(shù)據(jù)采集和測試都在目標(biāo)機(jī)上,那么總 的時(shí)間為T ,&=T術(shù)+T采集+T分析為目標(biāo)機(jī)的開銷。如果數(shù)據(jù)采集和測試分離,即數(shù) 據(jù)采集在目標(biāo)機(jī)h而分析在開發(fā)機(jī)上,那么目標(biāo)機(jī)的總開銷為T ^7+T采集+T 傳輸。比較T分析和T糊,之間大小,實(shí)驗(yàn)表明,對于大型嵌入式軟件,傳輸數(shù)據(jù)時(shí) 間比分析數(shù)據(jù)時(shí)間要小很多。并且如果在目標(biāo)機(jī)上分析數(shù)據(jù),還占用平臺資源。 這對于資源緊缺的嵌入式平臺是不可以接受的。
所述微觀測試模塊收集數(shù)據(jù)通過執(zhí)行文件里的插裝庫實(shí)現(xiàn),插裝庫通過改 寫嵌入式操作系統(tǒng)下的涉及內(nèi)存操作函數(shù),包括在這些函數(shù)里增加把對內(nèi)存操 作的信息發(fā)送到開發(fā)機(jī)上的代碼,插裝庫里改寫函數(shù)通過調(diào)用嵌入式操作系統(tǒng) 標(biāo)準(zhǔn)庫stdlib的內(nèi)存操作函數(shù)實(shí)現(xiàn),具體如下
如果涉及內(nèi)存操作函數(shù),會被插裝庫的函數(shù)替換,接著調(diào)用目標(biāo)機(jī)上標(biāo)準(zhǔn) 庫Stdlib里面的相應(yīng)函數(shù);
如果涉及申請內(nèi)存函數(shù),那么就把申請成功內(nèi)存的開始地址存入全局鏈
表,出錯就報(bào)錯;
如果是釋放內(nèi)存函數(shù),就搜索全局鏈表看是否存在該內(nèi)存,如果沒有就報(bào)
錯;
最后,獲得內(nèi)存操作的信息,保存起來,再發(fā)送給測試代理模塊; 插裝庫設(shè)置一個(gè)全局鏈表List,當(dāng)申請內(nèi)存時(shí),保存每次申請到的內(nèi)存的
地址;當(dāng)釋放內(nèi)存時(shí),在鏈表里面搜索給定內(nèi)存的地址,然后從鏈表里面刪除,
從而保證數(shù)據(jù)一致性。
所述宏觀檢測模塊先從宏觀上判斷一個(gè)進(jìn)程是否存在內(nèi)存泄漏,其通過獲
得應(yīng)用程序堆空間,虛擬內(nèi)存和實(shí)際內(nèi)存的變化,來判斷是否出現(xiàn)內(nèi)存問題,
具體操作如下
測試代理模塊執(zhí)行被測試程序,獲得被測試程序的進(jìn)程號,再把這個(gè)進(jìn)程 號傳送給內(nèi)核態(tài)的宏觀測試模塊的kemeUiser模塊;
根據(jù)這個(gè)進(jìn)程號,宏觀測試模塊的kemeLuser模塊搜索整個(gè)進(jìn)程鏈表,找 到相應(yīng)的進(jìn)程控制塊PCB,所述進(jìn)程鏈表保存在嵌入式操作系統(tǒng)的內(nèi)核中;
根據(jù)進(jìn)程控制塊PCB獲取進(jìn)程的所有內(nèi)核態(tài)信息,包括內(nèi)存信息,同時(shí)把 獲得的內(nèi)存信息寫入字符設(shè)備驅(qū)動文件,
最后,應(yīng)用態(tài)的測試代理模塊讀取字符設(shè)備驅(qū)動文件里面的數(shù)據(jù),并且發(fā) 送給開發(fā)機(jī)。
本發(fā)明為將數(shù)據(jù)采集和測試分離的交叉測試方法,實(shí)現(xiàn)嵌入式動態(tài)內(nèi)存檢 測的優(yōu)越性如下
1、 節(jié)省嵌入式平臺CPU的處理時(shí)間,讓CPU有更多的時(shí)間處理別的時(shí)間,
提高CPU的利用率;
2、 保證嵌入式平臺資源利用率;
3、 能夠及時(shí)的,準(zhǔn)確的,可靠的發(fā)現(xiàn)嵌入式軟件內(nèi)存問題;
4、 非常直觀的圖形化界面,方便開發(fā)人員觀察嵌入式軟件存在的問題, 而不需要等到程序結(jié)束或者強(qiáng)制退出。
圖1為本發(fā)明的架構(gòu)邏輯示意圖; 圖2為本發(fā)明的微觀測試示意圖; 圖3為本發(fā)明的宏觀測試示意圖; 圖4為本發(fā)明的宏觀測試具體實(shí)施示意圖。
具體實(shí)施例方式
本發(fā)明實(shí)施于嵌入式開發(fā)平臺,嵌入式開發(fā)涉及到開發(fā)機(jī)和嵌入式平臺,
把開發(fā)機(jī)稱為(Service),嵌入式平臺稱為目標(biāo)機(jī)(Client)。
附圖1嵌入式軟件動態(tài)內(nèi)存檢測工具的總體架構(gòu),該圖顯示了 Sen/ice端和 Client端的各個(gè)模塊。Service上主要是包含內(nèi)存探測模塊和插裝庫;Client上主 要包含測試代理。具體如下分析
Service上的源代碼和插裝庫通過編譯鏈交叉編譯生成可執(zhí)行文件,這里的 插裝庫主要是為測試代理的微觀測試模塊統(tǒng)計(jì)數(shù)據(jù),雖然這個(gè)模塊是在Service 上,但是它具體應(yīng)用還是為Client上的測試代理的微觀測試采集數(shù)據(jù);
集成在Eclipse上內(nèi)存探測模塊的通信模塊通過TCP/IP協(xié)議和Client建立 連接,生成的可執(zhí)行文件被數(shù)據(jù)管理模塊發(fā)送到Client上的測試代理,其中的 接收和執(zhí)行文件模塊接收文件,并且執(zhí)行。
文件在Client端執(zhí)行,測試代理里的微觀測試和宏觀測試二個(gè)模塊采集數(shù) 據(jù),再發(fā)送到內(nèi)存探測的數(shù)據(jù)處理模塊收集,最后顯示模塊定時(shí)的分析數(shù)據(jù), 并且通過直觀的圖形顯示結(jié)果。
附圖2展示了嵌入式軟件動態(tài)內(nèi)存檢測工具微觀測試,這個(gè)模塊主要是利 用了插裝庫,該庫相當(dāng)于是一個(gè)優(yōu)先加載庫。在Linux下設(shè)置環(huán)境變量LD_PRELOAD為插裝庫就可以完成對這個(gè)庫的優(yōu)先加載。插裝庫通過改寫 malloc(), realloc(), calloc(), free()等函數(shù),在這些函數(shù)里包裝的是把對內(nèi)存操 作的信息發(fā)送到開發(fā)機(jī)上的代碼,插裝庫里修改的函數(shù)最終還是調(diào)用標(biāo)準(zhǔn)庫 (stdlib)的malloc(),什ee(), calloc(), free()等函數(shù)。具體分析如下
如果是內(nèi)存操作函數(shù),會被插裝庫的函數(shù)替換,接著調(diào)用Client上標(biāo)準(zhǔn)庫 (stdlib)里面的相應(yīng)函數(shù);
如果是申請內(nèi)存函數(shù),那么就把申請成功內(nèi)存的開始地址存入全局鏈表, 出錯就報(bào)錯;如果是釋放內(nèi)存函數(shù),就搜索全局鏈表看是否存在該內(nèi)存,如果 沒有就報(bào)錯;
最后,獲得內(nèi)存操作的信息,保存起來,再發(fā)送給測試代理。 插裝庫有一個(gè)非常重要全局鏈表List,當(dāng)申請內(nèi)存時(shí),保存每次申請到的
內(nèi)存的地址;當(dāng)釋放內(nèi)存時(shí),在鏈表里面搜索給定內(nèi)存的地址,然后從鏈表里
面刪除,從而保證數(shù)據(jù)一致性。
嵌入式軟件動態(tài)內(nèi)存檢測工具微觀測試主要是是設(shè)計(jì)了二個(gè)比較重要的函
數(shù)malloc()和free(),其他的函數(shù)可以根據(jù)這二個(gè)函數(shù)的思想來完成,設(shè)計(jì)思想
為
1、 malloc()函數(shù)實(shí)現(xiàn), 設(shè)置函數(shù)類型,主要是方便開發(fā)機(jī)分析; 前后多分配MSS—WATCH一SIZE字節(jié),并且寫入特殊的值; 把申請成功的內(nèi)存開始地址保存到全局鏈表;
統(tǒng)計(jì)信息,包括調(diào)用malloc()函數(shù)的文件名,函數(shù)名,行號,申請時(shí)間, 具體大小,進(jìn)程號等信息。在發(fā)送給測試代理。
2、 free()函數(shù)實(shí)現(xiàn)
設(shè)置函數(shù)類型;
搜索全局鏈表,如果找到了相應(yīng)的地址,那么就調(diào)用標(biāo)準(zhǔn)庫里面的什ee函 數(shù),釋放空間;如果失敗,報(bào)錯;
統(tǒng)計(jì)信息,包括調(diào)用malloc()函數(shù)的文件名,函數(shù)名,行號,申請時(shí)間, 具體大小,進(jìn)程號等信息。在發(fā)送給測試代理;
其中—FILE—, —PRETTY—FUNCTION—, —LINE—是Linux下的宏,用來獲 得文件名,函數(shù)名,以及行號。MSS—BY—MALLOC和MSS_BY—FREE用來區(qū)別函 數(shù)類型。
附圖3展示了嵌入式軟件動態(tài)內(nèi)存檢測工具宏觀測試,所謂宏觀檢測是指 先從宏觀上確定一個(gè)進(jìn)程有沒有內(nèi)存泄漏,而不考慮這個(gè)進(jìn)程泄漏內(nèi)存的具體 信息。從宏觀上看,如果進(jìn)程有內(nèi)存泄漏的話,它占用的內(nèi)存就會不斷的增大, 那么它占用內(nèi)存的最大值就會不斷的被刷新。應(yīng)用程序一般都是在堆上申請內(nèi) 存,所以通過獲得應(yīng)用程序堆空間,虛擬內(nèi)存和實(shí)際內(nèi)存的變化,來判斷是否 出現(xiàn)內(nèi)存問題。這個(gè)模塊跟操作系統(tǒng)有密切的關(guān)系,需要獲得內(nèi)核數(shù)據(jù)結(jié)構(gòu)的 實(shí)時(shí)數(shù)據(jù),內(nèi)核態(tài)和用戶態(tài)數(shù)據(jù)交互
測試代理執(zhí)行被測試程序,獲得被測試程序的進(jìn)程號,再把這個(gè)進(jìn)程號傳 送給內(nèi)核態(tài)的宏觀測試的kernel—user模塊;
根據(jù)這個(gè)進(jìn)程號,宏觀測試的kerneLuser模塊搜索整個(gè)進(jìn)程鏈表(內(nèi)核用 于保存所有進(jìn)程號的鏈表),找到相應(yīng)的進(jìn)程控制塊(PCB);
根據(jù)進(jìn)程控制塊(PCB),具體可以獲取進(jìn)程的所有內(nèi)核態(tài)信息,包括內(nèi)存 信息。同時(shí)把獲得的內(nèi)存信息寫入字符設(shè)備驅(qū)動文件;
最后,應(yīng)用態(tài)的測試代理就可以讀這個(gè)字符設(shè)備驅(qū)動文件里面的數(shù)據(jù),并 且發(fā)送給開發(fā)機(jī)。附圖4為嵌入式軟件動態(tài)內(nèi)存檢測工具宏觀測試具體實(shí)施,內(nèi)核里面有二 個(gè)主要的數(shù)據(jù)結(jié)構(gòu)task一struct(PCB)和mm_struct,由于這二個(gè)結(jié)構(gòu)體成員變量 比較多,這里只說明對測試有用的成員。宏觀測試模塊下的kerneLuser模塊獲 得進(jìn)程號后就可以找到相應(yīng)PCB, PCB結(jié)構(gòu)體mm成員是指向mm_struct結(jié)構(gòu) 體的指針。mm—struct結(jié)構(gòu)體包含了進(jìn)程的內(nèi)存使用情況,具體包括虛擬內(nèi) 存大小,實(shí)際內(nèi)存大小,分配堆空間大小等。
權(quán)利要求
1、一種嵌入式軟件動態(tài)內(nèi)存檢測的方法,其特征在于將數(shù)據(jù)采集和數(shù)據(jù)測試分析相分離,即對涉及動態(tài)內(nèi)存檢測所需的數(shù)據(jù)采集步驟和數(shù)據(jù)測試分析步驟分別在不同的嵌入式主機(jī)進(jìn)行,且進(jìn)行數(shù)據(jù)測試分析的主機(jī)與進(jìn)行數(shù)據(jù)采集的主機(jī)相互連接。
2、 根據(jù)權(quán)利要求1所述的嵌入式軟件動態(tài)內(nèi)存檢測的方法,其特征在于 進(jìn)行數(shù)據(jù)測試分析為開發(fā)機(jī),開發(fā)機(jī)上設(shè)置有內(nèi)存探測模塊和插裝庫,進(jìn)行數(shù) 據(jù)采集為目標(biāo)機(jī),目標(biāo)機(jī)上設(shè)置測試代理模塊,所述內(nèi)存探測模塊集成于Eclipse 平臺,包括通信模塊、數(shù)據(jù)管理模塊、顯示模塊,所述通信模塊與目標(biāo)機(jī)上的 測試代理模塊建立連接,所述數(shù)據(jù)管理模塊通過通信模塊向測試代理模塊發(fā)送 可執(zhí)行文件,并接收測試代理模塊執(zhí)行文件過程中發(fā)送過來的數(shù)據(jù),所述顯示 模塊進(jìn)行分析數(shù)據(jù)和圖形顯示。
3、 根據(jù)權(quán)利要求2所述的嵌入式軟件動態(tài)內(nèi)存檢測的方法,其特征在于 所述目標(biāo)機(jī)的測試代理模塊包括接收和執(zhí)行文件模塊、微觀測試模塊、宏觀測 試模塊三部分,所述接收和執(zhí)行文件模塊與開發(fā)機(jī)建立通信,接收在開發(fā)機(jī)上 經(jīng)過交叉編譯生成的可執(zhí)行文件,并把微觀測試模塊和宏觀測試模塊獲得的數(shù) 據(jù)傳輸給開發(fā)機(jī),所述微觀測試模塊捕捉可執(zhí)行文件的內(nèi)存操作行為,所述宏 觀測試模塊根據(jù)嵌入式系統(tǒng)內(nèi)存的變化判斷是否出現(xiàn)內(nèi)存問題。
4、 根據(jù)權(quán)利要求2或3所述的嵌入式軟件動態(tài)內(nèi)存檢測的方法,其特征 在于所述插裝庫是內(nèi)存信息統(tǒng)計(jì)庫,在開發(fā)機(jī)上和被測試文件一起交叉編譯生 成可執(zhí)行文件。
5、 根據(jù)權(quán)利要求4所述的嵌入式軟件動態(tài)內(nèi)存檢測的方法,其特征在于具體包括如下步驟 (1) 嵌入式軟件在開發(fā)機(jī)上進(jìn)行交叉編譯,把插裝庫和嵌入式軟件一起 編譯生成相對于目標(biāo)機(jī)的可執(zhí)行文件;(2) 開發(fā)機(jī)上的內(nèi)存探測模塊把可執(zhí)行文件發(fā)送到目標(biāo)機(jī)上,目標(biāo)機(jī)通 過測試代理模塊的接收和執(zhí)行文件模塊接收并且執(zhí)行相應(yīng)的文件;(3) 在目標(biāo)機(jī)上執(zhí)行可執(zhí)行文件的同時(shí),微觀測試模塊和宏觀測試模塊 收集數(shù)據(jù),再通過測試代理模塊把數(shù)據(jù)發(fā)送給開發(fā)機(jī),開發(fā)機(jī)上的數(shù)據(jù)管理模 塊接收數(shù)據(jù),再通過顯示模塊進(jìn)行分析,并顯示分析結(jié)果。
6、 根據(jù)權(quán)利要求5所述的嵌入式軟件動態(tài)內(nèi)存檢測的方法,其特征在于 所述微觀測試模塊收集數(shù)據(jù)通過執(zhí)行文件里的插裝庫實(shí)現(xiàn),插裝庫通過改寫嵌 入式操作系統(tǒng)下的涉及內(nèi)存操作函數(shù),包括在這些函數(shù)里增加把對內(nèi)存操作的 信息發(fā)送到開發(fā)機(jī)上的代碼,插裝庫里改寫函數(shù)通過調(diào)用嵌入式操作系統(tǒng)標(biāo)準(zhǔn) 庫Stdlib的內(nèi)存操作函數(shù)實(shí)現(xiàn),具體如下如果涉及內(nèi)存操作函數(shù),會被插裝庫的函數(shù)替換,接著調(diào)用目標(biāo)機(jī)上標(biāo)準(zhǔn) 庫Stdlib里面的相應(yīng)函數(shù);如果涉及申請內(nèi)存函數(shù),那么就把申請成功內(nèi)存的開始地址存入全局鏈 表,出錯就報(bào)錯;如果是釋放內(nèi)存函數(shù),就搜索全局鏈表看是否存在該內(nèi)存,如果沒有就報(bào)錯;最后,獲得內(nèi)存操作的信息,保存起來,再發(fā)送給測試代理模塊; 插裝庫設(shè)置一個(gè)全局鏈表List,當(dāng)申請內(nèi)存時(shí),保存每次申請到的內(nèi)存的地址;當(dāng)釋放內(nèi)存時(shí),在鏈表里面搜索給定內(nèi)存的地址,然后從鏈表里面刪除,從而保證數(shù)據(jù)一致性。
7、 根據(jù)權(quán)利要求5所述的嵌入式軟件動態(tài)內(nèi)存檢測的方法,其特征在于所述宏觀檢測模塊先從宏觀上判斷一個(gè)進(jìn)程是否存在內(nèi)存泄漏,其通過獲得應(yīng) 用程序堆空間,虛擬內(nèi)存和實(shí)際內(nèi)存的變化,來判斷是否出現(xiàn)內(nèi)存問題,具體 操作如下測試代理模塊執(zhí)行被測試程序,獲得被測試程序的進(jìn)程號,再把這個(gè)進(jìn)程號傳送給內(nèi)核態(tài)的宏觀測試模塊的kemel一user模塊;根據(jù)這個(gè)進(jìn)程號,宏觀測試模塊的kernel—user模塊搜索整個(gè)進(jìn)程鏈表,找 到相應(yīng)的進(jìn)程控制塊PCB,所述進(jìn)程鏈表保存在嵌入式操作系統(tǒng)的內(nèi)核中;根據(jù)進(jìn)程控制塊PCB獲取進(jìn)程的所有內(nèi)核態(tài)信息,包括內(nèi)存信息,同時(shí)把 獲得的內(nèi)存信息寫入字符設(shè)備驅(qū)動文件,最后,應(yīng)用態(tài)的測試代理模塊讀取字符設(shè)備驅(qū)動文件里面的數(shù)據(jù),并且發(fā) 送給開發(fā)機(jī)。
全文摘要
本發(fā)明提供了一種嵌入式軟件動態(tài)內(nèi)存檢測的方法,將數(shù)據(jù)采集和數(shù)據(jù)測試分析相分離,即對涉及動態(tài)內(nèi)存檢測所需的數(shù)據(jù)采集步驟和數(shù)據(jù)測試分析步驟分別在不同的嵌入式主機(jī)進(jìn)行,且進(jìn)行數(shù)據(jù)測試分析的主機(jī)與進(jìn)行數(shù)據(jù)采集的主機(jī)相互連接。本發(fā)明為數(shù)據(jù)采集和測試分離的交叉測試方法,該方法能夠準(zhǔn)確度、可靠性、及時(shí)性的檢測嵌入式軟件的內(nèi)存問題,同時(shí)保證嵌入式平臺資源的利用率。
文檔編號G06F11/36GK101354675SQ20081003026
公開日2009年1月28日 申請日期2008年8月19日 優(yōu)先權(quán)日2008年8月19日
發(fā)明者劉發(fā)貴, 溫宇龍 申請人:華南理工大學(xué)