亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種內(nèi)存泄露的定位方法及系統(tǒng)與流程

文檔序號:12665651閱讀:307來源:國知局
一種內(nèi)存泄露的定位方法及系統(tǒng)與流程

本發(fā)明實施例涉及測試技術(shù)領(lǐng)域,尤其涉及一種內(nèi)存泄露的定位方法及系統(tǒng)。



背景技術(shù):

在計算機科學(xué)中,內(nèi)存泄漏是指由于疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。內(nèi)存泄漏并非指內(nèi)存在物理上的消失,而是應(yīng)用程序分配某段內(nèi)存后,由于程序設(shè)計錯誤,失去了對該段內(nèi)存的控制,導(dǎo)致該段內(nèi)存不能被再次使用,因而造成了內(nèi)存的浪費。

一個小的內(nèi)存泄露可能不需要太注意,但是若程序泄露大塊內(nèi)存,或者漸增式的泄露內(nèi)存會引起下述現(xiàn)象:先是系統(tǒng)性能降低,然后引起復(fù)雜的內(nèi)存耗盡錯誤;最壞的情況是,一個內(nèi)存泄露程序可能用完了非常多的內(nèi)存而引起其他程序出錯,而用戶不能知道錯誤到底來自哪里。另外,一個看上去危害不大的內(nèi)存泄露,可能是另一個問題的先兆。因此,要盡量避免內(nèi)存泄露現(xiàn)象的發(fā)生,要避免內(nèi)存泄露,除了要求編程人員具有良好的編碼習(xí)慣和編碼規(guī)范之外,關(guān)鍵還要從程序代碼上入手,對內(nèi)存泄露進行高效、可靠的定位檢測,一旦發(fā)現(xiàn)程序異常,方便編程人員對程序進行必要的修改。



技術(shù)實現(xiàn)要素:

本發(fā)明實施例提供了一種內(nèi)存泄露的定位方法及系統(tǒng),以實現(xiàn)快速定位內(nèi)存泄露的源代碼位置。

第一方面,本發(fā)明實施例提供了一種內(nèi)存泄露的定位方法,該方法包括:

在監(jiān)測到申請內(nèi)存操作時,獲取針對申請而分配內(nèi)存的身份信息;

將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息;

在監(jiān)測到釋放內(nèi)存操作時,根據(jù)釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除;

根據(jù)所述循環(huán)鏈表中剩余的節(jié)點信息定位泄露的內(nèi)存。

進一步地,所述在監(jiān)測到申請內(nèi)存操作時,獲取針對申請而分配內(nèi)存的身份信息,包括:

在監(jiān)測到調(diào)用內(nèi)存申請函數(shù)來申請內(nèi)存時,確定存在申請內(nèi)存操作;

通過重載內(nèi)存申請函數(shù)獲取針對申請所分配內(nèi)存的身份信息。

進一步地,將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息之前,還包括:

檢測所述預(yù)設(shè)的循環(huán)鏈表是否已經(jīng)存在,若是則執(zhí)行將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息的操作,否則,創(chuàng)建預(yù)設(shè)的循環(huán)鏈表以及循環(huán)鏈表節(jié)點。

進一步地,所述在監(jiān)測到釋放內(nèi)存操作時,根據(jù)釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除,包括:

在監(jiān)測到調(diào)用內(nèi)存釋放函數(shù)來釋放內(nèi)存時,確定存在釋放內(nèi)存操作;

通過重載內(nèi)存釋放函數(shù)獲取釋放內(nèi)存的身份信息;

根據(jù)所述釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除。

進一步地,所述根據(jù)所述循環(huán)鏈表中剩余的節(jié)點信息定位泄露的內(nèi)存,包括:

當接收到設(shè)定觸發(fā)指令時,將所述循環(huán)鏈表中剩余的節(jié)點信息以文件的形式記錄到文件系統(tǒng)中,以供查詢泄露的內(nèi)存。

進一步地,所述身份信息包括:調(diào)用內(nèi)存申請函數(shù)的文件名、調(diào)用內(nèi)存申請函數(shù)的函數(shù)名、申請成功的內(nèi)存地址、內(nèi)存申請時間和源代碼行位置信息中的至少一項。

第二方面,本發(fā)明實施例還提供了一種內(nèi)存泄露的定位系統(tǒng),該系統(tǒng)包括:

獲取模塊,用于在監(jiān)測到申請內(nèi)存操作時,獲取針對申請而分配內(nèi)存的身份信息;

