專利名稱:一種嵌入式系統(tǒng)內(nèi)存泄露的檢測方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種內(nèi)存處理方法,具體地說,是涉及一種對嵌入式系統(tǒng)內(nèi)存泄露進(jìn)
行檢測的方法,屬于嵌入式系統(tǒng)技術(shù)領(lǐng)域。
背景技術(shù):
對于內(nèi)存泄露,一般是指堆內(nèi)存的泄露。堆內(nèi)存,是指應(yīng)用程序在運(yùn)行過程中,利 用一些特定的函數(shù)從堆中分配的、而在使用完畢后再通過特定的函數(shù)予以釋放的內(nèi)存。如 果應(yīng)用程序在使用完堆內(nèi)存后沒有將其釋放,則這塊內(nèi)存就不能被再次使用,就認(rèn)為這塊 內(nèi)存泄露了。 根據(jù)其發(fā)生的方式來分,內(nèi)存泄露可以分為下述4類 (1)常發(fā)性內(nèi)存泄露發(fā)生內(nèi)存泄露的函數(shù)代碼會被多次執(zhí)行到,每次被執(zhí)行的 時候都會導(dǎo)致一塊內(nèi)存泄露。 (2)偶發(fā)性內(nèi)存泄露發(fā)生內(nèi)存泄露的函數(shù)代碼只有在某些特定環(huán)境或操作過程 下才會發(fā)生。 常發(fā)性和偶發(fā)性是相對的,對于特定的環(huán)境,偶發(fā)性也許就會變成常發(fā)性。
(3) —次性內(nèi)存泄露發(fā)生內(nèi)存泄露的函數(shù)代碼只會被執(zhí)行一次;或者由于算法 上的缺陷,導(dǎo)致總會有一塊且僅有一塊內(nèi)存發(fā)生泄露。比如,在類的構(gòu)造函數(shù)中分配內(nèi)存, 在析構(gòu)函數(shù)中卻沒有釋放該內(nèi)存,所以內(nèi)存泄露只會發(fā)生一次。
(4)隱式內(nèi)存泄露程序在運(yùn)行過程中不停地分配內(nèi)存,但是直到結(jié)束的時候才
釋放內(nèi)存。嚴(yán)格地說,此時并沒有發(fā)生內(nèi)存泄露,因為最終程序釋放了所有申請的內(nèi)存。但
是對于一個服務(wù)器程序來說,需要運(yùn)行幾天、幾周甚至幾個月,若不及時釋放內(nèi)存,也可能
導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存,因此,對于這類內(nèi)存泄露,稱之為隱式內(nèi)存泄露。
內(nèi)存泄露時,將會導(dǎo)致內(nèi)存空間的浪費(fè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)存泄露進(jìn)行高效、可靠的檢測。目前常用的內(nèi)存泄露檢測方法
是為內(nèi)存分配函數(shù)和內(nèi)存釋放函數(shù)提供debug版本,跟蹤內(nèi)存的分配和釋放;程序調(diào)試人
員手動調(diào)用或者在程序結(jié)束時自動調(diào)用內(nèi)存泄露信息顯示函數(shù),根據(jù)跟蹤結(jié)果顯示內(nèi)存地
址、內(nèi)存塊的大小及內(nèi)存中的內(nèi)容等信息。但是,這種傳統(tǒng)的內(nèi)存泄露檢測方法在嵌入式系
統(tǒng)中使用時存在下述缺陷 第一,嵌入式系統(tǒng)中的軟件一般是啟動后一直在運(yùn)行,通過斷電方式結(jié)束程序的
運(yùn)行,因此,無法預(yù)知程序何時結(jié)束,也就無法執(zhí)行相應(yīng)的內(nèi)存泄露檢測程序。
第二,嵌入式系統(tǒng)中內(nèi)存的分配和釋放,不一定是在同一個文件中,也不一定是在
3同一個模塊中,也可能分配后永遠(yuǎn)不釋放,這依賴于設(shè)計時的邏輯,而內(nèi)存泄露檢測模塊無 法知曉。因此,內(nèi)存檢測時無法提供準(zhǔn)確的內(nèi)存泄露信息,可能會發(fā)生內(nèi)存泄露誤報的問 題。 第三,在嵌入式系統(tǒng)中無法檢測內(nèi)存誤釋放的問題,由于指針使用錯誤,有可能會 在不應(yīng)該釋放內(nèi)存的地方進(jìn)行了釋放,從而可能導(dǎo)致程序運(yùn)行錯誤或者崩潰。
發(fā)明內(nèi)容
本發(fā)明針對現(xiàn)有技術(shù)中的內(nèi)存泄露檢測方法在嵌入式系統(tǒng)軟件開發(fā)過程中存在 的配置不靈活、使用不方便、容易發(fā)生內(nèi)存泄露誤報和誤釋放的問題,提供了一種內(nèi)存泄露 的檢測方法,利用該方法,可實現(xiàn)對嵌入式系統(tǒng)內(nèi)存泄露的分區(qū)檢測,方法使用靈活、檢測 效率較高。 為解決上述技術(shù)問題,本發(fā)明采用以下技術(shù)方案予以實現(xiàn) —種嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,包括跟蹤內(nèi)存分配的過程和跟蹤內(nèi)存釋放 的過程的步驟,以及根據(jù)跟蹤結(jié)果進(jìn)行內(nèi)存泄露檢測的步驟; 所述內(nèi)存分配的過程包括通過內(nèi)存分配函數(shù)的參數(shù)獲取該內(nèi)存分配函數(shù)分配的
內(nèi)存所對應(yīng)的內(nèi)存釋放范圍類型信息及內(nèi)存釋放位置信息并進(jìn)行保存的步驟; 所述內(nèi)存釋放的過程包括根據(jù)所述的內(nèi)存釋放范圍類型信息及內(nèi)存釋放位置信
息判斷內(nèi)存是否有效,并在內(nèi)存有效時釋放該內(nèi)存的步驟。 根據(jù)本發(fā)明,所述內(nèi)存釋放范圍類型具體包括下述8類本函數(shù)內(nèi),本文件內(nèi),本
文件夾內(nèi),本應(yīng)用程序中,其他函數(shù)內(nèi),其他文件內(nèi),其他文件夾內(nèi)以及不釋放。 根據(jù)本發(fā)明,在所述內(nèi)存釋放范圍類型為本函數(shù)內(nèi)、本文件內(nèi)、本文件夾內(nèi)、本應(yīng)
用程序中及不釋放時,所述內(nèi)存釋放位置的值無效;在所述內(nèi)存釋放范圍類型為其他函數(shù)
內(nèi)時,所述內(nèi)存釋放位置的值為相應(yīng)的函數(shù)名稱;在所述內(nèi)存釋放范圍類型為其他文件內(nèi)
時,所述內(nèi)存釋放位置的值為相應(yīng)的文件名稱;在所述內(nèi)存釋放范圍類型為其他文件夾內(nèi)
時,所述內(nèi)存釋放位置的值為相應(yīng)的文件夾名稱。 根據(jù)本發(fā)明,為便于跟蹤內(nèi)存泄露的位置及發(fā)生泄露的條件,所述內(nèi)存分配的過 程還包括下述步驟 通過內(nèi)存分配函數(shù)的參數(shù)獲取并保存內(nèi)存分配函數(shù)所在的文件名、代碼行號及函 數(shù)名信息; 查找與所述文件名和代碼行號相對應(yīng)的最大內(nèi)存分配編號,將所述最大內(nèi)存分配 編號加l,作為當(dāng)前分配的內(nèi)存的內(nèi)存分配編號。 根據(jù)本發(fā)明,為有效防止隱式內(nèi)存泄露造成的內(nèi)存消耗,在所述跟蹤內(nèi)存分配的 過程中,若檢測到內(nèi)存分配編號超過設(shè)定值,則輸出相應(yīng)的報警信號。 根據(jù)本發(fā)明,為便于使用,所述內(nèi)存釋放范圍類型信息、內(nèi)存釋放位置信息、內(nèi)存
分配函數(shù)所在的文件名、代碼行號及函數(shù)名信息以數(shù)據(jù)結(jié)構(gòu)的形式存在于內(nèi)存中。 根據(jù)本發(fā)明,為提高數(shù)據(jù)的安全性和管理的高效性,所述數(shù)據(jù)結(jié)構(gòu)中還包括有校
驗碼,所述校驗碼的值在內(nèi)存分配過程中根據(jù)所述內(nèi)存釋放范圍類型信息、內(nèi)存釋放位置
信息、內(nèi)存分配函數(shù)所在的文件名、代碼行號及函數(shù)名的信息來確定,并在所述內(nèi)存釋放過
程中用于校驗數(shù)據(jù)結(jié)構(gòu)中的信息的有效性。
4
根據(jù)本發(fā)明,在所述內(nèi)存釋放的過程中,在根據(jù)所述的內(nèi)存釋放范圍類型信息及 內(nèi)存釋放位置信息判斷內(nèi)存是否有效的步驟之前,首先根據(jù)所述數(shù)據(jù)結(jié)構(gòu)中的校驗碼判斷 數(shù)據(jù)結(jié)構(gòu)中的信息是否正確;在數(shù)據(jù)結(jié)構(gòu)中的信息正確后,再執(zhí)行所述判斷內(nèi)存是否有效 的步驟。若根據(jù)校驗碼判斷數(shù)據(jù)結(jié)構(gòu)中的信息不正確,則認(rèn)為不在管理范圍之內(nèi),返回錯誤信息。 根據(jù)本發(fā)明,為便于跟蹤內(nèi)存分配和內(nèi)存釋放,所述數(shù)據(jù)結(jié)構(gòu)中還包括有內(nèi)存分 配函數(shù)所分配的內(nèi)存的內(nèi)存指針信息及內(nèi)存大小的信息。 其中,所述內(nèi)存分配函數(shù)所分配的內(nèi)存包括程序本身所需的實際內(nèi)存和所述數(shù)據(jù) 結(jié)構(gòu)所占用的內(nèi)存。 與現(xiàn)有技術(shù)相比,本發(fā)明的優(yōu)點(diǎn)和積極效果是 1、本發(fā)明在內(nèi)存分配過程中記錄內(nèi)存分配函數(shù)分配的內(nèi)存所對應(yīng)的內(nèi)存釋放范 圍類型信息及內(nèi)存釋放位置信息,在內(nèi)存釋放過程中根據(jù)該內(nèi)存釋放范圍類型信息和內(nèi)存 釋放位置信息判斷是否釋放內(nèi)存,因此,內(nèi)存泄露檢測模塊可以及時有效地跟蹤內(nèi)存應(yīng)該 在何處釋放、是否在不該釋放的地方釋放了內(nèi)存等信息,并提供準(zhǔn)確的內(nèi)存泄露信息,有效 避免了嵌入式系統(tǒng)中內(nèi)存泄露的誤報、誤釋放等問題的發(fā)生,提高了檢測效率和檢測準(zhǔn)確 率。 2、通過對內(nèi)存釋放范圍類型及內(nèi)存釋放位置的跟蹤,可以實現(xiàn)在不同文件內(nèi)、不 同文件夾內(nèi)及不同應(yīng)用程序中的內(nèi)存泄露檢測,從而實現(xiàn)了對內(nèi)存泄露的分區(qū)檢測,提高 了檢測的靈活性。 3、由于內(nèi)存泄露檢測模塊可以及時有效地跟蹤內(nèi)存分配和內(nèi)存釋放過程,因此, 可以在嵌入式系統(tǒng)程序運(yùn)行過程中的任一時刻根據(jù)需要進(jìn)行內(nèi)存泄露的分區(qū)檢測,有效解 決了現(xiàn)有內(nèi)存泄露檢測需要在程序結(jié)束時進(jìn)行、而嵌入式系統(tǒng)一般不存在程序結(jié)束因而無 法進(jìn)行內(nèi)存泄露檢測的問題。
圖1是本發(fā)明所述嵌入式系統(tǒng)內(nèi)存泄露檢測方法一個實施例的基本流程圖;
圖2是圖1實施例中內(nèi)存分配過程的具體流程圖;
圖3是圖1實施例中內(nèi)存釋放過程的具體流程圖。
具體實施例方式
下面結(jié)合附圖對本發(fā)明作進(jìn)一步詳細(xì)的說明。 由于嵌入式系統(tǒng)軟件一般是啟動后一直運(yùn)行,不存在程序結(jié)束,因此,若采用現(xiàn)有 的內(nèi)存泄露檢測方法,不僅使用不方便,而且容易出現(xiàn)誤報、誤釋放等問題。針對嵌入式系 統(tǒng)的上述特點(diǎn),本發(fā)明提供了一種應(yīng)用于嵌入式系統(tǒng)的內(nèi)存泄露檢測方法,該方法的核心 是在內(nèi)存分配過程中保存內(nèi)存分配函數(shù)分配的內(nèi)存所對應(yīng)的內(nèi)存釋放范圍類型信息及內(nèi) 存釋放位置信息,而在內(nèi)存釋放過程中,將根據(jù)所述內(nèi)存釋放范圍類型信息和內(nèi)存釋放位 置信息判斷釋放的內(nèi)存釋放有效,只在內(nèi)存有效時才進(jìn)行內(nèi)存的釋放。在內(nèi)存分配及內(nèi)存 釋放過程中,采用內(nèi)存泄露檢測模塊來跟蹤內(nèi)存分配過程和內(nèi)存釋放過程,則內(nèi)存泄露檢 測模塊可以及時有效地跟蹤內(nèi)存應(yīng)該在何處釋放、是否在不該釋放的地方釋放了內(nèi)存等信息,并提供準(zhǔn)確的內(nèi)存泄露信息,有效避免了嵌入式系統(tǒng)中內(nèi)存泄露的誤報、誤釋放等問題 的發(fā)生,提高了檢測效率和檢測準(zhǔn)確率。 圖1示出了本發(fā)明所述嵌入式系統(tǒng)內(nèi)存泄露檢測方法一個實施例的基本流程圖。 在該實施例中,內(nèi)存釋放范圍類型信息和內(nèi)存釋放位置信息以數(shù)據(jù)結(jié)構(gòu)的形式存在,用于 記錄內(nèi)存塊的相關(guān)信息。當(dāng)然,該數(shù)據(jù)結(jié)構(gòu)中還包含其他一些與分配的內(nèi)存有關(guān)的信息, 利用該信息,便于內(nèi)存泄露檢測模塊對內(nèi)存的跟蹤和泄露的檢測。該實施例的基本流程如 下 Sl :建立數(shù)據(jù)結(jié)構(gòu),以記錄內(nèi)存塊的相關(guān)信息。 該實施例為便于內(nèi)存泄露檢測模塊及時、有效地跟蹤內(nèi)存的分配和釋放,以實現(xiàn)
對嵌入式系統(tǒng)內(nèi)存泄露的準(zhǔn)確檢測,定義了一個內(nèi)存泄露檢測過程使用的數(shù)據(jù)結(jié)構(gòu),用來
記錄內(nèi)存塊的相關(guān)信息。該數(shù)據(jù)結(jié)構(gòu)中包括下述內(nèi)容 分配的內(nèi)存的內(nèi)存指針用于標(biāo)識分配到的內(nèi)存地址; 分配的內(nèi)存的內(nèi)存大小即分配的內(nèi)存所占用的內(nèi)存空間; 內(nèi)存分配函數(shù)所在的文件名路徑用于標(biāo)識內(nèi)存分配函數(shù)所在的文件名信息;該 值可以通過宏獲得; 內(nèi)存分配函數(shù)所在的代碼行號該值可以通過宏獲得; 內(nèi)存分配函數(shù)所在的函數(shù)名該值可以通過宏獲得,用于標(biāo)識內(nèi)存分配函數(shù)在源 代碼中所在的位置; 內(nèi)存分配編號用于標(biāo)識所對應(yīng)的內(nèi)存是第幾次分配操作。在一個運(yùn)行的程序中, 一個內(nèi)存分配操作可能被調(diào)用多次,但是內(nèi)存泄露可能只發(fā)生在其中的某次操作中。為了 確認(rèn)問題所在,除了要知道泄露的位置之外,還必須要知道發(fā)生泄露的條件,即內(nèi)存泄露是 在哪次內(nèi)存分配中發(fā)生的,而通過跟蹤內(nèi)存分配編號就可以解決該問題。此外,由于存在隱 式內(nèi)存泄露,為了防止一個地方不斷進(jìn)行內(nèi)存分配,嵌入式系統(tǒng)會隨時對內(nèi)存分配編號進(jìn) 行檢查;如果檢測到內(nèi)存分配編號超過設(shè)定值,則輸出相應(yīng)的報警信號。 內(nèi)存釋放范圍類型由于嵌入式系統(tǒng)不存在程序結(jié)束的過程,內(nèi)存泄露檢測模塊 無法知道分配的內(nèi)存應(yīng)該在何處釋放,所有就可能不知道已經(jīng)分配的內(nèi)存釋放是泄露的內(nèi) 存,也無法知道是否在不該釋放的地方釋放了內(nèi)存,從而容易產(chǎn)生誤報和誤釋放的問題。為 解決該問題,同時也為了使用方便,該實施例在數(shù)據(jù)結(jié)構(gòu)中增加了"內(nèi)存釋放范圍類型",且 根據(jù)嵌入式系統(tǒng)的程序特點(diǎn),將內(nèi)存釋放范圍類型劃分為下述8類本函數(shù)內(nèi),本文件內(nèi), 本文件夾內(nèi),本應(yīng)用程序中,其他函數(shù)內(nèi),其他文件內(nèi),其他文件夾內(nèi)以及不釋放。
內(nèi)存釋放位置內(nèi)存釋放位置是對上述內(nèi)存釋放范圍類型的補(bǔ)充,目的是進(jìn)一步 防止誤報和誤釋放的問題。在該實施例中,在所述內(nèi)存釋放范圍類型為本函數(shù)內(nèi)、本文件 內(nèi)、本文件夾內(nèi)、本應(yīng)用程序中及不釋放時,所述內(nèi)存釋放位置的值無效;在所述內(nèi)存釋放 范圍類型為其他函數(shù)內(nèi)時,所述內(nèi)存釋放位置的值為相應(yīng)的函數(shù)名稱;在所述內(nèi)存釋放范 圍類型為其他文件內(nèi)時,所述內(nèi)存釋放位置的值為相應(yīng)的文件名稱;在所述內(nèi)存釋放范圍 類型為其他文件夾內(nèi)時,所述內(nèi)存釋放位置的值為相應(yīng)的文件夾名稱。 校驗碼用于校驗整個數(shù)據(jù)結(jié)構(gòu)中的信息是否有效,可以選用一個固定的32位整 數(shù)。如果根據(jù)校驗碼判斷數(shù)據(jù)結(jié)構(gòu)中的信息不正確,則認(rèn)為不在管理范圍之內(nèi),返回錯誤信 息,以提高數(shù)據(jù)的安全性和管理的高效性。
6
S2 :跟蹤內(nèi)存分配過程及內(nèi)存釋放過程。內(nèi)存分配過程和內(nèi)存釋放過程可分別參 考圖2和圖3的流程圖。
S3 :調(diào)用內(nèi)存泄露檢測模塊進(jìn)行內(nèi)存泄露檢測。 由于可以通過上述設(shè)定的數(shù)據(jù)結(jié)構(gòu)及時有效地跟蹤內(nèi)存分配過程及內(nèi)存釋放過 程,避免了產(chǎn)生誤報和誤釋放的問題,因此,在嵌入式系統(tǒng)軟件運(yùn)行過程中,可以根據(jù)需要 隨時對內(nèi)存泄露進(jìn)行不同文件內(nèi)、不同文件夾內(nèi)及不同應(yīng)用程序中的分區(qū)檢測。例如,可以 在一個模塊的退出函數(shù)中調(diào)用內(nèi)存泄露檢測模塊中的顯示函數(shù)對該模塊進(jìn)行內(nèi)存泄露檢 S4 :輸出內(nèi)存泄露檢測結(jié)果。 內(nèi)存泄露檢測的關(guān)鍵是要跟蹤內(nèi)存分配和內(nèi)存釋放的過程,獲得內(nèi)存的分配與釋 放的相關(guān)信息,以便于在調(diào)用內(nèi)存泄露檢測顯示函數(shù)時能夠正確獲得內(nèi)存泄露的信息。因 此,對內(nèi)存分配過程及內(nèi)存釋放過程中內(nèi)存信息的記錄顯得尤為重要。圖2示出了圖l實 施例中內(nèi)存分配過程的具體流程圖,圖3示出了圖1實施例中內(nèi)存釋放過程的具體流程圖。 下面結(jié)合上述的數(shù)據(jù)結(jié)構(gòu),分別描述內(nèi)存分配過程和內(nèi)存釋放過程的流程。
如圖2所示,該實施例內(nèi)存分配過程的具體流程如下 S201 :通過內(nèi)存分配函數(shù)參數(shù)獲取內(nèi)存分配函數(shù)所在的文件名、代碼行號及函數(shù) 名信息,并保存 S202 :通過內(nèi)存分配函數(shù)參數(shù)獲取內(nèi)存分配函數(shù)分配的內(nèi)存對應(yīng)的內(nèi)存釋放范圍 類型及內(nèi)存釋放位置信息,并保存。 S203 :查找與所述文件名和代碼行號相對應(yīng)的最大內(nèi)存分配編號。 S204 :將查找到的最大內(nèi)存分配編號加l,作為當(dāng)前分配的內(nèi)存的內(nèi)存分配編號。 S205 :確定校驗碼的值,并保存。所述檢驗碼為一個32位無符號整數(shù),其值根據(jù)所
述內(nèi)存釋放范圍類型信息、內(nèi)存釋放位置信息、內(nèi)存分配函數(shù)所在的文件名、代碼行號及函
數(shù)名的信息來確定。 S206 :利用內(nèi)存分配函數(shù)分配相應(yīng)的內(nèi)存。所分配的內(nèi)存的大小為用戶指定的內(nèi) 存大小加上數(shù)據(jù)結(jié)構(gòu)所占內(nèi)存的大小。 S207 :判斷內(nèi)存分配是否成功。在分配成功時,執(zhí)行步驟S208 ;若分配失敗,轉(zhuǎn)至 步驟S210。 S208 :在內(nèi)存分配成功后,保存所分配的內(nèi)存的內(nèi)存指針及內(nèi)存大小。 S209 :額外保存當(dāng)前內(nèi)存分配函數(shù)所在的文件名、代碼行號及當(dāng)前內(nèi)存分配編號
信息,以便于下次內(nèi)存分配時計算相應(yīng)的內(nèi)存分配編號。 S210 :若內(nèi)存分配失敗,則返回空操作。
如圖3所示,該實施例內(nèi)存釋放過程的具體流程如下 S301 :通過內(nèi)存釋放函數(shù)的參數(shù)獲取內(nèi)存釋放函數(shù)所在的文件名、代碼行號及函 數(shù)名信息,以及內(nèi)存釋放函數(shù)待釋放的內(nèi)存地址。
S302 :根據(jù)待釋放的內(nèi)存地址計算數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中的位置。 結(jié)合圖2流程中的內(nèi)存分配過程,數(shù)據(jù)結(jié)構(gòu)在內(nèi)存中的地址應(yīng)該為待釋放的內(nèi)存 地址減去數(shù)據(jù)結(jié)構(gòu)所占內(nèi)存的大小而得到的一個內(nèi)存地址。 S303:根據(jù)數(shù)據(jù)結(jié)構(gòu)地址獲得數(shù)據(jù)結(jié)構(gòu),然后根據(jù)數(shù)據(jù)結(jié)構(gòu)中的校驗碼判斷數(shù)據(jù)結(jié)構(gòu)的正確性。 S304 :判斷數(shù)據(jù)結(jié)構(gòu)是否正確。若正確,執(zhí)行步驟S305 ;若不正確,轉(zhuǎn)至步驟S311。
S305:在數(shù)據(jù)結(jié)構(gòu)正確后,根據(jù)數(shù)據(jù)結(jié)構(gòu)中的內(nèi)存釋放范圍類型信息和內(nèi)存釋放 位置信息判斷當(dāng)前內(nèi)存的有效性。 S306 :判斷內(nèi)存是否有效。在內(nèi)存有效時,執(zhí)行步驟S307 ;在內(nèi)存無效時,轉(zhuǎn)至步 驟S311。 S307 :判斷是否為用戶指定的內(nèi)存和數(shù)據(jù)結(jié)構(gòu)。為進(jìn)一步防止內(nèi)存的誤釋放,在內(nèi) 存有效時,再根據(jù)內(nèi)存釋放函數(shù)所在的文件名、代碼行號及函數(shù)名信息以及數(shù)據(jù)結(jié)構(gòu)中的 內(nèi)存釋放范圍類型及內(nèi)存釋放位置信息判斷要釋放的內(nèi)存和數(shù)據(jù)結(jié)構(gòu)是否為用戶指定的 內(nèi)存和數(shù)據(jù)結(jié)構(gòu)。在判斷結(jié)果正確時,執(zhí)行步驟S308 ;若判斷結(jié)果錯誤,轉(zhuǎn)至步驟S311。
S308:在當(dāng)前內(nèi)存為用戶指定的內(nèi)存、當(dāng)前數(shù)據(jù)結(jié)構(gòu)為指定的數(shù)據(jù)結(jié)構(gòu)時,釋放該 指定的內(nèi)存和數(shù)據(jù)結(jié)構(gòu)。 S309 :判斷釋放是否成功。若釋放成功,執(zhí)行步驟S310 ;若釋放失敗,轉(zhuǎn)至步驟 S311。 S310:返回釋放成功。
S311 :返回釋放失敗。 采用上述實施例所述的內(nèi)存分配過程和內(nèi)存釋放過程,可以有效避免誤報和誤釋 放的問題。內(nèi)存泄露檢測模塊通過對所述內(nèi)存分配過程及所述內(nèi)存釋放過程進(jìn)行跟蹤,從 而能夠正確檢測內(nèi)存泄露信息,而且,可以在嵌入式系統(tǒng)程序運(yùn)行的任一時刻進(jìn)行內(nèi)存泄 露的分區(qū)檢測,有效解決了目前嵌入式系統(tǒng)內(nèi)存泄露檢測過程存在的使用不便、檢測效率 低的問題。 當(dāng)然,以上所述僅是本發(fā)明的一種優(yōu)選實施方式而已,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域 的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改 進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。
權(quán)利要求
一種嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,包括跟蹤內(nèi)存分配的過程和跟蹤內(nèi)存釋放的過程的步驟,以及根據(jù)跟蹤結(jié)果進(jìn)行內(nèi)存泄露檢測的步驟;其特征在于,所述內(nèi)存分配的過程包括通過內(nèi)存分配函數(shù)的參數(shù)獲取該內(nèi)存分配函數(shù)分配的內(nèi)存所對應(yīng)的內(nèi)存釋放范圍類型信息及內(nèi)存釋放位置信息并進(jìn)行保存的步驟;所述內(nèi)存釋放的過程包括根據(jù)所述的內(nèi)存釋放范圍類型信息及內(nèi)存釋放位置信息判斷內(nèi)存是否有效,并在內(nèi)存有效時釋放該內(nèi)存的步驟。
2. 根據(jù)權(quán)利要求1所述的嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,其特征在于,所述內(nèi)存釋 放范圍類型包括本函數(shù)內(nèi),本文件內(nèi),本文件夾內(nèi),本應(yīng)用程序中,其他函數(shù)內(nèi),其他文件 內(nèi),其他文件夾內(nèi)以及不釋放。
3. 根據(jù)權(quán)利要求2所述的嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,其特征在于,在所述內(nèi)存 釋放范圍類型為本函數(shù)內(nèi)、本文件內(nèi)、本文件夾內(nèi)、本應(yīng)用程序中及不釋放時,所述內(nèi)存釋 放位置的值無效;在所述內(nèi)存釋放范圍類型為其他函數(shù)內(nèi)時,所述內(nèi)存釋放位置的值為相 應(yīng)的函數(shù)名稱;在所述內(nèi)存釋放范圍類型為其他文件內(nèi)時,所述內(nèi)存釋放位置的值為相應(yīng) 的文件名稱;在所述內(nèi)存釋放范圍類型為其他文件夾內(nèi)時,所述內(nèi)存釋放位置的值為相應(yīng) 的文件夾名稱。
4. 根據(jù)權(quán)利要求1至3中任一項所述的嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,其特征在于, 所述內(nèi)存分配的過程還包括下述步驟通過內(nèi)存分配函數(shù)的參數(shù)獲取并保存內(nèi)存分配函數(shù)所在的文件名、代碼行號及函數(shù)名 信息;查找與所述文件名和代碼行號相對應(yīng)的最大內(nèi)存分配編號,將所述最大內(nèi)存分配編號 加l,作為當(dāng)前分配的內(nèi)存的內(nèi)存分配編號。
5. 根據(jù)權(quán)利要求4所述的嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,其特征在于,在所述跟蹤 內(nèi)存分配的過程中,若檢測到內(nèi)存分配編號超過設(shè)定值,則輸出相應(yīng)的報警信號。
6. 根據(jù)權(quán)利要求4所述的嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,其特征在于,所述內(nèi)存釋 放范圍類型信息、內(nèi)存釋放位置信息、內(nèi)存分配函數(shù)所在的文件名、代碼行號及函數(shù)名信息 以數(shù)據(jù)結(jié)構(gòu)的形式存在于內(nèi)存中。
7. 根據(jù)權(quán)利要求6所述的嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,其特征在于,所述數(shù)據(jù)結(jié) 構(gòu)中還包括有校驗碼,所述校驗碼的值在內(nèi)存分配過程中根據(jù)所述內(nèi)存釋放范圍類型信 息、內(nèi)存釋放位置信息、內(nèi)存分配函數(shù)所在的文件名、代碼行號及函數(shù)名的信息來確定,并 在所述內(nèi)存釋放過程中用于校驗數(shù)據(jù)結(jié)構(gòu)中的信息的有效性。
8. 根據(jù)權(quán)利要求7所述的嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,其特征在于,在所述內(nèi)存 釋放的過程中,在根據(jù)所述的內(nèi)存釋放范圍類型信息及內(nèi)存釋放位置信息判斷內(nèi)存是否有 效的步驟之前,首先根據(jù)所述數(shù)據(jù)結(jié)構(gòu)中的校驗碼判斷數(shù)據(jù)結(jié)構(gòu)中的信息是否正確;在數(shù) 據(jù)結(jié)構(gòu)中的信息正確后,再執(zhí)行所述判斷內(nèi)存是否有效的步驟。
9. 根據(jù)權(quán)利要求7所述的嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,其特征在于,所述數(shù)據(jù)結(jié) 構(gòu)中還包括有內(nèi)存分配函數(shù)所分配的內(nèi)存的內(nèi)存指針信息及內(nèi)存大小的信息。
10. 根據(jù)權(quán)利要求l所述的嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,其特征在于,所述內(nèi)存分 配函數(shù)所分配的內(nèi)存包括程序本身所需的實際內(nèi)存和所述數(shù)據(jù)結(jié)構(gòu)所占用的內(nèi)存。
全文摘要
本發(fā)明公開了一種嵌入式系統(tǒng)內(nèi)存泄露的檢測方法,包括跟蹤內(nèi)存分配的過程和跟蹤內(nèi)存釋放的過程的步驟,以及根據(jù)跟蹤結(jié)果進(jìn)行內(nèi)存泄露檢測的步驟;所述內(nèi)存分配的過程包括通過內(nèi)存分配函數(shù)的參數(shù)獲取該內(nèi)存分配函數(shù)分配的內(nèi)存所對應(yīng)的內(nèi)存釋放范圍類型信息及內(nèi)存釋放位置信息并進(jìn)行保存的步驟;所述內(nèi)存釋放的過程包括根據(jù)所述的內(nèi)存釋放范圍類型信息及內(nèi)存釋放位置信息判斷內(nèi)存是否有效,并在內(nèi)存有效時釋放該內(nèi)存的步驟。利用本發(fā)明所述的內(nèi)存泄露檢測方法,可實現(xiàn)對嵌入式系統(tǒng)內(nèi)存泄露的分區(qū)檢測,方法使用靈活、檢測效率較高。
文檔編號G06F11/36GK101763305SQ20091025647
公開日2010年6月30日 申請日期2009年12月29日 優(yōu)先權(quán)日2009年12月29日
發(fā)明者田友強(qiáng) 申請人:青島海信寬帶多媒體技術(shù)有限公司