两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

一種實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法

文檔序號(hào):6383927閱讀:184來源:國知局
專利名稱:一種實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法
技術(shù)領(lǐng)域
本發(fā)明屬于對(duì)計(jì)算機(jī)性能的改進(jìn),具體涉及一種實(shí)現(xiàn)計(jì)算機(jī)操作系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法,尤其涉及一種實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法。
背景技術(shù)
內(nèi)存泄漏是計(jì)算機(jī)系統(tǒng)中比較常見的缺陷,在許多比較復(fù)雜的計(jì)算機(jī)系統(tǒng)中,由于內(nèi)存泄漏造成系統(tǒng)運(yùn)行越來越慢,直到最后由于內(nèi)存資源耗盡而崩潰。但是非常難以檢測(cè)并準(zhǔn)確定位具體哪段代碼申請(qǐng)了內(nèi)存,而沒有釋放從而引起了內(nèi)存泄漏。
內(nèi)存泄漏檢測(cè)和定位是嵌入式實(shí)時(shí)操作系統(tǒng)(稱為RTOS)及應(yīng)用程序的代碼調(diào)試、測(cè)試以及維護(hù)時(shí)的一項(xiàng)重要內(nèi)容,內(nèi)存檢測(cè)和定位方法的優(yōu)劣,直接關(guān)系到RTOS的安全性、穩(wěn)定性和可靠性,以及建立在RTOS上的產(chǎn)品能否快速推出和穩(wěn)定。
現(xiàn)有RTOS在內(nèi)存泄露檢測(cè)方面缺乏行之有效的辦法。通常的做法有下面幾個(gè)方法在調(diào)試和測(cè)試階段通常使用自動(dòng)測(cè)試工具通過對(duì)內(nèi)存的打樁,內(nèi)存的使用被登記到自動(dòng)測(cè)試工具的數(shù)據(jù)庫里,然后根據(jù)人的經(jīng)驗(yàn)判斷,判斷是否有內(nèi)存泄漏,再對(duì)所有已經(jīng)申請(qǐng)了的內(nèi)存進(jìn)行人工檢查,對(duì)內(nèi)存泄漏進(jìn)行定位。但是這對(duì)大量的地方有內(nèi)存申請(qǐng)和釋放時(shí)將是一個(gè)非常痛苦的檢查過程。
另外一些能夠想到的方法是在內(nèi)存申請(qǐng)后把內(nèi)存的相關(guān)信息記錄到一個(gè)文件里,內(nèi)存釋放后,再把該內(nèi)存的相關(guān)信息刪除。程序可以定期或不定期對(duì)文件進(jìn)行檢查確實(shí)是否有內(nèi)存泄漏以及發(fā)生在什么地方。但是這將嚴(yán)重影響整個(gè)系統(tǒng)的性能,并且當(dāng)進(jìn)行檢查時(shí)會(huì)有一個(gè)對(duì)已經(jīng)申請(qǐng)內(nèi)存遍歷的過程,這將使系統(tǒng)的CPU占有率有個(gè)瞬間的高峰,存在著不確定性,對(duì)于嵌入式實(shí)時(shí)系統(tǒng)的穩(wěn)定性構(gòu)成很大的影響。
綜上所述,現(xiàn)有技術(shù)的缺點(diǎn)有兩個(gè)一是對(duì)系統(tǒng)性能影響很大,不易及時(shí)發(fā)現(xiàn)內(nèi)存泄漏;二是發(fā)現(xiàn)內(nèi)存泄漏后,不易準(zhǔn)確的找到內(nèi)存泄漏的原因。