保存模塊,用于將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息;

刪除模塊,用于在監(jiān)測到釋放內(nèi)存操作時,根據(jù)釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除;

定位模塊,用于根據(jù)所述循環(huán)鏈表中剩余的節(jié)點信息定位泄露的內(nèi)存。

進一步地,所述獲取模塊包括:申請內(nèi)存操作確定單元,用于在監(jiān)測到調(diào)用內(nèi)存申請函數(shù)來申請內(nèi)存時,確定存在申請內(nèi)存操作;第一獲取單元,用于通過重載內(nèi)存申請函數(shù)獲取針對申請所分配內(nèi)存的身份信息;

所述刪除模塊包括:釋放內(nèi)存操作確定單元,用于在監(jiān)測到調(diào)用內(nèi)存釋放函數(shù)來釋放內(nèi)存時,確定存在釋放內(nèi)存操作;第二獲取單元,用于通過重載內(nèi)存釋放函數(shù)獲取釋放內(nèi)存的身份信息;刪除單元,用于根據(jù)所述釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除;

所述定位模塊具體用于當接收到設(shè)定觸發(fā)指令時,將所述循環(huán)鏈表中剩余的節(jié)點信息以文件的形式記錄到文件系統(tǒng)中,以供查詢泄露的內(nèi)存;

所述身份信息包括:調(diào)用內(nèi)存申請函數(shù)的文件名、調(diào)用內(nèi)存申請函數(shù)的函數(shù)名、申請成功的內(nèi)存地址、內(nèi)存申請時間和源代碼行位置信息中的至少一項。

進一步地,所述系統(tǒng)還包括:

檢測模塊,用于在將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息之前,檢測所述預(yù)設(shè)的循環(huán)鏈表是否已經(jīng)存在,若是則執(zhí)行將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息的操作,否則,創(chuàng)建預(yù)設(shè)的循環(huán)鏈表以及循環(huán)鏈表節(jié)點。

本發(fā)明實施例提供的一種內(nèi)存泄露的定位方法,通過在監(jiān)測到申請內(nèi)存操作時,獲取針對申請而分配內(nèi)存的身份信息,并將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息;在監(jiān)測到釋放內(nèi)存操作時,根據(jù)釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除;最后根據(jù)所述循環(huán)鏈表中剩余的節(jié)點信息定位泄露的內(nèi)存的技術(shù)手段,實現(xiàn)了快速且有效地定位內(nèi)存泄露的源代碼位置的目的。

附圖說明

圖1是本發(fā)明實施例一提供的一種內(nèi)存泄露的定位方法流程示意圖;

圖2是本發(fā)明實施例二提供的一種內(nèi)存泄露的定位方法流程示意圖;

圖3是本發(fā)明實施例三提供的一種內(nèi)存泄露的定位方法流程示意圖;

圖4是本發(fā)明實施例四提供的一種內(nèi)存泄露的定位方法流程示意圖;

圖5是本發(fā)明實施例四提供的一種在應(yīng)用程序的主程序中內(nèi)存申請操作的流程示意圖;

圖6是本發(fā)明實施例四提供的一種在應(yīng)用程序的主程序中內(nèi)存釋放操作的流程示意圖;

圖7是本發(fā)明實施例四提供的一種在應(yīng)用程序的主程序中內(nèi)存查看操作的流程示意圖;

圖8是本發(fā)明實施例五提供的一種內(nèi)存泄露的定位系統(tǒng)結(jié)構(gòu)示意圖。

具體實施方式

下面結(jié)合附圖和實施例對本發(fā)明作進一步的詳細說明??梢岳斫獾氖?,此處所描述的具體實施例僅僅用于解釋本發(fā)明,而非對本發(fā)明的限定。另外還需要說明的是,為了便于描述,附圖中僅示出了與本發(fā)明相關(guān)的部分而非全部結(jié)構(gòu)。

在更加詳細地討論示例性實施例之前應(yīng)當提到的是,一些示例性實施例被描述成作為流程圖描繪的處理或方法。雖然流程圖將各項步驟描述成順序的處理,但是其中的許多步驟可以被并行地、并發(fā)地或者同時實施。此外,各項步驟的順序可以被重新安排。當其步驟完成時所述處理可以被終止,但是還可以具有未包括在附圖中的附加步驟。所述處理可以對應(yīng)于方法、函數(shù)、規(guī)程、子例程、子程序等等。

實施例一

