專利名稱:一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法
技術(shù)領(lǐng)域:
本發(fā)明屬于對軟件可靠性的改進,具體涉及一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的方法。
背景技術(shù):
內(nèi)存泄露是軟件系統(tǒng)中很常見的缺陷,內(nèi)存泄露會導(dǎo)致軟件系統(tǒng)運行時可用內(nèi)存減少,軟件運行速度變慢,甚至?xí)捎趦?nèi)存耗盡而產(chǎn)生系統(tǒng)崩潰。檢測軟件是否存在內(nèi)存泄露和定位出造成內(nèi)存泄露地具體位置已成為軟件調(diào)試和可靠性測試的重要內(nèi)容。目前,一般由編寫軟件的工程師自己詳細審查代碼,確認軟件是否存在內(nèi)存泄露,并查找出造成內(nèi)存泄露的具體位置。當軟件系統(tǒng)達到一定規(guī)模后使用此方法費力又耗時,且效果不佳。另一種方法是采用專用的商用軟件來檢測和定位,使用此方法需要較高的成本。
發(fā)明內(nèi)容
本發(fā)明克服了現(xiàn)有技術(shù)中的不足,提供了一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法,可準確、快速地發(fā)現(xiàn)軟件是否存在內(nèi)存泄露,并準確查找出造成內(nèi)存泄露的位置。
本發(fā)明的技術(shù)方案概述如下一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法,包括如下步驟
A.在軟件主循環(huán)中嵌入內(nèi)存泄露檢查模塊,該內(nèi)存泄露檢查模塊多次重復(fù)分配和釋放內(nèi)存空間,并記錄內(nèi)存泄露檢查模塊自身的運行時間;
B.至少運行兩次主循環(huán),將每次記錄的內(nèi)存泄露檢查模塊的運行時間進行比較,如果上述內(nèi)存泄露檢查模塊的運行時間逐漸增加,就判定軟件存在內(nèi)存泄露,否則,就判定不存在內(nèi)存泄露;
C.如果存在內(nèi)存泄露,運行該軟件,比較其對各個地址的內(nèi)存的分配和釋放次數(shù),確定是否有某個特定地址的內(nèi)存未被釋放;
D.最后分配該特定地址的內(nèi)存的指令就是造成內(nèi)存泄露的位置。所述步驟B之后步驟C之前還包括如下步驟
21)、在存在內(nèi)存泄露的軟件中注銷一個軟件模塊;
22)、至少運行兩次主循環(huán),將每次記錄的內(nèi)存泄露檢查模塊的運行時間進行比較,如果上述內(nèi)存泄露檢查模塊的運行時間沒有逐漸增加,就判定被注銷的軟件模塊中存在內(nèi)存泄露,剩余軟件模塊中不存在內(nèi)存泄露,進入步驟C,如果上述內(nèi)存泄露檢查模塊的運行時間逐漸增加,就進行步驟23);
23)、比較注銷軟件模塊前后的內(nèi)存泄露檢查模塊運行時間的增量,如果增量減少,控制模塊就判定被注銷的軟件模塊中存在內(nèi)存泄露,剩余軟件模塊中存在內(nèi)存泄露,如果增量沒有減少,控制模塊就判定被注銷的軟件模塊中不存在內(nèi)存泄露,剩余軟件模塊中存在內(nèi)存泄露。
24)判斷剩余軟件模塊的個數(shù),如果剩余軟件模塊的個數(shù)不為1,則又進行步驟21);如果剩余軟件模塊的個數(shù)為1,則進入步驟C。
所述內(nèi)存泄露檢查模塊是測試程序,該測試程序分配和和釋放內(nèi)存空間的次數(shù)可調(diào)。
在所述步驟C中,運行該有內(nèi)存泄露的軟件之前,在存在內(nèi)存泄露的軟件模塊中用新的函數(shù)替換原有的分配內(nèi)存空間和釋放內(nèi)存空間的函數(shù),所述新函數(shù)包含原函數(shù)并增加內(nèi)存分配和釋放的統(tǒng)計和打印功能。
所述步驟C中,如果某個地址的內(nèi)存的分配次數(shù)大于該地址的內(nèi)存的釋放次數(shù),控制模塊就判定該地址存在內(nèi)存泄露,否則該地址不存在內(nèi)存泄露。
如果原程序中包含各個步驟的執(zhí)行信息,所述找出最后分配該特定地址的內(nèi)存的指令的方法是找出最后分配該特定地址的內(nèi)存的語句,及該語句之后最鄰近的步驟N運行完畢的信息,步驟N中進行內(nèi)存分配的程序代碼就是存在內(nèi)存泄露的位置。
所述找出最后分配該特定地址的內(nèi)存的指令可以通過仿真器逐步跟蹤定位出。
與現(xiàn)有技術(shù)相比,本發(fā)明的效果是通過比較內(nèi)存泄露檢查模塊的運行時間,可簡單、快速的判定是否存在內(nèi)存泄露。通過先確定存在內(nèi)存泄露的軟件模塊,再比較地址的內(nèi)存的分配次數(shù)和釋放次數(shù),確定存在內(nèi)存泄露的特定地址,再找出最后分配該特定地址的內(nèi)存的指令,該指令就是造成內(nèi)存泄露的位置,可以準確的定位造成內(nèi)存泄露的位置。使用本發(fā)明,不需引進昂貴的商用軟件,成本低,而且不需編寫軟件的工程師詳細審查代碼,節(jié)約了大量時間。
圖1是內(nèi)存泄露的示意圖。
圖2是本發(fā)明實施例中控制模塊與軟件的關(guān)系示意圖。
圖3是一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法的流程圖。
圖4是確定泄露內(nèi)存的軟件模塊的流程圖。
具體實施方式
下面通過具體的實施例并結(jié)合附圖對本發(fā)明作進一步詳細的描述。如圖1所示,1為系統(tǒng)已分配的內(nèi)存空間,2為未分配的內(nèi)存空間,3為內(nèi)存泄露空間,4為內(nèi)存開始地址,5為內(nèi)存結(jié)束地址。當軟件完成初始化進入主循環(huán)以后,系統(tǒng)所需要的基本內(nèi)存已經(jīng)分配完畢,會占用內(nèi)存的比較低端的地址空間,同時系統(tǒng)的內(nèi)存管理程序會形成一個內(nèi)存分配使用的鏈表,每分配一塊內(nèi)存就會在這個鏈表中添加一個節(jié)點。當軟件需要為某個應(yīng)用分配一段內(nèi)存空間時,就需要在上述內(nèi)存分配使用鏈表中查找到一段未使用且足夠大的內(nèi)存空間,查找過程需要從鏈表的首節(jié)點開始,直到查找到一段未使用且足夠大的內(nèi)存空間結(jié)束。當內(nèi)存塊的分配比較連續(xù),而且鏈表中節(jié)點個數(shù)較少時,查找過程就可以很快的結(jié)束。上述節(jié)點的數(shù)據(jù)結(jié)構(gòu)在C語言中定義如下 typedef struct_struct_region{
struct_struct_region *prev;
struct_struct_region *next;
unsigned long start;
unsigned long len; }region,*region_t;
如圖2、圖3所示,一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法,包括如下步驟
第一步在軟件主循環(huán)中嵌入內(nèi)存泄露檢查模塊,所述內(nèi)存泄露檢查模塊能夠根據(jù)設(shè)定次數(shù)進行多次重復(fù)分配和釋放內(nèi)存空間,該內(nèi)存泄露檢查模塊還包含時間記錄模塊,能記錄其每次的運行時間。
第二步控制模塊控制軟件至少運行兩次主循環(huán),并且每次都讀取內(nèi)存泄露檢查模塊的運行時間,將每次記錄的內(nèi)存泄露檢查模塊的運行時間進行比較。如果內(nèi)存泄露檢查模塊的運行時間逐漸增加,控制模塊就判定軟件存在內(nèi)存泄露;否則控制模塊就判定軟件不存在內(nèi)存泄露。
當軟件中沒有內(nèi)存泄露時,主循環(huán)調(diào)用內(nèi)存泄露檢查模塊就在如圖1所示的初始化內(nèi)存空間之后的未分配內(nèi)存空間2內(nèi)進行內(nèi)存的分配和釋放。為內(nèi)存泄露檢查模塊分配內(nèi)存空間時,查找一段未使用且足夠大的內(nèi)存空間所需搜索鏈表的節(jié)點數(shù)是不變的,此時內(nèi)存泄露檢查模塊的運行時間是基本保持穩(wěn)定的。當軟件中有內(nèi)存泄露,主循環(huán)調(diào)用內(nèi)存泄露檢查模塊,為其分配內(nèi)存空間時,查找一段未使用且足夠大的內(nèi)存空間所需搜索鏈表的節(jié)點數(shù)是逐漸增加的,此時內(nèi)存泄露檢查模塊的運行時間會逐漸增加。
內(nèi)存泄露檢查模塊可以采用如下程序
U32m=5000;U32n=100;for(tmp=0;tmp<m;tmp++){p=malloc(n);for(tmp2=0;tmp2<n;tmp2++){p2=malloc(n);free(p2);}free(p);}
其中m和n可以根據(jù)不同的系統(tǒng)內(nèi)存使用狀況適當?shù)恼{(diào)整,m和n越大,內(nèi)存泄露檢查模塊的運行時間的增加就越明顯。
第三步如圖2、圖4所示,確定出泄露內(nèi)存的軟件模塊。具體包括如下步驟
a)控制模塊發(fā)出控制信號,注銷存在內(nèi)存泄露的軟件中的一個軟件模塊,即將該軟件模塊從主循環(huán)中去除,運行主循環(huán)時,不需調(diào)用該軟件模塊。
b)控制模塊控制軟件至少運行兩次主循環(huán),并且每次都讀取內(nèi)存泄露檢查模塊的運行時間,將每次記錄的內(nèi)存泄露檢查模塊的運行時間進行比較。如果內(nèi)存泄露檢查模塊的運行時間沒有逐漸增加,控制模塊就判定被注銷的軟件模塊中存在內(nèi)存泄露,剩余軟件模塊中不存在內(nèi)存泄露,進入第四步;如果內(nèi)存泄露檢查模塊的運行時間逐漸增加,則進行步驟c)。剩余軟件模塊是指注銷軟件模塊后,運行主循環(huán)時,需調(diào)用的軟件模塊。
c)控制模塊比較注銷軟件模塊前每次內(nèi)存泄露檢查模塊的運行時間的增量與注銷軟件模塊后每次內(nèi)存泄露檢查模塊的運行時間的增量,如果增量沒有減少,控制模塊就判定被注銷的軟件模塊中不存在內(nèi)存泄露,剩余軟件模塊中存在內(nèi)存泄露,然后進行步驟d);如果增量減少,控制模塊就判定被注銷的軟件模塊中存在內(nèi)存泄露,剩余軟件模塊中存在內(nèi)存泄露,然后進行步驟d)。
d)控制模塊判斷剩余軟件模塊的個數(shù),如果剩余軟件模塊的個數(shù)不為1,則又進行步驟a);如果剩余軟件模塊的個數(shù)為1,則第三步結(jié)束,進入第四步。
第四步,在第三步確定出的泄露內(nèi)存的軟件模塊中,控制模塊定義新的函數(shù)替換原有的分配內(nèi)存空間和釋放內(nèi)存空間的函數(shù),新函數(shù)包含原函數(shù)并增加了內(nèi)存分配的統(tǒng)計和打印功能。在正常情況,即沒有內(nèi)存泄露的情況下,內(nèi)存的分配和釋放是一一對應(yīng)的,即各個地址的內(nèi)存的分配次數(shù)和釋放次數(shù)相等??刂颇K控制運行新程序,統(tǒng)計打印出來的各個地址的內(nèi)存分配次數(shù)和釋放次數(shù)。如果某個特定地址的內(nèi)存的分配次數(shù)大于該特定地址的內(nèi)存的釋放次數(shù),控制模塊就判定該特定地址存在內(nèi)存泄露,否則該特定地址不存在內(nèi)存泄露。控制模塊記錄上述存在內(nèi)存泄露的特定地址。
例如可以用下列dmalloc、dcalloc、dfree函數(shù)替換原有malloc、calloc、free函數(shù),具體定義如下
static unsigned int malloc_times=0;void*dmalloc(size_t size){void*p=NULL;malloc_imes++;p=malloc(size);if(p==NULL)printf(″##Malloc fail##\n″);else<!-- SIPO <DP n="6"> --><dp n="d6"/>printf(″Malloc times=%d,adds=0x%x\n″,malloc_times,p);return p;}void*dcalloc(size_t nitems,size_t size){void*p;p=dmalloc(nitems*size);if(!p)return NULL;memset(p,0x00,nitems*size);return p;}void dfree(void*ptr){malloc_times--;if(ptr==NULL){printf(″##free NULL##\n″);return;}printf(″Free times=%d,adds=0x%x\n″,malloc_times,ptr);free(ptr);}
用以上新函數(shù)dmalloc、dcalloc、dfree替換原有malloc、calloc、free函數(shù)之后,運行程序,如果打印信息里顯示的free個數(shù)是N,控制模塊就判定存在N個內(nèi)存泄露處。統(tǒng)計打印出來的各個地址的內(nèi)存分配次數(shù)和釋放次數(shù)。如果某個特定地址的內(nèi)存的分配次數(shù)大于該特定地址的內(nèi)存的釋放次數(shù),控制模塊就判定該特定地址存在內(nèi)存泄露,否則該特定地址不存在內(nèi)存泄露??刂颇K記錄上述存在內(nèi)存泄露的特定地址。
第五步如果軟件中包含各個步驟的執(zhí)行信息,所述執(zhí)行信息是指顯示各個步驟運行結(jié)束的信息,例如程序運行完步驟1就打印“步驟1運行完畢!”,程序運行完步驟2就打印“步驟2運行完畢!”......??刂颇K查找出最后分配存在內(nèi)存泄露的特定地址的內(nèi)存的語句,和該語句之后最鄰近的步驟N運行完畢的信息。步驟N中進行內(nèi)存分配的程序代碼就是存在內(nèi)存泄露的程序代碼。如果軟件中不包含各個步驟的執(zhí)行信息,可以通過仿真器逐步跟蹤定位出最后分配存在內(nèi)存泄露的特定地址的內(nèi)存的程序代碼。
權(quán)利要求
1.一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法,其特征在于包括如下步驟
A.在軟件主循環(huán)中嵌入內(nèi)存泄露檢查模塊,該內(nèi)存泄露檢查模塊多次重復(fù)分配和釋放內(nèi)存空間,并記錄內(nèi)存泄露檢查模塊自身的運行時間;
B.至少運行兩次主循環(huán),將每次記錄的內(nèi)存泄露檢查模塊的運行時間進行比較,如果上述內(nèi)存泄露檢查模塊的運行時間逐漸增加,就判定軟件存在內(nèi)存泄露,否則,就判定不存在內(nèi)存泄露;
C.如果存在內(nèi)存泄露,運行該軟件,比較其對各個地址的內(nèi)存的分配和釋放次數(shù),確定是否有某個特定地址的內(nèi)存未被釋放;
D.最后分配該特定地址的內(nèi)存的指令就是造成內(nèi)存泄露的位置。
2.根據(jù)權(quán)利要求1所述的一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法,其特征在于所述步驟B之后步驟C之前還包括如下步驟
21)、在存在內(nèi)存泄露的軟件中注銷一個軟件模塊;
22)、至少運行兩次主循環(huán),將每次記錄的內(nèi)存泄露檢查模塊的運行時間進行比較,如果上述內(nèi)存泄露檢查模塊的運行時間沒有逐漸增加,就判定被注銷的軟件模塊中存在內(nèi)存泄露,剩余軟件模塊中不存在內(nèi)存泄露,進入步驟C,如果上述內(nèi)存泄露檢查模塊的運行時間逐漸增加,就進行步驟23);
23)、比較注銷軟件模塊前后的內(nèi)存泄露檢查模塊運行時間的增量,如果增量減少,就判定被注銷的軟件模塊中存在內(nèi)存泄露,剩余軟件模塊中存在內(nèi)存泄露,如果增量沒有減少,就判定被注銷的軟件模塊中不存在內(nèi)存泄露,剩余軟件模塊中存在內(nèi)存泄露。
24)判斷剩余軟件模塊的個數(shù),如果剩余軟件模塊的個數(shù)不為1,則又進行步驟21);如果剩余軟件模塊的個數(shù)為1,則進入步驟C。
3.根據(jù)權(quán)利要求1所述的一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法,其特征在于所述內(nèi)存泄露檢查模塊是測試程序,該測試程序分配和和釋放內(nèi)存空間的次數(shù)可調(diào)。
4.根據(jù)權(quán)利要求1所述的一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法,其特征在于在所述步驟C中,運行該有內(nèi)存泄露的軟件之前,在存在內(nèi)存泄露的軟件模塊中用新的函數(shù)替換原有的分配內(nèi)存空間和釋放內(nèi)存空間的函數(shù),所述新函數(shù)包含原函數(shù)并增加內(nèi)存分配和釋放的統(tǒng)計和打印功能。
5.根據(jù)權(quán)利要求1所述的一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法,其特征在于所述步驟C中,如果某個地址的內(nèi)存的分配次數(shù)大于該地址的內(nèi)存的釋放次數(shù),控制模塊就判定該地址存在內(nèi)存泄露,否則該地址不存在內(nèi)存泄露。
6.根據(jù)權(quán)利要求1所述的一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法,其特征在于如果原程序中包含各個步驟的執(zhí)行信息,所述找出最后分配該特定地址的內(nèi)存的指令的方法是找出最后分配該特定地址的內(nèi)存的語句,及該語句之后最鄰近的步驟N運行完畢的信息,步驟N中進行內(nèi)存分配的指令就是造成內(nèi)存泄露的位置。
7.根據(jù)權(quán)利要求1所述的一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法,其特征在于所述找出最后分配該特定地址的內(nèi)存的指令可以通過仿真器跟蹤定位出。
全文摘要
一種定位無操作系統(tǒng)的嵌入式系統(tǒng)內(nèi)存泄露的簡易方法,包括如下步驟在軟件主循環(huán)中嵌入內(nèi)存泄露檢查模塊,該內(nèi)存泄露檢查模塊多次重復(fù)分配和釋放內(nèi)存空間,并記錄內(nèi)存泄露檢查模塊自身的運行時間;至少運行兩次主循環(huán),將每次記錄的內(nèi)存泄露檢查模塊的運行時間進行比較,如果上述內(nèi)存泄露檢查模塊的運行時間逐漸增加,就判定軟件存在內(nèi)存泄露,否則,就判定不存在內(nèi)存泄露;如果存在內(nèi)存泄露,運行該軟件,比較其對各個地址的內(nèi)存的分配和釋放次數(shù),確定是否有某個特定地址的內(nèi)存未被釋放;最后分配該特定地址的內(nèi)存的指令就是造成內(nèi)存泄露的位置??珊唵?、快速的判定是否存在內(nèi)存泄露并準確定位出造成內(nèi)存泄露的位置。
文檔編號G06F11/36GK1794203SQ200510121108
公開日2006年6月28日 申請日期2005年12月29日 優(yōu)先權(quán)日2005年12月29日
發(fā)明者黃晉鋒 申請人:兆日科技(深圳)有限公司