發(fā)明內(nèi)容
本發(fā)明的目的在于克服上述現(xiàn)有技術(shù)的不足之處,提出一種實(shí)現(xiàn)嵌入式實(shí)時(shí)操作系統(tǒng)的內(nèi)存泄漏檢測(cè)和定位的方法,所述方法具有適用范圍廣、可靠性高、實(shí)時(shí)性強(qiáng)的特點(diǎn)。
本發(fā)明是這樣實(shí)現(xiàn)的一種實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法,至少包括如下步驟第一步建立一個(gè)由隊(duì)列項(xiàng)所構(gòu)成的循環(huán)隊(duì)列,所述循環(huán)隊(duì)列有一個(gè)游標(biāo),游標(biāo)所指向的隊(duì)列項(xiàng)為當(dāng)前時(shí)間,游標(biāo)每隔指定時(shí)間,往下走一格;第二步在申請(qǐng)內(nèi)存時(shí),同時(shí)申請(qǐng)內(nèi)存泄漏管理塊,用于填寫相關(guān)信息,并且在所述申請(qǐng)的內(nèi)存頭中附加一個(gè)指針,用于指向內(nèi)存泄漏管理塊;第三步根據(jù)用戶在申請(qǐng)內(nèi)存時(shí)規(guī)定的內(nèi)存最長生存期,計(jì)算出該申請(qǐng)內(nèi)存在循環(huán)隊(duì)列中的位置,并在該位置進(jìn)行注冊(cè),即在該位置掛上內(nèi)存泄漏管理塊,由所有在該位置的內(nèi)存泄漏管理塊組成雙向鏈表。
所述內(nèi)存最長生存期超過循環(huán)隊(duì)列總長度,用該生存期整除總長度,從而得到循環(huán)的圈數(shù)。
所述循環(huán)隊(duì)列每隔指定時(shí)間,游標(biāo)往下走一格,如果游標(biāo)指向循環(huán)隊(duì)列的隊(duì)列項(xiàng)不為NULL,則遍歷該隊(duì)列項(xiàng)所指向的內(nèi)存泄漏管理塊雙向鏈表;如果循環(huán)圈數(shù)為0,該內(nèi)存泄漏管理塊所指向的內(nèi)存發(fā)生了內(nèi)存泄漏;當(dāng)內(nèi)存使用率大于80%時(shí)就向用戶報(bào)警,并給出內(nèi)存的信息,如內(nèi)存申請(qǐng)的調(diào)用函數(shù)在源代碼的文件和位置行數(shù)。
所述循環(huán)隊(duì)列游標(biāo)的間隔指定時(shí)間為1秒。
所述循環(huán)隊(duì)列的總長度為30分鐘。
所述內(nèi)存泄漏管理塊用C語言定義如下typedef struct T_LeakCheckHead{char *filename;
int line;int loop;unsigned char HeadPoiter;struct T_LeakCheckHead *prev;struct T_LeakCheckHead *next;}CLEAKCHECK。
所述循環(huán)隊(duì)列的隊(duì)列項(xiàng)定義如下typedef struct T_queueNode{struct T_LeakCheckHead *leakchkhead;}CQUEUE;采用本發(fā)明所述方法,與現(xiàn)有技術(shù)相比,由于采取了環(huán)形隊(duì)列注冊(cè)內(nèi)存申請(qǐng)、定時(shí)掃描技術(shù)以及用戶自定義內(nèi)存掃描時(shí)間的措施,使得內(nèi)存泄露檢測(cè)所耗資源非常少,并且不會(huì)出現(xiàn)瞬間的高峰,極大的提高了系統(tǒng)的安全性、穩(wěn)定性和可靠性,并提高了內(nèi)存泄露檢測(cè)和定位的準(zhǔn)確性,及時(shí)性。