圖1為本發(fā)明實施例一提供的一種內(nèi)存泄露的定位方法流程圖,該方法可適用于在程序調(diào)試階段對程序中泄露的內(nèi)存進行快速查找與定位的情況,可以由內(nèi)存泄露的定位系統(tǒng)來執(zhí)行。該系統(tǒng)可通過硬件和/或軟件的方式實現(xiàn)。該方法具體包括如下步驟:

步驟110、在監(jiān)測到申請內(nèi)存操作時,獲取針對申請而分配內(nèi)存的身份信息。

通常,根據(jù)所使用的編程語言會有很多已經(jīng)存在的可以直接調(diào)用的標準庫函數(shù),因此在軟件程序中可以直接調(diào)用實現(xiàn)某一具體功能的庫函數(shù),當不存在需要的庫函數(shù)時,還可以自定義一些功能函數(shù),在需要時,直接調(diào)用相應(yīng)的功能函數(shù)即可。

例如可以通過調(diào)用內(nèi)存申請函數(shù)來實現(xiàn)申請內(nèi)存的功能,在C語言中,要申請一個動態(tài)內(nèi)存需要包含一個頭文件即“#include<malloc.h>”或者“#include<stdlib.h>”,然后就可以直接調(diào)用申請內(nèi)存的庫函數(shù)實現(xiàn)申請內(nèi)存的目的,如通過代碼“void*malloc(usigned size)”即可獲得動態(tài)分配的內(nèi)存,malloc函數(shù)的參數(shù)是需要申請的內(nèi)存大小,可以進行設(shè)置;該函數(shù)的返回值是申請到的內(nèi)存的首地址,返回的內(nèi)存類型是void,可以根據(jù)需要進行返回類型轉(zhuǎn)換。在C++中要實現(xiàn)申請內(nèi)存的功能則更簡單一些,需要包含頭文件“#include<iostream.h>”,這樣在申請內(nèi)存時則不需要調(diào)用相應(yīng)的函數(shù),只要一個關(guān)鍵字new即可,如“int*x;x=new int[]”,這樣就申請到了一個整型的內(nèi)存空間。當程序中出現(xiàn)這些特定的關(guān)鍵字或者內(nèi)存申請函數(shù)時,則認為監(jiān)測到了申請內(nèi)存操作,進而獲取針對申請而分配內(nèi)存的身份信息。

優(yōu)選的,所述身份信息包括:調(diào)用內(nèi)存申請函數(shù)的文件名、調(diào)用內(nèi)存申請函數(shù)的函數(shù)名、申請成功的內(nèi)存地址、內(nèi)存申請時間和源代碼行位置信息中的至少一項。

具體的,可以通過重載內(nèi)存申請函數(shù)的形參獲取所述身份信息,具體過程在本發(fā)明實施例二中進行解釋說明。

步驟120、將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息。

其中,所述循環(huán)鏈表是一種形式的鏈式存儲結(jié)構(gòu),其特點是表中最后一個節(jié)點的指針指向頭節(jié)點,即表中第一個節(jié)點,整個鏈表形成一個環(huán),這樣無論是從表中的哪個節(jié)點開始進行遍歷操作,都可以遍歷表中的所有節(jié)點,這是非循環(huán)鏈表不能實現(xiàn)的。

步驟130、在監(jiān)測到釋放內(nèi)存操作時,根據(jù)釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除。

具體的,與申請內(nèi)存類似,釋放內(nèi)存可以通過直接調(diào)用內(nèi)存釋放函數(shù)實現(xiàn),例如,如果申請內(nèi)存時是通過調(diào)用“malloc”或“realloc”函數(shù)實現(xiàn)的,則釋放內(nèi)存時可以通過調(diào)用“free”庫函數(shù)實現(xiàn);如果申請內(nèi)存時是通過關(guān)鍵字“new”實現(xiàn)的,則釋放內(nèi)存時可以通過“delete”語句實現(xiàn)。當然還可以是其它的申請/釋放內(nèi)存的函數(shù),本實施例并不對其進行限定。

當監(jiān)測到上述釋放內(nèi)存的函數(shù)或者關(guān)鍵字時,則認為監(jiān)測到了釋放內(nèi)存的操作;由于被釋放的內(nèi)存地址信息與當初申請成功的內(nèi)存地址信息是一一對應(yīng)的,且是唯一的,因此,優(yōu)選的,可以根據(jù)被釋放的內(nèi)存地址信息遍歷所述循環(huán)鏈表,查找與被釋放的內(nèi)存地址信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除,以標記該段內(nèi)存沒有被泄露。

