內(nèi)存泄漏檢查系統(tǒng)及方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機(jī)技術(shù)領(lǐng)域,尤其涉及一種內(nèi)存泄漏檢查系統(tǒng)及方法。
【背景技術(shù)】
[0002]目前,內(nèi)存泄漏是軟件諸多缺陷中比較難以發(fā)現(xiàn)的錯誤,內(nèi)存泄漏的危害很大,可能導(dǎo)致系統(tǒng)內(nèi)存不斷減少,最終導(dǎo)致系統(tǒng)運(yùn)行不穩(wěn)定,甚至崩潰、重啟。導(dǎo)致軟件內(nèi)存泄漏的原因很多,有可能是軟件開發(fā)者的失誤,也可能是軟件運(yùn)行環(huán)境(操作系統(tǒng)、第三方庫)存在問題,因此檢查軟件內(nèi)存泄漏是一個重要而又復(fù)雜的過程,完全依靠開發(fā)者分析軟件源代碼的方法來消除內(nèi)存泄漏是一個費(fèi)力不討好的苦差事,尤其是處理一些需要運(yùn)行很長時間才出現(xiàn)的問題。檢查內(nèi)存泄漏需要借助一些工具,常見的一些專用工具存在許多不足,主要有:1、只能在軟件產(chǎn)品開發(fā)測試階段使用,不能在客戶使用軟件產(chǎn)品的現(xiàn)場使用;2、使用比較麻煩,不夠直觀和方便;3、現(xiàn)在大多內(nèi)存泄漏檢查工具完全運(yùn)行在目標(biāo)產(chǎn)品上,如果需要長期記錄內(nèi)存分配和釋放過程,可能消耗過多目標(biāo)產(chǎn)品上的內(nèi)存空間。
【發(fā)明內(nèi)容】
[0003]本發(fā)明的目的是為解決目前檢測軟件產(chǎn)品內(nèi)存泄漏的方案不能在客戶現(xiàn)場使用,使用不方便,耗費(fèi)目標(biāo)產(chǎn)品過多內(nèi)存空間的技術(shù)問題。
[0004]為了解決上述技術(shù)問題,一方面,本發(fā)明提供一種內(nèi)存泄漏檢查系統(tǒng),包括內(nèi)存數(shù)據(jù)采集模塊、數(shù)據(jù)傳輸模塊、內(nèi)存泄漏分析模塊和顯示模塊;所述內(nèi)存數(shù)據(jù)采集模塊采集的數(shù)據(jù)通過所述數(shù)據(jù)傳輸模塊傳送至所述內(nèi)存泄漏分析模塊;所述內(nèi)存數(shù)據(jù)采集模塊采集的數(shù)據(jù)包括內(nèi)存分配數(shù)據(jù)和內(nèi)存釋放數(shù)據(jù);
[0005]所述內(nèi)存泄漏分析模塊適于預(yù)設(shè)內(nèi)存塊最大占用時間ΜΑΧ_??ΜΕ,并適于根據(jù)所述內(nèi)存數(shù)據(jù)采集模塊采集的數(shù)據(jù)檢查內(nèi)存塊是否發(fā)生泄漏,若同一地址的內(nèi)存分配數(shù)據(jù)對應(yīng)有內(nèi)存釋放數(shù)據(jù),則所述地址的內(nèi)存塊未發(fā)生泄漏;若同一地址的內(nèi)存分配數(shù)據(jù)無對應(yīng)的內(nèi)存釋放數(shù)據(jù),當(dāng)所述地址的內(nèi)存塊占用時間小于所述最大占用時間ΜΑΧ_??ΜΕ時,則所述地址的內(nèi)存塊未發(fā)生泄漏,當(dāng)所述地址的內(nèi)存塊占用時間大于所述最大占用時間ΜΑΧ_??ΜΕ時,則所述地址的內(nèi)存塊發(fā)生泄漏;
[0006]內(nèi)存泄漏的檢查結(jié)果傳送至所述顯示模塊進(jìn)行顯示。
[0007]進(jìn)一步地,所述內(nèi)存數(shù)據(jù)采集模塊包括內(nèi)存分配數(shù)據(jù)采集單元,所述內(nèi)存分配數(shù)據(jù)采集單元用于,在向目標(biāo)應(yīng)用程序分配內(nèi)存前,記錄所述目標(biāo)應(yīng)用程序所申請內(nèi)存的內(nèi)存塊起始地址、內(nèi)存塊大小、內(nèi)存塊分配時間及調(diào)用內(nèi)存分配函數(shù)的調(diào)用函數(shù)在所述目標(biāo)應(yīng)用程序中的位置。
[0008]進(jìn)一步地,所述內(nèi)存數(shù)據(jù)采集模塊包括內(nèi)存釋放數(shù)據(jù)采集單元,所述內(nèi)存釋放數(shù)據(jù)采集單元用于,在目標(biāo)應(yīng)用程序釋放內(nèi)存前,記錄所述目標(biāo)應(yīng)用程序?qū)⒁尫艃?nèi)存的內(nèi)存塊起始地址、內(nèi)存塊大小、內(nèi)存塊釋放時間及調(diào)用內(nèi)存釋放函數(shù)的調(diào)用函數(shù)在所述目標(biāo)應(yīng)用程序中的位置。
[0009]進(jìn)一步地,所述數(shù)據(jù)傳輸模塊包括緩存,所述內(nèi)存數(shù)據(jù)采集模塊采集的內(nèi)存分配數(shù)據(jù)和內(nèi)存釋放數(shù)據(jù)均存儲在所述緩存中。
[0010]進(jìn)一步地,所述內(nèi)存泄漏分析模塊包括哈希分配表,所述哈希分配表用于記錄所述內(nèi)存分配數(shù)據(jù)。
[0011]進(jìn)一步地,所述內(nèi)存泄漏分析模塊包括哈希釋放表,所述哈希釋放表用于記錄所述內(nèi)存釋放數(shù)據(jù)。
[0012]另一方面,本發(fā)明提供一種內(nèi)存泄漏檢查方法,包括如下步驟:
[0013](1)在目標(biāo)應(yīng)用程序申請分配內(nèi)存前,內(nèi)存數(shù)據(jù)采集模塊采集內(nèi)存分配數(shù)據(jù);在目標(biāo)應(yīng)用程序釋放內(nèi)存前,內(nèi)存數(shù)據(jù)采集模塊采集內(nèi)存釋放數(shù)據(jù);
[0014](2)將所述內(nèi)存數(shù)據(jù)采集模塊采集的數(shù)據(jù)傳送至內(nèi)存泄漏分析模塊,所述數(shù)據(jù)以記錄R的形式保存至所述內(nèi)存泄漏分析模塊的哈希表中;
[0015](3)判斷記錄R的類型,若R的記錄類型為“1”,則繼續(xù)到下一步;若1?的記錄類型為“2”,則轉(zhuǎn)至步驟(5);
[0016](4)以R的start為關(guān)鍵字將內(nèi)存分配數(shù)據(jù)以記錄R1保存至哈希表T1 ;轉(zhuǎn)至步驟
(6);
[0017](5)以R的start為關(guān)鍵字將內(nèi)存釋放數(shù)據(jù)以記錄R2保存至哈希表T2 ;
[0018](6)所述內(nèi)存泄漏分析模塊設(shè)置內(nèi)存塊最大占用時間ΜΑΧ_??ΜΕ ;
[0019](7)從哈希表Τ1中獲取內(nèi)存分配記錄R1 ;
[0020](8)以R1的start為關(guān)鍵字從哈希表T2中獲取內(nèi)存釋放記錄R2 ;
[0021](9)判斷R2是否為有效記錄,若R2為有效記錄,則繼續(xù)到下一步;若1?2為無效記錄,則轉(zhuǎn)至步驟(11);
[0022](10)R1記錄的內(nèi)存塊未發(fā)生內(nèi)存泄漏,刪除T1中的R1和T2中的R2 ;
[0023](11)判斷R1記錄的內(nèi)存塊的分配時間是否大于ΜΑΧ_??ΜΕ,若R1記錄的內(nèi)存塊的分配時間大于ΜΑΧ_??ΜΕ,則繼續(xù)到下一步;若R1記錄的內(nèi)存塊的分配時間小于ΜΑΧ_??ΜΕ,則轉(zhuǎn)至步驟(10);
[0024](12)R1記錄的內(nèi)存塊發(fā)生內(nèi)存泄漏,實時顯示該內(nèi)存泄漏結(jié)果。
[0025]進(jìn)一步地,所述內(nèi)存泄漏分析模塊設(shè)置的內(nèi)存塊最大占用時間ΜΑΧ_??ΜΕ彡5分鐘。
[0026]進(jìn)一步地,所述記錄R1中的數(shù)據(jù)包括目標(biāo)應(yīng)用程序所申請內(nèi)存的內(nèi)存塊起始地址、內(nèi)存塊大小、內(nèi)存塊分配時間及調(diào)用內(nèi)存分配函數(shù)的調(diào)用函數(shù)在所述目標(biāo)應(yīng)用程序中的位置。
[0027]進(jìn)一步地,所述調(diào)用內(nèi)存分配函數(shù)的調(diào)用函數(shù)在所述目標(biāo)應(yīng)用程序中的位置數(shù)據(jù)包括所述調(diào)用函數(shù)所在的文件、調(diào)用函數(shù)的名字和調(diào)用函數(shù)所在的行號。
[0028]進(jìn)一步地,所述記錄R2中的數(shù)據(jù)包括目標(biāo)應(yīng)用程序?qū)⒁尫艃?nèi)存的內(nèi)存塊起始地址、內(nèi)存塊大小、內(nèi)存塊釋放時間及調(diào)用內(nèi)存釋放函數(shù)的調(diào)用函數(shù)在所述目標(biāo)應(yīng)用程序中的位置。
[0029]進(jìn)一步地,所述調(diào)用內(nèi)存釋放函數(shù)的調(diào)用函數(shù)在所述目標(biāo)應(yīng)用程序中的位置數(shù)據(jù)包括所述調(diào)用函數(shù)所在的文件、調(diào)用函數(shù)的名字和調(diào)用函數(shù)所在的行號。
[0030]本發(fā)明的內(nèi)存泄漏分析模塊運(yùn)行于PC機(jī)上,目標(biāo)產(chǎn)品上存在一個內(nèi)存數(shù)據(jù)采集模塊,應(yīng)用程序所有的內(nèi)存塊分配和釋放不是直接使用標(biāo)準(zhǔn)的malloc和free函數(shù),而是通過一個自定義的內(nèi)存數(shù)據(jù)采集模塊提供的函數(shù)分配或者釋放內(nèi)存塊。自定義的分配和釋放函數(shù)在使用標(biāo)準(zhǔn)的malloc和free分配和釋放內(nèi)存塊前,會記錄應(yīng)用程序申請或者釋放內(nèi)存塊的信息,這些信息主要包括內(nèi)存塊的起始地址、內(nèi)存塊的大小、內(nèi)存塊的分配時間或者釋放時間,同時,為了方便內(nèi)存泄漏的定位,還記錄一些輔助信息,例如分配或者釋放函數(shù)調(diào)用在應(yīng)用程序源代碼中的位置(調(diào)用函數(shù)所在的文件、調(diào)用函數(shù)的名字、調(diào)用函數(shù)所在的行號),占有目標(biāo)產(chǎn)品的內(nèi)存少;根據(jù)同一內(nèi)存地址,如果分配和釋放的次數(shù)相同,則無內(nèi)存泄漏;否則,進(jìn)一步判斷內(nèi)存占有時間,如小于閾值時間,則無泄漏,否則發(fā)生泄漏,并能實時顯示檢查結(jié)果,這一泄漏檢查方法能在客戶現(xiàn)場使用,簡單、直觀、高效。
【附圖說明】
[0031]圖1為本發(fā)明所述系統(tǒng)一個實施例的原理框圖;
[0032]圖2為本發(fā)明所述方法一個實施例的流程圖。
[0033]圖中,內(nèi)存數(shù)據(jù)采集模塊10 ;內(nèi)存分配數(shù)據(jù)采集單元101 ;內(nèi)存釋放數(shù)據(jù)采集單元102 ;數(shù)據(jù)傳輸模塊20 ;緩存201 ;內(nèi)存泄漏分析模塊30 ;顯示模塊40。
【具體實施方式】
[0034]現(xiàn)在結(jié)合附圖和實施例對本發(fā)明作進(jìn)一步詳細(xì)的說明。這些附圖均為簡化的示意圖,僅以示意方式說明本發(fā)明的基本結(jié)構(gòu),因此其僅顯示與本發(fā)明有關(guān)的構(gòu)成,且其不應(yīng)理解為對本發(fā)明的限制。
[0035]如圖1所示的實施例,本發(fā)明的內(nèi)存泄漏檢查系統(tǒng),包括內(nèi)存數(shù)據(jù)采集模塊10、數(shù)據(jù)傳輸模塊20、內(nèi)存泄漏分析模塊30和顯示模塊40 ;所述內(nèi)存數(shù)據(jù)采集模塊10包括內(nèi)存分配數(shù)據(jù)采集單元101和內(nèi)存釋放數(shù)據(jù)采集單元102,數(shù)據(jù)傳輸模塊20包括緩存201,其中內(nèi)存分配數(shù)據(jù)采集單元101用于,在向目標(biāo)應(yīng)用程序分配內(nèi)存前,記錄所述目標(biāo)應(yīng)用程序所申請內(nèi)存的內(nèi)存塊起始地址、內(nèi)存塊大小、內(nèi)存塊分配時間及調(diào)用內(nèi)存分配函數(shù)的調(diào)用函數(shù)在所述目標(biāo)應(yīng)用程序中的位置,內(nèi)存釋放數(shù)據(jù)采集單元102用于,在目標(biāo)應(yīng)用程序釋放內(nèi)存前,記錄所述目標(biāo)應(yīng)用程序?qū)⒁尫艃?nèi)存的內(nèi)存塊起始地址、內(nèi)存塊大小、內(nèi)存塊釋放時間及調(diào)用內(nèi)存釋放函數(shù)的調(diào)用函數(shù)在所述目標(biāo)應(yīng)用程序中的位置,內(nèi)存分配數(shù)據(jù)采集單元101和內(nèi)存釋放數(shù)據(jù)采集單元102采集的數(shù)據(jù)存入數(shù)據(jù)傳輸模塊20的緩存201,只要緩存201中存在數(shù)據(jù),數(shù)據(jù)傳輸模塊20就會不停地將此數(shù)據(jù)傳遞到內(nèi)存泄漏分析模塊30。
[0036]所述內(nèi)存泄漏分析模塊30運(yùn)行于PC機(jī)上,包括hash分配表T1和hash釋放表T2,內(nèi)存分配數(shù)據(jù)采集單元101采集的內(nèi)存分配數(shù)據(jù)以記錄R1形式存放于T1中,內(nèi)存釋放數(shù)據(jù)采集單元102采集的內(nèi)存釋放數(shù)據(jù)以記錄R2形式存放于T2中,內(nèi)存泄漏分析模塊30可預(yù)設(shè)內(nèi)存塊最大占用時間ΜΑΧ_??ΜΕ,優(yōu)選地,ΜΑΧ_ΤΙΜΕ彡5分鐘,內(nèi)存泄漏分析模塊30根據(jù)所述內(nèi)存數(shù)據(jù)采集模塊10采集的數(shù)據(jù)檢查內(nèi)存塊是否發(fā)生泄漏,若同一地址的內(nèi)存分配數(shù)據(jù)對應(yīng)有內(nèi)存釋放數(shù)據(jù),則所述地址的內(nèi)存塊未發(fā)生泄漏;若同一地址的內(nèi)存分配數(shù)據(jù)無對應(yīng)的內(nèi)存釋放數(shù)據(jù),當(dāng)所述地址的內(nèi)存塊占用時間小于所述最大占用時間ΜΑΧ_TIME時,則所述地址的內(nèi)存塊未發(fā)生泄漏,當(dāng)所述地址的內(nèi)存塊占用時間大于所述最大占用時間ΜΑΧ_??ΜΕ時,則所述地址的內(nèi)存塊發(fā)生泄漏;內(nèi)存泄漏的檢查結(jié)果傳送至所述顯示模塊40進(jìn)行顯示。
[0037]如圖2所示的實施例,本發(fā)明的內(nèi)存泄漏檢查方法,包括如下步驟:
[0038]S100、在目標(biāo)應(yīng)用程序申請分配內(nèi)存前,內(nèi)存數(shù)據(jù)采集模塊采集內(nèi)存分配數(shù)據(jù);在目標(biāo)應(yīng)用程序釋放內(nèi)存前,內(nèi)存數(shù)據(jù)采集模塊采集內(nèi)存釋放數(shù)據(jù);
[0039]S110、將所述內(nèi)存數(shù)據(jù)采集模塊采集的數(shù)據(jù)傳送至內(nèi)存泄漏分析模塊,所述數(shù)據(jù)以記錄R的形式保存至所述內(nèi)存泄漏分析模塊的hash表中;
[0040]S120、判斷記錄R的類型,若R的記錄類型為“ 1”,則繼續(xù)到下一步;若R的記錄類型為“2”,則轉(zhuǎn)至步驟S126 ;<