圖1是內(nèi)存泄漏循環(huán)隊(duì)列結(jié)構(gòu)示意圖;圖2是申請(qǐng)內(nèi)存與內(nèi)存泄漏管理塊結(jié)構(gòu)關(guān)系示意圖;圖3是內(nèi)存泄漏管理塊注冊(cè)的雙向鏈表示意圖。
具體實(shí)施例方式
本發(fā)明所述的方法如下第一步建立一個(gè)循環(huán)隊(duì)列,該循環(huán)隊(duì)列有一個(gè)游標(biāo),游標(biāo)所指向的就是當(dāng)前時(shí)間,游標(biāo)每過1秒(用戶可根據(jù)實(shí)際情況規(guī)定為其他間隔時(shí)間)往下走一格,結(jié)構(gòu)如圖1所示。
第二步在申請(qǐng)內(nèi)存時(shí),同時(shí)申請(qǐng)內(nèi)存泄漏管理塊,填寫相關(guān)信息。并且在內(nèi)存頭中附加一個(gè)指針用于指向內(nèi)存泄漏管理塊,結(jié)構(gòu)如圖2所示。
第三步根據(jù)用戶在申請(qǐng)內(nèi)存時(shí)規(guī)定的內(nèi)存最長生存期計(jì)算出其在隊(duì)列中的位置,并在該位置進(jìn)行注冊(cè),即掛上內(nèi)存泄漏管理塊在此處。所有在此處的內(nèi)存泄漏管理塊組成雙向鏈表,結(jié)構(gòu)如圖3所示。
第四步如果內(nèi)存最長生存期超過循環(huán)隊(duì)列總長度就需要用該生存期整除總長度,從而得到循環(huán)的圈數(shù)。
第五步循環(huán)隊(duì)列每隔指定時(shí)間就前進(jìn)一步,如果這時(shí)游標(biāo)指向的隊(duì)列項(xiàng)不為NULL,則遍歷該項(xiàng)指向內(nèi)存泄漏管理塊雙鏈表。如果循環(huán)圈數(shù)為0,則說明該內(nèi)存泄漏管理塊所指向的內(nèi)存發(fā)生了內(nèi)存泄漏,當(dāng)內(nèi)存使用率大于80%時(shí)就向用戶報(bào)警,并給出內(nèi)存的信息,如內(nèi)存申請(qǐng)的調(diào)用函數(shù)在源代碼的文件和位置行數(shù)。
以下結(jié)合附圖詳述本發(fā)明的實(shí)施例。
該內(nèi)存泄漏檢測(cè)和定位方法包括以下步驟第一步用C語言定義內(nèi)存泄漏管理塊如下(參見圖2)
typedef struct T_LeakCheckHead{char *filename;int line;int loop;unsigned char HeadPoiter;struct T_LeakCheckHead *prev;struct T_LeakCheckHead *next;}CLEAKCHECK;定義隊(duì)列項(xiàng)為(參見圖1)typedef struct T_queueNode{struct T_LeakCheckHead *leakchkhead;}CQUEUE;在初始化內(nèi)存泄漏檢查功能時(shí),根據(jù)用戶指定的大小N,創(chuàng)建數(shù)組CQUEUE queue[N],并創(chuàng)建一個(gè)實(shí)時(shí)任務(wù),該任務(wù)可以根據(jù)用戶指定的時(shí)間對(duì)該數(shù)組下標(biāo)n加1,例如每秒加1。如果數(shù)組下標(biāo)n加1超過了N,就使得下標(biāo)變?yōu)閚=0,從而使得數(shù)組成為一個(gè)循環(huán)隊(duì)列。
第二步申請(qǐng)內(nèi)存,并從該內(nèi)存開始部分劃出內(nèi)存泄漏管理頭,在申請(qǐng)內(nèi)存時(shí)用戶可指定該內(nèi)存的最大生存期,如果是-1則認(rèn)為該內(nèi)存永不釋放,有無限長的生存期。具體操作用C語言和偽代碼混合描述如下(參見圖3)char *GetMem(int Size,int TimeToLive)
{char *buffer,CLEAKCHECK *check,int cur;if(TimeToLive==-1)return malloc(Size);buffer=malloc(Size+sizeof(CLEAKCHECK));check=buffer;check->loop=TimeToLive/N;cur=(TimeToLive%N+n)%N;把內(nèi)存泄漏管理頭check填上調(diào)試和檢測(cè)信息,并掛到queue[cur]->leakchkhead指向的雙向鏈表尾上;return(char*)(check+1);}第三步釋放內(nèi)存的操作非常簡單,用C語言描述如下FreeMem(char *buffer){CLEAKCHECK *check;check=buffer;check--;/*從雙向鏈表中解除該節(jié)點(diǎn)*/(check->prev)->next=check->next;(check->next)->prev=check->prev;free((char *)check);}
第四步由于定義了最長生存期,對(duì)于絕大多數(shù)的內(nèi)存都在這個(gè)生成期前就被釋放了,因此超過這個(gè)生產(chǎn)期長度的我們認(rèn)為發(fā)生了內(nèi)存泄漏。一般規(guī)定隊(duì)列的最大長度為30分鐘,大多數(shù)內(nèi)存的生存期都小于該長度,即check->loop==0的項(xiàng)。由此可以得到循環(huán)隊(duì)列游標(biāo)到達(dá)某個(gè)隊(duì)列項(xiàng)(如queue[i])時(shí),隊(duì)列項(xiàng)上掛著的內(nèi)存泄漏管理塊應(yīng)該是發(fā)生了內(nèi)存泄漏的管理塊和check->loop大于0的塊,這些都將非常非常的少,大多數(shù)情況下將只有0個(gè)或幾個(gè)。對(duì)掛在queue[i]項(xiàng)的所有內(nèi)存泄漏管理塊進(jìn)行遍歷,對(duì)于check->loop==0的進(jìn)行報(bào)警,從而發(fā)現(xiàn)了內(nèi)存泄漏。
第五步如果用戶不需要該功能了,就可以調(diào)用接口函數(shù)停止隊(duì)列掃描,并在申請(qǐng)內(nèi)存時(shí)直接進(jìn)行申請(qǐng)而不加內(nèi)存泄漏管理頭,完成這些功能只需要加入一個(gè)全局變量標(biāo)識(shí)即可。
本發(fā)明所述的針對(duì)內(nèi)存泄漏檢測(cè)和定位的方法,內(nèi)存泄露檢測(cè)所耗系統(tǒng)資源非常少并且不會(huì)出現(xiàn)瞬間的高峰。由于采用了用戶自定義內(nèi)存生存期,就可以減少內(nèi)存泄漏檢查的誤報(bào),并且由于只對(duì)超出了最長生存期的內(nèi)存進(jìn)行報(bào)告,這樣在實(shí)際運(yùn)行中報(bào)告的信息量非常少,大大減少了定位和判斷內(nèi)存泄漏的時(shí)間,從而節(jié)省了大量人力,提高了調(diào)試和測(cè)試系統(tǒng)的效率。本方法不但可用于調(diào)試和測(cè)試階段,而且在產(chǎn)品階段也可以應(yīng)用,由于該系統(tǒng)消耗資源非常少,用戶又可以根據(jù)情況來決定是否啟動(dòng)該功能,因此提高了實(shí)時(shí)操作系統(tǒng)的穩(wěn)定性和可靠性。
權(quán)利要求
1.一種實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法,至少包括如下步驟第一步建立一個(gè)由隊(duì)列項(xiàng)所構(gòu)成的循環(huán)隊(duì)列,所述循環(huán)隊(duì)列有一個(gè)游標(biāo),游標(biāo)所指向的隊(duì)列項(xiàng)為當(dāng)前時(shí)間,游標(biāo)每隔指定時(shí)間,往下走一格;第二步在申請(qǐng)內(nèi)存時(shí),同時(shí)申請(qǐng)內(nèi)存泄漏管理塊,用于填寫相關(guān)信息,并且在所述申請(qǐng)的內(nèi)存頭中附加一個(gè)指針,用于指向內(nèi)存泄漏管理塊;第三步根據(jù)用戶在申請(qǐng)內(nèi)存時(shí)規(guī)定的內(nèi)存最長生存期,計(jì)算出該申請(qǐng)內(nèi)存在循環(huán)隊(duì)列中的位置,并在該位置進(jìn)行注冊(cè),即在該位置掛上內(nèi)存泄漏管理塊,由所有在該位置的內(nèi)存泄漏管理塊組成雙向鏈表。
2.如權(quán)利要求1所述實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法,其特征在于所述內(nèi)存最長生存期超過循環(huán)隊(duì)列總長度,用該生存期整除總長度,從而得到循環(huán)的圈數(shù)。
3.如權(quán)利要求1所述實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法,其特征在于所述循環(huán)隊(duì)列每隔指定時(shí)間,游標(biāo)往下走一格,如果游標(biāo)指向循環(huán)隊(duì)列的隊(duì)列項(xiàng)不為NULL,則遍歷該隊(duì)列項(xiàng)所指向的內(nèi)存泄漏管理塊雙向鏈表;如果循環(huán)圈數(shù)為0,該內(nèi)存泄漏管理塊所指向的內(nèi)存發(fā)生了內(nèi)存泄漏;當(dāng)內(nèi)存使用率大于80%時(shí)就向用戶報(bào)警,并給出內(nèi)存的信息,如內(nèi)存申請(qǐng)的調(diào)用函數(shù)在源代碼的文件和位置行數(shù)。
4.如權(quán)利要求1或2或3所述實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法,其特征在于所述循環(huán)隊(duì)列游標(biāo)的間隔指定時(shí)間為1秒。
5.如權(quán)利要求1或2或3所述實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法,其特征在于所述循環(huán)隊(duì)列的總長度為30分鐘。
6.如權(quán)利要求1或2或3所述實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法,其特征在于所述內(nèi)存泄漏管理塊用C語言定義如下typedef struct T_LeakCheckHead{char*filename;int lineint loop;unsigned char HeadPoiter;struct T_LeakCheckHead*prev;struct T_LeakCheckHead*next;}CLEAKCHECK。
7.如權(quán)利要求1或2或3所述實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法,其特征在于所述循環(huán)隊(duì)列的隊(duì)列項(xiàng)定義如下typedef struct T_queueNode{struct T_LeakCheckHead*leakchkhead;}CQUEUE;
全文摘要
本發(fā)明屬于對(duì)計(jì)算機(jī)性能的改進(jìn),具體涉及一種實(shí)現(xiàn)嵌入式實(shí)時(shí)系統(tǒng)內(nèi)存泄漏檢測(cè)和定位的方法。通過環(huán)形隊(duì)列注冊(cè)內(nèi)存申請(qǐng)、定時(shí)掃描以及用戶自定義內(nèi)存掃描時(shí)間,使得內(nèi)存泄露檢測(cè)所耗系統(tǒng)資源非常少并且不會(huì)出現(xiàn)瞬間的高峰。采用用戶自定義內(nèi)存生存期,就可以減少內(nèi)存泄漏檢查的誤報(bào),并且由于只對(duì)超出了最長生存期的內(nèi)存進(jìn)行報(bào)告,這樣在實(shí)際運(yùn)行中報(bào)告的信息量非常少,大大減少了定位和判斷內(nèi)存泄漏的時(shí)間,從而節(jié)省了大量人力,提高了調(diào)試和測(cè)試系統(tǒng)的效率。本發(fā)明不但可用于調(diào)試和測(cè)試階段,而且在產(chǎn)品階段也可以應(yīng)用,由于該方法系統(tǒng)消耗資源非常少,用戶又可以根據(jù)情況來決定是否啟動(dòng),因此提高了實(shí)時(shí)操作系統(tǒng)的穩(wěn)定性和可靠性。
文檔編號(hào)G06F9/46GK1538300SQ20041000695
公開日2004年10月20日 申請(qǐng)日期2004年3月1日 優(yōu)先權(quán)日2003年9月23日
發(fā)明者王陳, 黃燁明, 危才華, 蘆東昕, 繆敬, 左雪梅, 王 陳 申請(qǐng)人:中興通訊股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
郯城县| 疏附县| 曲麻莱县| 瓦房店市| 禄劝| 准格尔旗| 台江县| 临清市| 青岛市| 长乐市| 和林格尔县| 天全县| 石林| 南投县| 静宁县| 彭阳县| 合川市| 改则县| 凌云县| 新营市| 望江县| 儋州市| 赫章县| 海南省| 桓台县| 铜陵市| 南京市| 铁岭县| 都江堰市| 玛纳斯县| 应用必备| 德昌县| 诸暨市| 甘孜县| 凤翔县| 星子县| 连江县| 莎车县| 西青区| 平定县| 博湖县|