本發(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)利要求范圍決定。