步驟140、根據(jù)所述循環(huán)鏈表中剩余的節(jié)點信息定位泄露的內(nèi)存。

每申請一段內(nèi)存,都將申請的內(nèi)存身份信息保存到預(yù)設(shè)的循環(huán)鏈表中,每釋放一段內(nèi)存,都將循環(huán)鏈表中保存的與被釋放的內(nèi)存相匹配的內(nèi)存身份信息刪除,表示該段內(nèi)存已經(jīng)被釋放,不存在內(nèi)存泄露的情況,因此,循環(huán)鏈表中剩余的沒有被刪除的節(jié)點信息就是內(nèi)存泄露的身份信息,可以根據(jù)該身份信息定位到泄露的內(nèi)存,以實現(xiàn)對內(nèi)存泄露的快速定位。

本實施例提供的一種內(nèi)存泄露的定位方法,通過在監(jiān)測到申請內(nèi)存操作時,獲取針對申請而分配內(nèi)存的身份信息,并將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息;在監(jiān)測到釋放內(nèi)存操作時,根據(jù)釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除;最后根據(jù)所述循環(huán)鏈表中剩余的節(jié)點信息定位泄露的內(nèi)存的技術(shù)手段,實現(xiàn)了快速且有效地定位內(nèi)存泄露的源代碼位置的目的。

實施例二

圖2為本發(fā)明實施例二提供的一種內(nèi)存泄露的定位方法流程示意圖,在實施例一的基礎(chǔ)上,本實施例對進行了進一步優(yōu)化,具體參見圖2所示,該方法具體包括如下:

步驟210、在監(jiān)測到調(diào)用內(nèi)存申請函數(shù)來申請內(nèi)存時,確定存在申請內(nèi)存操作。

步驟220、通過重載內(nèi)存申請函數(shù)獲取針對申請所分配內(nèi)存的身份信息。

其中,重載函數(shù)是函數(shù)的一種特殊情況,即允許在同一聲明域中聲明幾個功能類似的同名函數(shù),但是這些同名函數(shù)的形式參數(shù)必須不同,所述形式參數(shù)具體可以是指參數(shù)的個數(shù),類型,或者順序等,也就是同一個運算符完成不同的運算功能。

因此,可以通過設(shè)置重載內(nèi)存申請函數(shù)的形式參數(shù),通過所設(shè)置的參數(shù)獲取針對內(nèi)存申請函數(shù)所分配內(nèi)存的身份信息,所述身份信息例如是調(diào)用內(nèi)存申請函數(shù)的文件名、調(diào)用內(nèi)存申請函數(shù)的函數(shù)名、申請成功的內(nèi)存地址、內(nèi)存申請時間或者源代碼行位置信息等。

步驟230、檢測預(yù)設(shè)的循環(huán)鏈表是否已經(jīng)存在,若是則執(zhí)行步驟250,否則,執(zhí)行步驟240。

步驟240、創(chuàng)建預(yù)設(shè)的循環(huán)鏈表以及循環(huán)鏈表節(jié)點。

步驟250、將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息。

步驟260、在監(jiān)測到釋放內(nèi)存操作時,根據(jù)釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除。

步驟270、根據(jù)所述循環(huán)鏈表中剩余的節(jié)點信息定位泄露的內(nèi)存。

本實施例提供的一種內(nèi)存泄露的定位方法,在上述實施例技術(shù)方案的基礎(chǔ)上,將“在監(jiān)測到申請內(nèi)存操作時,獲取針對申請而分配內(nèi)存的身份信息”的操作優(yōu)化為“當監(jiān)測到調(diào)用內(nèi)存申請函數(shù)來申請內(nèi)存時,確定存在申請內(nèi)存操作,通過重載內(nèi)存申請函數(shù)獲取針對申請所分配內(nèi)存的身份信息”,實現(xiàn)了及時、準確地獲取分配內(nèi)存的身份信息的目的,進而實現(xiàn)了快速定位內(nèi)存泄露源碼位置的目的。

實施例三

圖3為本發(fā)明實施例三提供的一種內(nèi)存泄露的定位方法流程示意圖,在上述各實施例的基礎(chǔ)上,本實施例進行了進一步優(yōu)化,具體參見圖3所示,該方法具體如下:

步驟310、在監(jiān)測到申請內(nèi)存操作時,獲取針對申請而分配內(nèi)存的身份信息。

步驟320、將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息。

