專利名稱:一種通信設備系統中內存泄漏的檢測方法
技術領域:
本發明涉及通信設備系統中的內存泄漏檢測方法,尤其涉及光通訊設備 系統中的內存泄漏檢測方法。
背景技術:
內存泄漏是指分配了內存給某個程序使用,而程序使用完內存后沒有釋 放內存,導致已分配的內存無法回收再利用。隨著程序的運行,系統中可用 的內存就會越來越少,導致系統由于沒有足夠的內存而癱瘓,造成嚴重影響。一般在通信設備中運行的是嵌入式系統,該系統的內存資源很寶貴、有 限。在該系統上的軟件一般都要求長時間不間斷運行,只要泄漏了哪怕是很 少一部分的內存,日積月累下來都可能造成系統的內存不足,最后癱瘓,導 致通信業務中斷。內存泄漏可能是由于開發人員考慮不周,編寫的程序存在隱患沒有及時 釋放內存,也可能是系統出現了異常,沒有釋放內存導致的。 一般而言,在 通信設備系統中運行的應用程序都存在著內存泄漏的危險。目前, 一般使用軟件工具和定義內存塊的生命期來檢測內存泄漏,但這有幾點不足。第一,這些工具大部分都是基于Windows平臺的,必須把應用 程序移植到Windows平臺上才可以使用。第二,這些工具只能在應用程序的 測試階段使用,當應用程序移到了通信設備上運行時則不能使用。有的內存 泄漏在測試階段是難以發現的,往往只有在實際使用中才會出現。第三,很 多情況下內存塊的生命期是難以確定的,有的程序可能需要一直使用內存塊 而不釋放,通過定義內存塊的生命期則會發生誤判。發明內容為了解決上述的技術問題,提供了一種新的內存泄漏檢測方法,其目 的在于,本發明不僅從時間上檢測內存泄漏,而且還從空間上(申請內存塊
的位置,即申請內存塊的代碼所在的文件名和行號)來判斷是否發生了內存泄漏,更加準確的檢測和定位內存泄漏。本發明提供了一種內存泄漏的檢測方法,具有如下步驟步驟1、定義內存塊的使用期、內存塊泄露閾值和檢測過濾表參數,用于為內存泄露檢測提供依據;步驟2、記錄申請內存塊的信息,用于記錄內存塊的使用信息; 步驟3、對內存塊所述參數進行泄露檢測,用于檢測內存是否泄露。 所述內存塊使用期,用于估計程序申請內存塊后使用的時間; 所述內存塊泄露閾值,用于從空間上判斷內存是否發生泄漏; 所述檢測過濾表,用于避免誤判內存泄漏。所述記錄申請內存塊的信息包括申請內存塊的位置信息、分配的時刻和 內存塊使用狀態。所述位置信息使用文件名和文件行號表示,或者使用文件的唯一標識和 文件行號表示,所述內存塊的使用狀態包括空閑和已使用。 所述檢測過濾表記錄程序不會釋放的內存塊的位置信息。 釋放內存塊時,將該內存塊的使用狀態置為空閑。 所述對內存塊進行檢測包括如下具體步驟步驟71、建立內存塊信息塊指針鏈表,將符合條件的內存塊信息添加到 所述內存塊信息塊指針鏈表中;步驟72、統計所述指針鏈表中所述位置信息相同的內存塊數目,并與所 述內存塊泄露閾值進行比較,判斷是否發生了內存泄露。所述步驟71中,所述添加到內存塊信息塊指針鏈表中的內存塊信息包括 所述內存塊的分配時刻、位置信息和使用狀態。所述步驟71中,所述符合條件的內存塊是指該內存塊的使用時間超過所 述使用期,并且該內存塊的位置信息沒有出現在所述檢測過濾表中。所述步驟72中,如果所述指針鏈表中所述位置信息相同的內存塊數目大 于或者等于所述內存塊泄露閾值,則發生了內存泄露,且發生泄漏的位置即 為內存塊信息塊中記錄的內存塊位置信息。采用本發明提供的方法,能夠準確的從時間上,空間上檢測出內存泄漏, 而且具有很大的靈活性。內存塊的使用期可以根據不同的程序使用內存塊情 況而定。當內存塊泄漏閥值定義得比較大時,比如定義為3,適用于檢測出泄漏了大于等于3個內存塊的情況。當內存塊泄漏閥值定義為1時,則只要超過了使用期則認為發生了內存泄漏。假如存在某個程序的確需要很長時間 使用內存塊而不會釋放,則可以把該程序申請內存塊代碼的位置信息添加到 檢測過濾表中,以減少誤判,使得判斷出來的內存泄漏更準確、實用。采用 本發明提供的方法不顯著增加內存塊申請的時間,檢測時只檢測使用時間超 出了使用期的內存塊,不會顯著的影響系統的性能。而且該發明不僅在通信 設備的測試階段使用,還可以在通信設備實際應用階段使用。
圖1是內存泄漏檢測實施例流程圖;圖2是記錄申請內存塊位置信息示意圖;圖3是內存泄漏檢測鏈表圖。
具體實施方式
本發明通過定義內存塊的使用期、內存塊泄漏閥值和檢測過濾表,從時間 和空間上(申請內存塊的位置,即申請內存塊的代碼所在的文件名和行號) 綜合判斷是否發生了內存泄漏。判斷的準則是內存塊的使用時間超出了使用 期,從相同位置申請的內存塊數目大于等于內存塊泄漏闊值,并且申請內存 塊的位置不在過濾檢測表中。本發明所提供的方法的具體步驟如下第一步,定義內存塊的使用期、內存塊泄漏閥值和檢測過濾表。內存塊 使用期是估計程序申請了內存塊后使用的時間,比如一個小時。從分配內存 塊的時刻起,如果在使用期內沒有釋放內存塊,則可能發生了內存泄漏,需 要作進一步的檢測。內存塊泄漏閥值是從空間上判定內存是否發生泄漏的準 貝IJ。當在相同的位置申請的內存塊數大于等于該閥值,并且在使用期內都沒 有釋放內存塊時,則判定發生了內存泄漏。檢測過濾表是為了避免誤判內存 泄漏而定的。檢測過濾表的每個表項即為申請內存塊的位置信息,對于申請 內存塊而不會釋放的程序則把其申請內存塊的位置信息填入該表中,出現在 過濾表中申請的內存塊不認為發生內存泄漏,以避免誤判。
第二步,在分配內存塊的時候記錄申請內存塊的位置信息、分配的時刻 和內存塊狀態(此時內存塊狀態置為已使用)。每一個內存塊對應有一個信息 塊記錄申請內存塊的位置信息、分配的時刻和內存塊的狀態。位置信息可以 通過文件名和文件的行號來表示,也可以通過一種文件的唯一標識和文件行 號來表示。內存塊的狀態包括但不限于空閑和已使用兩種狀態。在釋放內存 塊的時候,無需清除信息塊中申請內存塊的位置等信息,只是把內存塊的狀 態置為空閑即可。第三步,進行內存泄漏檢測時,建立一個內存塊信息塊指針鏈表,遍歷 全部己分配的內存塊信息塊,把使用時間超出使用期,并且申請內存塊的位 置信息不出現在過濾表中的內存塊信息塊添加到該指針鏈表中。第四步,統計該指針鏈表中位置信息相同的內存塊數目,當數目大于等 于內存塊泄漏閥值時則判定發生了內存泄漏。泄漏的位置即為內存塊信息塊 中記錄的申請內存塊位置信息。下面對上述各部分進行詳細說明。下面結合附圖,對本發明做進一步的詳細描述。圖1是本發明所述方法的實施例流程圖,具體的步驟如下第一步,定義內存塊使用期為3600,單位是秒,內存塊泄漏閥值為2, 檢測過濾表為空。第二步,在應用程序中申請內存塊的函數Alloc中記錄申請內存塊的代 碼所在的文件名、文件行號和當前時刻到內存塊信息塊中。在應用程序中釋 放內存塊的函數Free中置內存塊信息塊的內存塊狀態為空閑。如附圖2,當 程序運行到Func函數中申請內存塊的代碼并成功申請到內存塊時,記錄申請 內存塊代碼所在的文件名file.cpp、文件行號和當前時刻到內存塊信息塊中, 并置內存塊信息塊中的狀態為已使用。在Func函數中有兩處代碼調用Alloc 函數,故有兩個內存塊信息塊分別記錄申請內存塊的信息。內存塊信息塊1 記錄的是file.cpp文件中第100行申請的內存塊信息,內存塊信息塊2記錄 的是file.cpp文件中第200行申請的內存塊信息。當程序調用函數Free釋放 內存塊pDatal時,僅把內存塊信息塊2的狀態置為空閑。在Fimc函數結束 前沒有調用Free函數釋放內存塊pData,則pData所指向的內存塊則會發生 泄漏。每調用Func函數一次則會泄漏一個內存塊。第三步,遍歷全部己使用的內存塊信息塊,并把使用時間大于等于使用
期的內存塊信息塊串接成一條檢測鏈表,如附圖3所不。假設建立該鏈表前應用程序已經調用了Func函數3次,并且Func函數中100行申請的內存塊 的使用時間都已經超出了使用期3600秒。由于3次調用了Fimc函數,泄漏 了 3個內存塊,故在檢測鏈表中會出現3個在Func函數中申請的內存塊信息, 如附圖3中所示的內存塊信息塊1,內存塊信息塊2和內存塊信息塊4。假如 檢測過濾表不為空,而是有一個表項為文件名是file.cpp、行號是IOO,則不 會把內存塊信息塊1,內存塊信息塊2和內存塊信息塊4添加到檢測鏈表中。第四步,遍歷如附圖3中所示的檢測鏈表中的內存塊信息塊,統計內存 塊信息塊中文件名、文件行號都相同的內存塊數目,此時統計到文件名為 file.cpp,行號為100的內存塊信息塊數目為3,大于內存塊泄漏閥值2,此 時判定發生了內存泄漏,泄漏的位置即為內存塊信息塊中記錄的文件名 file.cpp,文件行號100行。綜上所述,采用本發明提供的方法,能夠準確的從時間上,空間上檢測 出內存泄漏,而且具有很大的靈活性。內存塊的使用期可以根據不同的程序 使用內存情況而定。當內存塊泄漏閥值定義得比較大時,比如定義為3,適 用于檢測出泄漏了大于等于3個內存塊的情況。當內存塊泄漏閥值定義為1 時,則只要超過了使用期則認為發生了內存泄漏。假如存在某個程序的確需 要很長時間使用內存塊而不會釋放,則可以把該程序申請內存塊代碼的位置 信息添加到檢測過濾表中,以減少誤判,使得判斷出來的內存泄漏更準確、 實用。采用本發明提供的方法不顯著增加內存塊申請的時間,檢測時只檢測 使用時間超出了使用期的內存塊,不會顯著的影響系統的性能。而且該發明 不僅在通信設備的測試階段使用,還可以在通信設備實際應用階段使用。以上所述僅是本發明的優選實施方式,應當指出,對于本技術領域的普 通技術人員來說,在不脫離本發明原理的前提下,還可以作出若干改進和潤 飾,這些改進和潤飾應視為本發明的保護范圍。
權利要求
1.一種內存泄漏的檢測方法,其特征在于,具有如下步驟步驟1、定義內存塊的使用期、內存塊泄露閾值和檢測過濾表參數,用于為內存泄露檢測提供依據;步驟2、記錄申請內存塊的信息,用于記錄內存塊的使用信息;步驟3、對內存塊所述參數進行泄露檢測,用于檢測內存是否泄露。
2. 如權利要求l所述的內存泄漏的檢測方法,其特征在于, 所述內存塊使用期,用于估計程序申請內存塊后使用的時間; 所述內存塊泄露閾值,用于從空間上判斷內存是否發生泄漏; 所述檢測過濾表,用于避免誤判內存泄漏。
3. 如權利要求2所述的內存泄漏的檢測方法,其特征在于,所述記錄申 請內存塊的信息包括申請內存塊的位置信息、分配的時刻和內存塊使用狀態。
4. 如權利要求3所述的內存泄漏的檢測方法,其特征在于,所述位置信 息使用文件名和文件行號表示,或者使用文件的唯一標識和文件行號表示, 所述內存塊的使用狀態包括空閑和已使用。
5. 如權利要求4所述的內存泄漏的檢測方法,其特征在于,所述檢測過 濾表記錄程序不會釋放的內存塊的位置信息。
6. 如權利要求1至5之一所述的內存泄漏的檢測方法,其特征在于,釋 放內存塊時,將該內存塊的使用狀態置為空閑。
7. 如權利要求1至5之一所述的內存泄漏的檢測方法,其特征在于,所 述對內存塊進行檢測包括如下具體步驟步驟71、建立內存塊信息塊指針鏈表,將符合條件的內存塊信息添加到 所述內存塊信息塊指針鏈表中;步驟72、統計所述指針鏈表中所述位置信息相同的內存塊數目,并與所 述內存塊泄露閾值進行比較,判斷是否發生了內存泄露。
8. 如權利要求7所述的內存泄漏的檢測方法,其特征在于,所述步驟 71中,所述添加到內存塊信息塊指針鏈表中的內存塊信息包括所述內存塊的 分配時刻、位置信息和使用狀態。
9. 如權利要求7所述的內存泄漏的檢測方法,其特征在于,所述步驟 71中,所述符合條件的內存塊是指該內存塊的使用時間超過所述使用期,并 且該內存塊的位置信息沒有出現在所述檢測過濾表中。
10.如權利要求7所述的內存泄漏的檢測方法,其特征在于,所述步驟 72中,如果所述指針鏈表中所述位置信息相同的內存塊數目大于或者等于所 述內存塊泄露閾值,則發生了內存泄露,且發生泄漏的位置即為內存塊信息 塊中記錄的內存塊位置信息。
全文摘要
本發明涉及一種內存泄漏的檢測方法,具有如下步驟步驟1.定義內存塊的使用期、內存塊泄露閾值和檢測過濾表參數,用于為內存泄露檢測提供依據;步驟2.記錄申請內存塊的信息,用于記錄內存塊的使用信息;步驟3.對內存塊所述參數進行泄露檢測,用于檢測內存是否泄露。采用本發明提供的方法,能夠準確的從時間上,空間上檢測出內存泄漏,而且具有很大的靈活性。
文檔編號G06F11/34GK101162436SQ200610113759
公開日2008年4月16日 申請日期2006年10月13日 優先權日2006年10月13日
發明者李小偉, 黃海倫 申請人:中興通訊股份有限公司