作效率, 降低成本,提高內(nèi)存泄露檢測(cè)的準(zhǔn)確性,同時(shí)支持在執(zhí)行實(shí)體生命周期內(nèi)回收已泄露內(nèi)存。
【附圖說明】
[0054] 圖1示出了本發(fā)明的一種內(nèi)存泄露的檢測(cè)方法實(shí)施例的步驟流程圖;
[0055] 圖2示出了本發(fā)明的一種內(nèi)存泄露的檢測(cè)方法實(shí)施例中雙向鏈表的示意圖;
[0056] 圖3示出了雙向鏈表中節(jié)點(diǎn)的示意圖;
[0057] 圖4示出了本發(fā)明的一種內(nèi)存泄露的檢測(cè)方法實(shí)施例的步驟流程圖;
[0058] 圖5示出了本發(fā)明的一種內(nèi)存泄露的檢測(cè)裝置實(shí)施例的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0059] 為使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí) 施方式對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說明。
[0060] 本發(fā)明實(shí)施例的核心構(gòu)思之一在于,通過為每塊內(nèi)存預(yù)留監(jiān)測(cè)空間存放內(nèi)存頭信 息,記錄每一塊申請(qǐng)內(nèi)存所對(duì)應(yīng)的時(shí)間戳和申請(qǐng)者信息;而當(dāng)用戶內(nèi)存釋放時(shí),能快速定位 并刪除該內(nèi)存塊的"已分配"屬性;用戶通過查看從起始時(shí)間戳T1開始到終止時(shí)間戳T2的 檢測(cè)時(shí)間段區(qū)間內(nèi)申請(qǐng)且未釋放的內(nèi)存的內(nèi)存頭信息,判斷出該內(nèi)存的用途,從而確定是 否發(fā)生內(nèi)存泄露。
[0061] 參照?qǐng)D1,示出了本發(fā)明的一種內(nèi)存泄露的檢測(cè)方法實(shí)施例的步驟流程圖,內(nèi)存中 包括雙向鏈表,所述雙向鏈表包括一個(gè)或多個(gè)已分配的內(nèi)存塊的內(nèi)存頭信息,具體可以包 括如下步驟:
[0062] 步驟101,確定檢測(cè)時(shí)間段區(qū)間;
[0063] 在具體實(shí)現(xiàn)中,檢測(cè)時(shí)間段區(qū)間可以是當(dāng)前時(shí)刻之前的一個(gè)時(shí)間段區(qū)間。
[0064] 步驟102,在所述雙向鏈表中遍歷出所述檢測(cè)時(shí)間段區(qū)間內(nèi)的內(nèi)存頭信息;
[0065] 在實(shí)際應(yīng)用中,雙向鏈表可以存儲(chǔ)在內(nèi)存中,可以用于記錄該內(nèi)存中所有已分配 的內(nèi)存塊。
[0066] 內(nèi)存頭信息中可以包括時(shí)間屬性,若時(shí)間屬性位于檢測(cè)時(shí)間段區(qū)間內(nèi),將該雙向 鏈表中的內(nèi)存頭信息遍歷出來。
[0067] 在本發(fā)明實(shí)施例的一種優(yōu)選示例中,所述內(nèi)存頭信息包括已分配的內(nèi)存塊的分配 時(shí)間戳、已分配的內(nèi)存塊的內(nèi)存大小、調(diào)用函數(shù)信息以及調(diào)用函數(shù)在文件中的位置信息。
[0068] 參照?qǐng)D2,示出了本發(fā)明的一種內(nèi)存泄露的檢測(cè)方法實(shí)施例中雙向鏈表的示意圖。
[0069] 如圖2所示,雙向鏈表可以包括鏈表頭和一個(gè)或多個(gè)節(jié)點(diǎn),其中,鏈表頭可以包括 頭指針Head和Count函數(shù),頭指針Head可以用于指向第一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)可以包括后向指針 Next、前向指針Prev、已分配的內(nèi)存塊的分配時(shí)間戳、已分配的內(nèi)存塊的內(nèi)存大小、調(diào)用函 數(shù)信息以及調(diào)用函數(shù)在文件中的位置信息等,后向指針Next可以用于指向下一個(gè)節(jié)點(diǎn),前 向指針Prev可以用于指向前一個(gè)節(jié)點(diǎn)。
[0070] 參照?qǐng)D3,示出了雙向鏈表中節(jié)點(diǎn)的示意圖。
[0071] 如圖3所示,節(jié)點(diǎn)占用M個(gè)字節(jié),也可以稱為M空間,用戶在每次申請(qǐng)內(nèi)存時(shí),實(shí)際 申請(qǐng)內(nèi)存的空間可以比用戶所需內(nèi)存的空間多M個(gè)字節(jié),該M個(gè)字節(jié)即可以用于存放內(nèi)存 頭信息,并且,可以位于實(shí)際申請(qǐng)到的內(nèi)存塊的低端,內(nèi)存頭信息所占的M個(gè)字節(jié)的空間可 以為監(jiān)測(cè)內(nèi)存泄露所需的記錄空間;在M空間中可以記錄本次用戶申請(qǐng)的內(nèi)存大小、調(diào)用 者的函數(shù)名、調(diào)用者所在文件中的行號(hào),以及分配時(shí)間戳等信息,并將該M空間作為雙向鏈 表的節(jié)點(diǎn)插入鏈表中;給用戶返回的內(nèi)存塊地址是修正后的,即返回的內(nèi)存塊地址為緊鄰 在內(nèi)存頭信息之后的地址。
[0072] 內(nèi)存用戶無需感知M空間的存在,當(dāng)用戶每次釋放內(nèi)存時(shí),在內(nèi)存釋放函數(shù)的內(nèi) 部實(shí)現(xiàn)中,先根據(jù)用戶入?yún)⒌牡刂废蚯捌芃字節(jié)大小,獲取到其M空間,也即是其在雙向 鏈表中的節(jié)點(diǎn)地址,然后將該節(jié)點(diǎn)從雙向鏈表中刪除。
[0073] 在編碼實(shí)現(xiàn)中,可以通過將標(biāo)準(zhǔn)庫(kù)提供的malloc/free改造成宏函數(shù)的方式,使 用戶感受不到軟件編碼上的差異,有效降低代碼移植的成本?!揪唧w實(shí)施方式】可以為:
[0074] 可以自定義my_malloc函數(shù)實(shí)現(xiàn)M空間,以及將該M空間作為雙向鏈表的節(jié)點(diǎn)插 入雙向鏈表;
[0075] 可以自定義my_free函數(shù)實(shí)現(xiàn)將節(jié)點(diǎn)從雙向鏈表中刪除;
[0076]以C語(yǔ)言為例,可以新建一個(gè)原型聲明的頭文件,其中至少應(yīng)包含以下內(nèi)容:
【主權(quán)項(xiàng)】
1. 一種內(nèi)存泄露的檢測(cè)方法,其特征在于,內(nèi)存中包括已分配內(nèi)存的雙向鏈表,所述雙 向鏈表包括一個(gè)或多個(gè)已分配的內(nèi)存塊的內(nèi)存頭信息,所述方法包括: 確定檢測(cè)時(shí)間段區(qū)間; 在所述雙向鏈表中遍歷出所述檢測(cè)時(shí)間段區(qū)間內(nèi)的內(nèi)存頭信息; 依據(jù)所述內(nèi)存頭信息判斷對(duì)應(yīng)的一個(gè)或多個(gè)已分配的內(nèi)存塊是否發(fā)生內(nèi)存泄露。
2. 根據(jù)權(quán)利要求1所述的檢測(cè)方法,其特征在于,還包括: 若判定對(duì)應(yīng)的一個(gè)或多個(gè)已分配的內(nèi)存塊發(fā)生內(nèi)存泄露,回收所述對(duì)應(yīng)的一個(gè)或多個(gè) 已分配的內(nèi)存塊。
3. 根據(jù)權(quán)利要求1或2所述的檢測(cè)方法,其特征在于,所述檢測(cè)時(shí)間段區(qū)間包括起始時(shí) 間戳和終止時(shí)間戳,所述終止時(shí)間戳大于所述起始時(shí)間戳,所述確定檢測(cè)時(shí)間段區(qū)間的步 驟包括: 獲取當(dāng)前時(shí)刻對(duì)應(yīng)的當(dāng)前時(shí)間戳; 采用預(yù)設(shè)的第一時(shí)間差和所述當(dāng)前時(shí)間戳確定起始時(shí)間戳; 采用預(yù)設(shè)的第二時(shí)間差和所述當(dāng)前時(shí)間戳確定終止時(shí)間戳,所述第一時(shí)間差大于第二 時(shí)間差。
4. 根據(jù)權(quán)利要求3所述的檢測(cè)方法,其特征在于,所述內(nèi)存頭信息包括已分配的內(nèi)存 塊的分配時(shí)間戳,所述在所述雙向鏈表中遍歷出所述檢測(cè)時(shí)間段區(qū)間內(nèi)的內(nèi)存頭信息的步 驟包括: 在所述雙向鏈表中遍歷出一個(gè)或多個(gè)已分配的內(nèi)存塊的分配時(shí)間戳; 判斷所述分配時(shí)間戳是否在所述檢測(cè)時(shí)間段區(qū)間內(nèi); 若所述分配時(shí)間戳在所述檢測(cè)時(shí)間段區(qū)間內(nèi),則提取出對(duì)應(yīng)的內(nèi)存頭信息; 若所述分配時(shí)間戳不在所述檢測(cè)時(shí)間段區(qū)間內(nèi),則忽略對(duì)應(yīng)的內(nèi)存頭信息。
5. 根據(jù)權(quán)利要求4所述的檢測(cè)方法,其特征在于,所述內(nèi)存頭信息還包括已分配的內(nèi) 存塊的內(nèi)存大小、調(diào)用函數(shù)信息W及調(diào)用函數(shù)在文件中的位置信息,所述依據(jù)所述內(nèi)存頭 信息判斷對(duì)應(yīng)的一個(gè)或多個(gè)已分配的內(nèi)存塊是否發(fā)生內(nèi)存泄露的步驟包括: 依據(jù)所述已分配的內(nèi)存塊的內(nèi)存大小確定出一個(gè)或多個(gè)已分配的內(nèi)存塊; 結(jié)合所述調(diào)用函數(shù)信息W及調(diào)用函數(shù)在文件中的位置信息判斷所述一個(gè)或多個(gè)已分 配的內(nèi)存塊在所述當(dāng)前時(shí)間戳之前是否需要釋放; 若判定所述一個(gè)或多個(gè)已分配的內(nèi)存塊在所述當(dāng)前時(shí)間戳之前需要釋放而實(shí)際未釋 放,則判定所述一個(gè)或多個(gè)已分配的內(nèi)存塊發(fā)生內(nèi)存泄露;否則,判定所述一個(gè)或多個(gè)已分 配的內(nèi)存塊未發(fā)生內(nèi)存泄露。
6. -種內(nèi)存泄露的檢測(cè)裝置,其特征在于,內(nèi)存中包括雙向鏈表,所述雙向鏈表包括一 個(gè)或多個(gè)已分配的內(nèi)存塊的內(nèi)存頭信息,所述裝置包括: 檢測(cè)時(shí)間段區(qū)間確定模塊,用于確定檢測(cè)時(shí)間段區(qū)間; 內(nèi)存頭信息遍歷模塊,用于在所述雙向鏈表中遍歷出所述檢測(cè)時(shí)間段區(qū)間內(nèi)的內(nèi)存頭 信息; 內(nèi)存泄露判斷模塊,用于依據(jù)所述內(nèi)存頭信息判斷對(duì)應(yīng)的一個(gè)或多個(gè)已分配的內(nèi)存塊 是否發(fā)生內(nèi)存泄露。
7. 根據(jù)權(quán)利要求6所述的檢測(cè)裝置,其特征在于,還包括: 已分配的內(nèi)存塊回收模塊,用于在判定對(duì)應(yīng)的一個(gè)或多個(gè)已分配的內(nèi)存塊發(fā)生內(nèi)存泄 露時(shí),回收所述對(duì)應(yīng)的一個(gè)或多個(gè)已分配的內(nèi)存塊。
8. 根據(jù)權(quán)利要求6或7所述的檢測(cè)裝置,其特征在于,所述檢測(cè)時(shí)間段區(qū)間包括起始時(shí) 間戳和終止時(shí)間戳,所述終止時(shí)間戳大于所述起始時(shí)間戳,所述檢測(cè)時(shí)間段區(qū)間確定模塊 包括: 當(dāng)前時(shí)間戳獲取子模塊,用于獲取當(dāng)前時(shí)刻對(duì)應(yīng)的當(dāng)前時(shí)間戳; 起始時(shí)間戳確定子模塊,用于采用預(yù)設(shè)的第一時(shí)間差和所述當(dāng)前時(shí)間戳確定起始時(shí)間 戳; 終止時(shí)間戳確定子模塊,用于采用預(yù)設(shè)的第二時(shí)間差和所述當(dāng)前時(shí)間戳確定終止時(shí)間 戳,所述第一時(shí)間差大于第二時(shí)間差。
9. 根據(jù)權(quán)利要求8所述的檢測(cè)裝置,其特征在于,所述內(nèi)存頭信息包括已分配的內(nèi)存 塊的分配時(shí)間戳,所述內(nèi)存頭信息遍歷模塊包括: 分配時(shí)間戳遍歷子模塊,用于在所述雙向鏈表中遍歷出一個(gè)或多個(gè)已分配的內(nèi)存塊的 分配時(shí)間戳; 分配時(shí)間戳判斷子模塊,用于判斷所述分配時(shí)間戳是否在所述檢測(cè)時(shí)間段區(qū)間內(nèi); 第一判定子模塊,用于在所述分配時(shí)間戳在所述檢測(cè)時(shí)間段區(qū)間內(nèi)時(shí),提取出對(duì)應(yīng)的 內(nèi)存頭信息; 第二判定子模塊,用于在所述分配時(shí)間戳不在所述檢測(cè)時(shí)間段區(qū)間內(nèi)時(shí),忽略對(duì)應(yīng)的 內(nèi)存頭信息。
10. 根據(jù)權(quán)利要求9所述的檢測(cè)裝置,其特征在于,所述內(nèi)存頭信息還包括已分配的內(nèi) 存塊的內(nèi)存大小、調(diào)用函數(shù)信息W及調(diào)用函數(shù)在文件中的位置信息,所述內(nèi)存泄露判斷模 塊包括: 已分配的內(nèi)存塊確定子模塊,用于依據(jù)所述已分配的內(nèi)存塊的內(nèi)存大小確定出一個(gè)或 多個(gè)已分配的內(nèi)存塊; 已分配的內(nèi)存塊釋放判斷子模塊,用于結(jié)合所述調(diào)用函數(shù)信息W及調(diào)用函數(shù)在文件中 的位置信息判斷所述一個(gè)或多個(gè)已分配的內(nèi)存塊在所述當(dāng)前時(shí)間戳之前是否需要釋放; 泄露判定子模塊,用于在判定所述一個(gè)或多個(gè)已分配的內(nèi)存塊在所述當(dāng)前時(shí)間戳之前 需要釋放而實(shí)際未釋放時(shí),判定所述一個(gè)或多個(gè)已分配的內(nèi)存塊發(fā)生內(nèi)存泄露。
【專利摘要】本發(fā)明實(shí)施例提供了一種內(nèi)存泄露的檢測(cè)方法和裝置,內(nèi)存中包括已分配內(nèi)存的雙向鏈表,所述雙向鏈表包括一個(gè)或多個(gè)已分配的內(nèi)存塊的內(nèi)存頭信息,所述方法包括:確定檢測(cè)時(shí)間段區(qū)間;在所述雙向鏈表中遍歷出所述檢測(cè)時(shí)間段區(qū)間內(nèi)的內(nèi)存頭信息;依據(jù)所述內(nèi)存頭信息判斷對(duì)應(yīng)的一個(gè)或多個(gè)已分配的內(nèi)存塊是否發(fā)生內(nèi)存泄露。本發(fā)明可以實(shí)時(shí)并直觀檢測(cè)出內(nèi)存泄露,提高軟件性能,減少或避免人工操作,從而省時(shí)省力,降低操作難度,提高工作效率,降低成本,提高內(nèi)存泄露檢測(cè)的準(zhǔn)確性,同時(shí)支持在執(zhí)行實(shí)體生命周期內(nèi)回收已泄露內(nèi)存。
【IPC分類】G06F11-36
【公開號(hào)】CN104572460
【申請(qǐng)?zhí)枴緾N201410850566
【發(fā)明人】趙金芳
【申請(qǐng)人】大唐移動(dòng)通信設(shè)備有限公司
【公開日】2015年4月29日
【申請(qǐng)日】2014年12月30日