步驟330、在監(jiān)測到調(diào)用內(nèi)存釋放函數(shù)來釋放內(nèi)存時,確定存在釋放內(nèi)存操作。

步驟340、通過重載內(nèi)存釋放函數(shù)獲取釋放內(nèi)存的身份信息。

步驟350、根據(jù)所述釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除。

步驟360、根據(jù)所述循環(huán)鏈表中剩余的節(jié)點信息定位泄露的內(nèi)存。

本實施例提供的一種內(nèi)存泄露的定位方法,在上述實施例技術(shù)方案的基礎(chǔ)上,將“在監(jiān)測到釋放內(nèi)存操作時,獲取釋放內(nèi)存的身份信息”的操作優(yōu)化為“在監(jiān)測到調(diào)用內(nèi)存釋放函數(shù)來釋放內(nèi)存時,確定存在釋放內(nèi)存操作,通過重載內(nèi)存釋放函數(shù)獲取釋放內(nèi)存的身份信息”,實現(xiàn)了及時、準確地獲取釋放內(nèi)存的身份信息的目的,進而實現(xiàn)了快速定位內(nèi)存泄露源碼位置的目的。

實施例四

圖4為本發(fā)明實施例四提供的一種內(nèi)存泄露的定位方法流程示意圖,在上述各實施例的基礎(chǔ)上,本實施例進行了進一步優(yōu)化,具體參見圖4所示,該方法具體如下:

步驟410、在監(jiān)測到申請內(nèi)存操作時,獲取針對申請而分配內(nèi)存的身份信息。

步驟420、將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息。

步驟430、在監(jiān)測到釋放內(nèi)存操作時,根據(jù)釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除。

步驟440、當接收到設(shè)定觸發(fā)指令時,將所述循環(huán)鏈表中剩余的節(jié)點信息以文件的形式記錄到文件系統(tǒng)中,以供查詢泄露的內(nèi)存。

具體的,所述設(shè)定觸發(fā)指令可以是通過某個物理按鍵觸發(fā)的指令,或者是程序運行到了某個特殊的流程觸發(fā)的指令,例如所述特殊的流程可以是進入一個特定的程序模塊,或者退出一個特定的程序模塊。

通過將所述循環(huán)鏈表中剩余的節(jié)點信息以文件的形式記錄到文件系統(tǒng)中,方便了相關(guān)工作人員對泄露的內(nèi)存進行查詢。

本實施例提供的一種內(nèi)存泄露的定位方法,在上述實施例技術(shù)方案的基礎(chǔ)上,將“根據(jù)所述循環(huán)鏈表中剩余的節(jié)點信息定位泄露的內(nèi)存”的操作優(yōu)化為“當接收到設(shè)定觸發(fā)指令時,將所述循環(huán)鏈表中剩余的節(jié)點信息以文件的形式記錄到文件系統(tǒng)中,以供查詢泄露的內(nèi)存”,方便了工作人員對泄露的內(nèi)存進行查詢定位,進而實現(xiàn)了快速定位內(nèi)存泄露源碼位置的目的。

在上述各實施例的基礎(chǔ)上,進一步地,可以將本發(fā)明實施例提供的內(nèi)存泄露的定位方案嵌套到應(yīng)用程序的主程序中,通過設(shè)置一個內(nèi)存檢測開關(guān)對是否編譯此內(nèi)存泄露的定位程序段進行控制,在應(yīng)用程序正常運行的狀態(tài)下可以通過關(guān)閉內(nèi)存檢測開關(guān)來將內(nèi)存泄露的定位程序段進行屏蔽,即編譯器不對內(nèi)存泄露的定位程序段進行編譯,這樣就不會占用系統(tǒng)資源,也不會影響應(yīng)用程序的編譯速度;當發(fā)現(xiàn)應(yīng)用程序運行不正常,需要對應(yīng)用程序進行內(nèi)存泄露的檢測與定位時,可以打開所述內(nèi)存檢測開關(guān),在應(yīng)用程序運行的過程中同時對內(nèi)存泄露的定位程序段進行運行編譯,即可實現(xiàn)快速定位應(yīng)用程序中泄露的內(nèi)存的目的。所述內(nèi)存檢測開關(guān)優(yōu)選為宏開關(guān)。

具體的,可以參見圖5所示的在應(yīng)用程序的主程序中內(nèi)存申請操作的流程示意圖,圖6所示的在應(yīng)用程序的主程序中內(nèi)存釋放操作的流程示意圖,圖7所示的在應(yīng)用程序的主程序中內(nèi)存查看操作的流程示意圖;流程圖中最后的“返回”操作表示返回到應(yīng)用程序的主程序中,繼續(xù)執(zhí)行其他的程序代碼。

實施例五

圖8為本發(fā)明實施例五提供的一種內(nèi)存泄露的定位系統(tǒng)的結(jié)構(gòu)示意圖,具體參見圖8所示,該系統(tǒng)具體包括如下:

獲取模塊810、保存模塊820、刪除模塊830和定位模塊840;

其中,獲取模塊810,用于在監(jiān)測到申請內(nèi)存操作時,獲取針對申請而分配內(nèi)存的身份信息;保存模塊820,用于將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息;刪除模塊830,用于在監(jiān)測到釋放內(nèi)存操作時,根據(jù)釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除;定位模塊840,用于根據(jù)所述循環(huán)鏈表中剩余的節(jié)點信息定位泄露的內(nèi)存。

進一步地,獲取模塊810包括:申請內(nèi)存操作確定單元,用于在監(jiān)測到調(diào)用內(nèi)存申請函數(shù)來申請內(nèi)存時,確定存在申請內(nèi)存操作;第一獲取單元,用于通過重載內(nèi)存申請函數(shù)獲取針對申請所分配內(nèi)存的身份信息。

進一步地,刪除模塊830包括:釋放內(nèi)存操作確定單元,用于在監(jiān)測到調(diào)用內(nèi)存釋放函數(shù)來釋放內(nèi)存時,確定存在釋放內(nèi)存操作;第二獲取單元,用于通過重載內(nèi)存釋放函數(shù)獲取釋放內(nèi)存的身份信息;刪除單元,用于根據(jù)所述釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除。

進一步地,定位模塊840具體用于當接收到設(shè)定觸發(fā)指令時,將所述循環(huán)鏈表中剩余的節(jié)點信息以文件的形式記錄到文件系統(tǒng)中,以供查詢泄露的內(nèi)存。

進一步地,所述身份信息包括:調(diào)用內(nèi)存申請函數(shù)的文件名、調(diào)用內(nèi)存申請函數(shù)的函數(shù)名、申請成功的內(nèi)存地址、內(nèi)存申請時間和源代碼行位置信息中的至少一項。

進一步地,所述系統(tǒng)還包括:

檢測模塊,用于在將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息之前,檢測所述預(yù)設(shè)的循環(huán)鏈表是否已經(jīng)存在,若是則執(zhí)行將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息的操作,否則,創(chuàng)建預(yù)設(shè)的循環(huán)鏈表以及循環(huán)鏈表節(jié)點。

本實施例提供的一種內(nèi)存泄露的定位系統(tǒng),通過在監(jiān)測到申請內(nèi)存操作時,獲取針對申請而分配內(nèi)存的身份信息,并將所述身份信息保存到預(yù)設(shè)的循環(huán)鏈表節(jié)點中,生成節(jié)點信息;在監(jiān)測到釋放內(nèi)存操作時,根據(jù)釋放內(nèi)存的身份信息遍歷所述循環(huán)鏈表,查找與所述釋放內(nèi)存的身份信息相匹配的節(jié)點信息,并將查找到的節(jié)點信息從所述循環(huán)鏈表中刪除;最后根據(jù)所述循環(huán)鏈表中剩余的節(jié)點信息定位泄露的內(nèi)存的技術(shù)手段,實現(xiàn)了快速且有效地定位內(nèi)存泄露的源代碼位置的目的。

上述產(chǎn)品可執(zhí)行本發(fā)明任意實施例所提供的方法,具備執(zhí)行方法相應(yīng)的功能模塊和有益效果。未在本實施例中詳盡描述的技術(shù)細節(jié),可參見本發(fā)明任意實施例所提供的方法。

注意,上述僅為本發(fā)明的較佳實施例及所運用技術(shù)原理。本領(lǐng)域技術(shù)人員會理解,本發(fā)明不限于這里所述的特定實施例,對本領(lǐng)域技術(shù)人員來說能夠進行各種明顯的變化、重新調(diào)整和替代而不會脫離本發(fā)明的保護范圍。因此,雖然通過以上實施例對本發(fā)明進行了較為詳細的說明,但是本發(fā)明不僅僅限于以上實施例,在不脫離本發(fā)明構(gòu)思的情況下,還可以包括更多其他等效實施例,而本發(fā)明的范圍由所附的權(quán)利要求范圍決定。

當前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1