本申請(qǐng)涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別是涉及一種檢測(cè)內(nèi)存泄露的方法和一種檢測(cè)內(nèi)存泄露的裝置。
背景技術(shù):
在計(jì)算機(jī)科學(xué)中,內(nèi)存泄露并非指內(nèi)存在物理上的消失,而是應(yīng)用程序在分配某段內(nèi)存后,由于設(shè)計(jì)的錯(cuò)誤,使得程序未能釋放已經(jīng)不再使用的內(nèi)存的情況,失去了對(duì)該段內(nèi)存的控制,從而造成了內(nèi)存的浪費(fèi)。
在LTE(Long Term Evolution,長期演進(jìn))技術(shù)中,PGW(PDN Gate Way,PDN網(wǎng)關(guān))網(wǎng)元作為用戶到PDN(Public DataNetwork,公用數(shù)據(jù)網(wǎng))網(wǎng)絡(luò)的錨點(diǎn),需要支持大容量用戶的反復(fù)接入、會(huì)話更新、會(huì)話刪除等操作,對(duì)于PGW網(wǎng)元的信令處理子系統(tǒng)來說,就意味著需要為用戶進(jìn)行大量的內(nèi)存申請(qǐng)和釋放,很容易造成在一些異常分支的遺漏釋放而出現(xiàn)內(nèi)存泄露的情形,然而這種內(nèi)存泄露的事件一般都是少量且隱蔽的,需要經(jīng)過很長時(shí)間的積累甚至已經(jīng)造成了嚴(yán)重后果才能被察覺。因此,軟件開發(fā)人員難以檢測(cè)和恢復(fù)泄露的內(nèi)存。
目前,軟件開發(fā)人員一般通過如下幾種方式來解決內(nèi)存泄露的問題:
第一種是根據(jù)編碼規(guī)范及程序處理邏輯進(jìn)行人工檢查,通過在程序編寫過程中采用良好一致的編程規(guī)范,在此基礎(chǔ)上由熟悉程序處理邏輯的有經(jīng)驗(yàn)的程序員進(jìn)行代碼走讀,能夠減小內(nèi)存泄露問題出現(xiàn)的幾率,但是,人工檢查效率較低,而且問題檢出率與檢測(cè)人員的個(gè)人能力關(guān)系較大。
第二種是使用靜態(tài)內(nèi)存檢測(cè)工具,如PC-LINT、BEAM等,檢查工具能夠?qū)Τ绦虼a進(jìn)行靜態(tài)檢查,發(fā)現(xiàn)可能出現(xiàn)的內(nèi)存泄露問題,在使用這類工具時(shí),如果規(guī)則定義的合理有效,也能夠發(fā)現(xiàn)一定數(shù)量的內(nèi)存泄露問題。然而,檢測(cè)工具的檢測(cè)規(guī)則設(shè)置是否合理、有效,會(huì)嚴(yán)重影響到問題的檢出。此外,靜態(tài)內(nèi)存檢測(cè)工具只能夠檢測(cè)出常規(guī)錯(cuò)誤,對(duì)于較復(fù)雜的錯(cuò)誤則無能為力。
以上兩種方式都屬于在軟件開發(fā)過程中,通過對(duì)程序代碼的檢測(cè),提前對(duì)可能出現(xiàn)的內(nèi)存泄露問題進(jìn)行預(yù)防的做法。第三種方式則是使用動(dòng)態(tài)內(nèi)存檢測(cè)工具,如Valgrind、Rational Purify等,在系統(tǒng)運(yùn)行過程中進(jìn)行動(dòng)態(tài)檢測(cè)。但是,動(dòng)態(tài)檢測(cè)需要對(duì)程序代碼使用特定的編譯選項(xiàng)重新進(jìn)行編譯,增加了對(duì)系統(tǒng)資源的耗費(fèi),而且,第三方工具的引入同時(shí)還增加了系統(tǒng)運(yùn)行的不確定性。
因此,目前需要本領(lǐng)域技術(shù)人員迫切解決的一個(gè)技術(shù)問題就是:提供一種檢測(cè)內(nèi)存泄露的方法和裝置,用以實(shí)時(shí)并直觀地檢測(cè)出內(nèi)存泄露的問題,避免人工操作,提高內(nèi)存泄露檢測(cè)的準(zhǔn)確性,以方便軟件開發(fā)人員及時(shí)地恢復(fù)泄露的內(nèi)存。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問題,提出了本申請(qǐng)實(shí)施例以便提供一種克服上述問題或者至少部分地解決上述問題的一種檢測(cè)內(nèi)存泄露的方法和相應(yīng)的一種檢測(cè)內(nèi)存泄露的裝置。
為了解決上述問題,本申請(qǐng)實(shí)施例公開了一種檢測(cè)內(nèi)存泄露的方法,所述內(nèi)存中設(shè)置有第一鏈表和第二鏈表,所述第一鏈表中具有多個(gè)存儲(chǔ)節(jié)點(diǎn),所述方法包括:
確定執(zhí)行內(nèi)存申請(qǐng)操作的內(nèi)存節(jié)點(diǎn),所述內(nèi)存節(jié)點(diǎn)具有對(duì)應(yīng)的屬性信息;
將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息,寫入所述第一鏈表中的存儲(chǔ)節(jié)點(diǎn);
將寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第一鏈表移入第二鏈表;
當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),將所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第二鏈表移入所述第一鏈表;
根據(jù)所述第一鏈表和所述第二鏈表確定內(nèi)存泄露信息。
優(yōu)選地,在所述將寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第一鏈表移入第二鏈表的步驟前,還包括:
建立所述內(nèi)存節(jié)點(diǎn)的屬性信息與所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)的索 引關(guān)系。
優(yōu)選地,所述當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),將所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第二鏈表移入所述第一鏈表的步驟包括:
當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),根據(jù)所述內(nèi)存節(jié)點(diǎn)的屬性信息與所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系,在所述第二鏈表中查找出所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn);
刪除所述存儲(chǔ)節(jié)點(diǎn)中寫入的屬性信息;
將已刪除屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第二鏈表中移入第一鏈表。
優(yōu)選地,所述根據(jù)所述第一鏈表和所述第二鏈表確定內(nèi)存泄露信息的步驟包括:
根據(jù)所述第一鏈表和所述第二鏈表,輸出內(nèi)存實(shí)際使用信息;
根據(jù)所述內(nèi)存實(shí)際使用信息,確定內(nèi)存泄露信息。
優(yōu)選地,所述屬性信息包括內(nèi)存操作編號(hào)、內(nèi)存文件名編號(hào)、內(nèi)存文件行號(hào)、內(nèi)存首地址,和/或,內(nèi)存大小。
為了解決上述問題,本申請(qǐng)實(shí)施例還公開了一種檢測(cè)內(nèi)存泄露的裝置,所述內(nèi)存中設(shè)置有第一鏈表和第二鏈表,所述第一鏈表中具有多個(gè)存儲(chǔ)節(jié)點(diǎn),所述裝置包括:
內(nèi)存節(jié)點(diǎn)確定模塊,用于確定執(zhí)行內(nèi)存申請(qǐng)操作的內(nèi)存節(jié)點(diǎn),所述內(nèi)存節(jié)點(diǎn)具有對(duì)應(yīng)的屬性信息;
屬性信息寫入模塊,用于將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息,寫入所述第一鏈表中的存儲(chǔ)節(jié)點(diǎn);
第一移入模塊,用于將寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第一鏈表移入第二鏈表;
第二移入模塊,用于當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),將所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第二鏈表移入所述第一鏈表;
內(nèi)存泄露信息確定模塊,用于根據(jù)所述第一鏈表和所述第二鏈表確定內(nèi)存泄露信息。
優(yōu)選地,所述裝置還包括:
索引關(guān)系建立模塊,用于建立所述內(nèi)存節(jié)點(diǎn)的屬性信息與所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系。
優(yōu)選地,所述第二移入模塊包括:
存儲(chǔ)節(jié)點(diǎn)查找子模塊,用于在所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),根據(jù)所述內(nèi)存節(jié)點(diǎn)的屬性信息與所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系,在所述第二鏈表中查找出所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn);
屬性信息刪除子模塊,用于刪除所述存儲(chǔ)節(jié)點(diǎn)中寫入的屬性信息;
存儲(chǔ)節(jié)點(diǎn)移入子模塊,用于將已刪除屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第二鏈表中移入第一鏈表。
優(yōu)選地,所述內(nèi)存泄露信息確定模塊包括:
內(nèi)存信息輸出子模塊,用于根據(jù)所述第一鏈表和所述第二鏈表,輸出內(nèi)存實(shí)際使用信息;
內(nèi)存泄露信息確定子模塊,用于根據(jù)所述內(nèi)存實(shí)際使用信息,確定內(nèi)存泄露信息。
優(yōu)選地,所述屬性信息包括內(nèi)存操作編號(hào)、內(nèi)存文件名編號(hào)、內(nèi)存文件行號(hào)、內(nèi)存首地址,和/或,內(nèi)存大小。
與背景技術(shù)相比,本申請(qǐng)實(shí)施例包括以下優(yōu)點(diǎn):
在本申請(qǐng)實(shí)施例中,通過預(yù)先設(shè)置兩條單向鏈表,當(dāng)內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存申請(qǐng)操作時(shí),將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息寫入第一鏈表的存儲(chǔ)節(jié)點(diǎn),并將所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從第一鏈表移入第二鏈表,然后,當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),又將所述存儲(chǔ)節(jié)點(diǎn)從第二鏈表移入第一鏈表,從而可以根據(jù)所述第一鏈表和所述第二鏈表確定出內(nèi)存泄露信息,使得軟件開發(fā)人員能夠?qū)崟r(shí)地檢測(cè)出內(nèi)存泄露的問題,避免了人工操作,提高了內(nèi)存泄露檢測(cè)的準(zhǔn)確性。
其次,在本申請(qǐng)實(shí)施例中,還可以通過使用SHELL命令的方式來提供一種用戶界面,輸出當(dāng)前仍在使用的內(nèi)存總大小,每一處內(nèi)存節(jié)點(diǎn)已經(jīng)申請(qǐng) 但還未釋放的內(nèi)存在最初申請(qǐng)時(shí)所在的文件名編號(hào)、內(nèi)存文件行號(hào),以及內(nèi)存大小等信息,使得軟件開發(fā)人員能夠直觀地獲得內(nèi)存使用信息,從而快速地確定出內(nèi)存泄露的問題,并定位到具體的內(nèi)存節(jié)點(diǎn),提高了內(nèi)存泄露檢測(cè)的準(zhǔn)確性,有助于及時(shí)地恢復(fù)泄露的內(nèi)存。
附圖說明
圖1是本申請(qǐng)的一種檢測(cè)內(nèi)存泄露的方法實(shí)施例一的步驟流程圖;
圖2是本申請(qǐng)的一種檢測(cè)內(nèi)存泄露的方法實(shí)施例二的步驟流程圖;
圖3是本申請(qǐng)的一種檢測(cè)內(nèi)存泄露的方法實(shí)施例三的步驟流程圖;
圖4是本申請(qǐng)的一種檢測(cè)內(nèi)存泄露的裝置實(shí)施例的結(jié)構(gòu)框圖。
具體實(shí)施方式
為使本申請(qǐng)的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式對(duì)本申請(qǐng)作進(jìn)一步詳細(xì)的說明。
參照?qǐng)D1,示出了本申請(qǐng)的一種檢測(cè)內(nèi)存泄露的方法實(shí)施例一的步驟流程圖,具體可以包括如下步驟:
步驟101,確定執(zhí)行內(nèi)存申請(qǐng)操作的內(nèi)存節(jié)點(diǎn);
通常,軟件開發(fā)人員在編寫PGW網(wǎng)元的信令處理子系統(tǒng)代碼時(shí),可以預(yù)先確定需要執(zhí)行內(nèi)存操作的節(jié)點(diǎn),所述內(nèi)存操作包括內(nèi)存申請(qǐng)操作,和/或,內(nèi)存釋放操作。而且,對(duì)于已經(jīng)正式發(fā)布的軟件版本來說,需要執(zhí)行內(nèi)存申請(qǐng)操作和內(nèi)存釋放操作的位置是完全固定不變的。
因此,在本申請(qǐng)實(shí)施例中,對(duì)于PGW網(wǎng)元的信令處理子系統(tǒng)而言,在系統(tǒng)運(yùn)行過程中,當(dāng)需要執(zhí)行內(nèi)存申請(qǐng)操作時(shí),可以首先確定執(zhí)行內(nèi)存申請(qǐng)操作的內(nèi)存節(jié)點(diǎn),所述內(nèi)存節(jié)點(diǎn)具有對(duì)應(yīng)的屬性信息,所述屬性信息可以包括內(nèi)存操作編號(hào)、內(nèi)存文件名編號(hào)、內(nèi)存文件行號(hào)、內(nèi)存首地址,和/或,內(nèi)存大小。所述屬性信息可以分別用于記錄在執(zhí)行內(nèi)存操作時(shí)的操作記錄編號(hào)、執(zhí)行操作的文件名對(duì)應(yīng)的編號(hào)、操作代碼所在行號(hào)、操作的內(nèi)存的首地址,以及,申請(qǐng)的內(nèi)存的大小。
步驟102,將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息,寫入所述第一鏈表中的存儲(chǔ)節(jié)點(diǎn);
在本申請(qǐng)實(shí)施例中,可以預(yù)先在所述內(nèi)存中設(shè)置兩條單向鏈表,即第一鏈表和第二鏈表。初始化時(shí),在所述第一鏈表中掛接多個(gè)存儲(chǔ)節(jié)點(diǎn),用于后續(xù)記錄內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息。
因此,當(dāng)內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存申請(qǐng)操作時(shí),可以將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息,寫入所述第一鏈表中的存儲(chǔ)節(jié)點(diǎn)。
步驟103,將寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第一鏈表移入第二鏈表;
在具體實(shí)現(xiàn)中,可以將寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第一鏈表中取出,然后掛接到第二鏈表中。此時(shí),第一鏈表中不再存儲(chǔ)有寫有所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息的存儲(chǔ)節(jié)點(diǎn)。
步驟104,當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),將所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第二鏈表移入所述第一鏈表;
在具體實(shí)現(xiàn)中,當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),可以將所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第二鏈表中取出,重新掛接到所述第一鏈表中。
步驟105,根據(jù)所述第一鏈表和所述第二鏈表確定內(nèi)存泄露信息。
在本申請(qǐng)實(shí)施例中,當(dāng)內(nèi)存節(jié)點(diǎn)執(zhí)行多次的內(nèi)存申請(qǐng)和內(nèi)存釋放操作后,可以根據(jù)此時(shí)在所述第一鏈表和所述第二鏈表中記錄的內(nèi)存節(jié)點(diǎn)的屬性信息,得出已申請(qǐng)內(nèi)存但并未及時(shí)釋放的內(nèi)存節(jié)點(diǎn),從而確定出內(nèi)存泄露信息。
在本申請(qǐng)實(shí)施例中,通過預(yù)先設(shè)置兩條單向鏈表,當(dāng)內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存申請(qǐng)操作時(shí),將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息寫入第一鏈表的存儲(chǔ)節(jié)點(diǎn),并將所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從第一鏈表移入第二鏈表,然后,當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),又將所述存儲(chǔ)節(jié)點(diǎn)從第二鏈表移入第一鏈表,從而可以根據(jù)所述第一鏈表和所述第二鏈表確定出內(nèi)存泄露信息,使得軟件開發(fā)人員能夠?qū)崟r(shí)地檢測(cè)出內(nèi)存泄露的問題,避免了人工操作,提高了內(nèi)存泄露檢測(cè)的準(zhǔn)確性。
參照?qǐng)D2,示出了本申請(qǐng)的一種檢測(cè)內(nèi)存泄露的方法實(shí)施例二的步驟流程圖,具體可以包括如下步驟:
步驟201,確定執(zhí)行內(nèi)存申請(qǐng)操作的內(nèi)存節(jié)點(diǎn);
在本申請(qǐng)實(shí)施例中,當(dāng)需要執(zhí)行內(nèi)存申請(qǐng)操作時(shí),可以首先確定執(zhí)行內(nèi)存申請(qǐng)操作的內(nèi)存節(jié)點(diǎn),所述內(nèi)存節(jié)點(diǎn)具有對(duì)應(yīng)的屬性信息,所述屬性信息可以包括內(nèi)存操作編號(hào)、內(nèi)存文件名編號(hào)、內(nèi)存文件行號(hào)、內(nèi)存首地址,和/或,內(nèi)存大小。
步驟202,將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息,寫入所述第一鏈表中的存儲(chǔ)節(jié)點(diǎn);
在本申請(qǐng)實(shí)施例中,可以預(yù)先在所述內(nèi)存中設(shè)置兩條單向鏈表,并在所述第一鏈表中掛接多個(gè)存儲(chǔ)節(jié)點(diǎn)。當(dāng)內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存申請(qǐng)操作時(shí),可以將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息,寫入所述第一鏈表中的一個(gè)存儲(chǔ)節(jié)點(diǎn)。
步驟203,建立所述內(nèi)存節(jié)點(diǎn)的屬性信息與所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系;
在具體實(shí)現(xiàn)中,在將所述內(nèi)存節(jié)點(diǎn)的屬性信息寫入第一鏈表中的一個(gè)存儲(chǔ)節(jié)點(diǎn)后,可以建立所述內(nèi)存節(jié)點(diǎn)的屬性信息與所述存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系。具體地,所述索引關(guān)系可以通過HASH(哈希)表的方式進(jìn)行保存。
在本申請(qǐng)的一種優(yōu)選實(shí)施例中,可以根據(jù)所述內(nèi)存節(jié)點(diǎn)的首地址來建立起與所述存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系表。
步驟204,將寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第一鏈表移入第二鏈表;
在具體實(shí)現(xiàn)中,可以將所述存儲(chǔ)節(jié)點(diǎn)從所述第一鏈表中取出,掛接到第二鏈表中。
步驟205,當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),將所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第二鏈表移入所述第一鏈表;
當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),可以將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn)從第二鏈表中取出,重新掛接到第一鏈表中。
在具體實(shí)現(xiàn)中,由于已提前建立起所述內(nèi)存節(jié)點(diǎn)的屬性信息與所述寫入 有屬性信息的存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系,因此,當(dāng)所述內(nèi)存節(jié)點(diǎn)在執(zhí)行內(nèi)存釋放操作時(shí),可以根據(jù)建立的索引關(guān)系,查找出所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn),然后,將所述存儲(chǔ)節(jié)點(diǎn)從第二鏈表中取出,重新掛接到第一鏈表中。
步驟206,根據(jù)所述第一鏈表和所述第二鏈表確定內(nèi)存泄露信息。
在本申請(qǐng)的一種優(yōu)選實(shí)施例中,所述根據(jù)所述第一鏈表和所述第二鏈表確定內(nèi)存泄露信息具體可以包括如下子步驟:
子步驟2061,根據(jù)所述第一鏈表和所述第二鏈表,輸出內(nèi)存實(shí)際使用信息;
子步驟2062,根據(jù)所述內(nèi)存實(shí)際使用信息,確定內(nèi)存泄露信息。
在具體實(shí)現(xiàn)中,可以根據(jù)所述第一鏈表和所述第二鏈表中記錄的內(nèi)存節(jié)點(diǎn)的屬性信息,通過使用SHELL命令的方式來提供一種用戶界面,輸出當(dāng)前仍在使用的內(nèi)存總大小,每一處內(nèi)存節(jié)點(diǎn)已經(jīng)申請(qǐng)但還未釋放的內(nèi)存在最初申請(qǐng)時(shí)所在的文件名編號(hào)、內(nèi)存文件行號(hào),以及內(nèi)存大小,得出已申請(qǐng)內(nèi)存但并未及時(shí)釋放的內(nèi)存節(jié)點(diǎn),從而確定出內(nèi)存泄露信息,并定位出出現(xiàn)內(nèi)存泄露的內(nèi)存節(jié)點(diǎn),有助于及時(shí)地恢復(fù)泄露的內(nèi)存。
在本申請(qǐng)的實(shí)施例中,通過預(yù)先設(shè)置兩條單向鏈表,當(dāng)內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存申請(qǐng)操作時(shí),將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息寫入第一鏈表的存儲(chǔ)節(jié)點(diǎn),并建立起所述屬性信息與所述存儲(chǔ)節(jié)點(diǎn)間的索引關(guān)系,然后將所述存儲(chǔ)節(jié)點(diǎn)從第一鏈表移入第二鏈表,當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),根據(jù)所述索引關(guān)系查找出對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn),將所述存儲(chǔ)節(jié)點(diǎn)從第二鏈表中重新移入第一鏈表,從而可以根據(jù)所述第一鏈表和所述第二鏈表中記錄的內(nèi)存節(jié)點(diǎn)屬性信息,通過用戶界面的方式輸出內(nèi)存實(shí)際使用信息,從而確定出內(nèi)存泄露信息,使得軟件開發(fā)人員能夠直觀地獲得內(nèi)存使用信息,從而快速地確定出內(nèi)存泄露的問題,并定位到具體的內(nèi)存節(jié)點(diǎn),提高了內(nèi)存泄露檢測(cè)的準(zhǔn)確性,有助于及時(shí)地恢復(fù)泄露的內(nèi)存。
參照?qǐng)D3,示出了本申請(qǐng)的一種檢測(cè)內(nèi)存泄露的方法實(shí)施例三的步驟流程圖,具體可以包括如下步驟:
步驟301,確定執(zhí)行內(nèi)存申請(qǐng)操作的內(nèi)存節(jié)點(diǎn);
在本申請(qǐng)實(shí)施例中,當(dāng)需要執(zhí)行內(nèi)存申請(qǐng)操作時(shí),可以首先確定執(zhí)行內(nèi)存申請(qǐng)操作的內(nèi)存節(jié)點(diǎn),所述內(nèi)存節(jié)點(diǎn)具有對(duì)應(yīng)的屬性信息,所述屬性信息可以包括內(nèi)存操作編號(hào)、內(nèi)存文件名編號(hào)、內(nèi)存文件行號(hào)、內(nèi)存首地址,和/或,內(nèi)存大小。
步驟302,將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息,寫入所述第一鏈表中的存儲(chǔ)節(jié)點(diǎn);
在本申請(qǐng)實(shí)施例中,可以預(yù)先在所述內(nèi)存中設(shè)置兩條單向鏈表,并在所述第一鏈表中掛接多個(gè)存儲(chǔ)節(jié)點(diǎn)。當(dāng)內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存申請(qǐng)操作時(shí),可以將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息,寫入所述第一鏈表中的一個(gè)存儲(chǔ)節(jié)點(diǎn)。
步驟303,建立所述內(nèi)存節(jié)點(diǎn)的屬性信息與所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系;
在本申請(qǐng)的一種優(yōu)選實(shí)施例中,可以根據(jù)所述內(nèi)存節(jié)點(diǎn)的首地址來建立起與所述存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系,所述索引關(guān)系可以通過HASH(哈希)表的方式進(jìn)行保存。
步驟304,將寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第一鏈表移入第二鏈表;
在具體實(shí)現(xiàn)中,可以將所述存儲(chǔ)節(jié)點(diǎn)從所述第一鏈表中取出,掛接到第二鏈表中。
步驟305,當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),根據(jù)所述內(nèi)存節(jié)點(diǎn)的屬性信息與所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系,在所述第二鏈表中查找出所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn);
在具體實(shí)現(xiàn)中,當(dāng)所述內(nèi)存節(jié)點(diǎn)在執(zhí)行內(nèi)存釋放操作時(shí),可以根據(jù)所述內(nèi)存首地址與存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系,在所述第二鏈表中查找出所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn),然后執(zhí)行步驟306.
步驟306,刪除所述存儲(chǔ)節(jié)點(diǎn)中寫入的屬性信息;
由于所述內(nèi)存節(jié)點(diǎn)在執(zhí)行內(nèi)存釋放操作后,所述內(nèi)存節(jié)點(diǎn)已不再占用對(duì)應(yīng)的內(nèi)存,因此,此時(shí)可以將所述存儲(chǔ)節(jié)點(diǎn)中寫入的屬性信息刪除。
步驟307,將已刪除屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第二鏈表中移入第一鏈 表;
在本申請(qǐng)實(shí)施例中,可以將已刪除屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第二鏈表中取出,重新掛接到所述第一鏈表中,所述第一鏈表中的所有存儲(chǔ)節(jié)點(diǎn)均是未寫入任何信息的空閑可用節(jié)點(diǎn)。因此,當(dāng)有內(nèi)存節(jié)點(diǎn)在執(zhí)行內(nèi)存申請(qǐng)操作時(shí),可以獲取其中的任一一個(gè)存儲(chǔ)節(jié)點(diǎn)。
步驟308,根據(jù)所述第一鏈表和所述第二鏈表,輸出內(nèi)存實(shí)際使用信息;
在具體實(shí)現(xiàn)中,可以根據(jù)所述第一鏈表和所述第二鏈表中記錄的內(nèi)存節(jié)點(diǎn)的屬性信息,通過使用SHELL命令的方式來提供一種用戶界面,輸出當(dāng)前仍在使用的內(nèi)存總大小、每一處內(nèi)存節(jié)點(diǎn)已經(jīng)申請(qǐng)但還未釋放的內(nèi)存在最初申請(qǐng)時(shí)所在的文件名編號(hào)、內(nèi)存文件行號(hào),以及內(nèi)存大小等內(nèi)存實(shí)際使用信息。
步驟309,根據(jù)所述內(nèi)存實(shí)際使用信息,確定內(nèi)存泄露信息。
在本申請(qǐng)的實(shí)施例中,可以根據(jù)用戶界面輸出的所述內(nèi)存實(shí)際使用信息,得出已申請(qǐng)內(nèi)存但并未及時(shí)釋放的內(nèi)存節(jié)點(diǎn),從而確定出內(nèi)存泄露信息,并定位出出現(xiàn)內(nèi)存泄露的內(nèi)存節(jié)點(diǎn),有助于及時(shí)地恢復(fù)泄露的內(nèi)存。
在本申請(qǐng)的實(shí)施例中,通過預(yù)先設(shè)置兩條單向鏈表,當(dāng)內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存申請(qǐng)操作時(shí),將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息寫入第一鏈表的存儲(chǔ)節(jié)點(diǎn),并建立起內(nèi)存首地址與所述存儲(chǔ)節(jié)點(diǎn)間的索引關(guān)系,然后將所述存儲(chǔ)節(jié)點(diǎn)從第一鏈表移入第二鏈表,當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),根據(jù)所述索引關(guān)系查找出對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn),刪除所述存儲(chǔ)節(jié)點(diǎn)中寫入的內(nèi)存節(jié)點(diǎn)屬性信息,并將所述存儲(chǔ)節(jié)點(diǎn)從第二鏈表中重新移入第一鏈表,使得在執(zhí)行內(nèi)存操作時(shí),第一鏈表中的存儲(chǔ)節(jié)點(diǎn)均為空閑可用節(jié)點(diǎn),而第二鏈表中均為記錄了內(nèi)存節(jié)點(diǎn)屬性信息的存儲(chǔ)節(jié)點(diǎn),從而可以根據(jù)所述第一鏈表和所述第二鏈表輸出內(nèi)存實(shí)際使用信息,從而確定出內(nèi)存泄露信息,使得軟件開發(fā)人員能夠直觀地獲得內(nèi)存使用信息,從而快速地確定出內(nèi)存泄露的問題,并定位到具體的內(nèi)存節(jié)點(diǎn),提高了內(nèi)存泄露檢測(cè)的準(zhǔn)確性,有助于及時(shí)地恢復(fù)泄露的內(nèi)存。
需要說明的是,對(duì)于方法實(shí)施例,為了簡(jiǎn)單描述,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本申請(qǐng)實(shí)施例并不受所描述的動(dòng)作順序的限制,因?yàn)橐罁?jù)本申請(qǐng)實(shí)施例,某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作并不一定是本申請(qǐng)實(shí)施例所必須的。
參照?qǐng)D4,示出了本申請(qǐng)的一種檢測(cè)內(nèi)存泄露的裝置實(shí)施例的結(jié)構(gòu)框圖,所述內(nèi)存中設(shè)置有第一鏈表和第二鏈表,所述第一鏈表中具有多個(gè)存儲(chǔ)節(jié)點(diǎn),所述裝置具體可以包括如下模塊:
內(nèi)存節(jié)點(diǎn)確定模塊401,用于確定執(zhí)行內(nèi)存申請(qǐng)操作的內(nèi)存節(jié)點(diǎn),所述內(nèi)存節(jié)點(diǎn)具有對(duì)應(yīng)的屬性信息;
屬性信息寫入模塊402,用于將所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的屬性信息,寫入所述第一鏈表中的存儲(chǔ)節(jié)點(diǎn);
第一移入模塊403,用于將寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第一鏈表移入第二鏈表;
第二移入模塊404,用于當(dāng)所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),將所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第二鏈表移入所述第一鏈表;
內(nèi)存泄露信息確定模塊405,用于根據(jù)所述第一鏈表和所述第二鏈表確定內(nèi)存泄露信息。
在本申請(qǐng)的實(shí)施例中,所述裝置還可以包括如下模塊:
索引關(guān)系建立模塊406,用于建立所述內(nèi)存節(jié)點(diǎn)的屬性信息與所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系。
在本申請(qǐng)的實(shí)施例中,所述第二移入模塊404還可以包括如下子模塊:
存儲(chǔ)節(jié)點(diǎn)查找子模塊4041,用于在所述內(nèi)存節(jié)點(diǎn)執(zhí)行內(nèi)存釋放操作時(shí),根據(jù)所述內(nèi)存節(jié)點(diǎn)的屬性信息與所述寫入有屬性信息的存儲(chǔ)節(jié)點(diǎn)的索引關(guān)系,在所述第二鏈表中查找出所述內(nèi)存節(jié)點(diǎn)對(duì)應(yīng)的存儲(chǔ)節(jié)點(diǎn);
屬性信息刪除子模塊4042,用于刪除所述存儲(chǔ)節(jié)點(diǎn)中寫入的屬性信息;
存儲(chǔ)節(jié)點(diǎn)移入子模塊4043,用于將已刪除屬性信息的存儲(chǔ)節(jié)點(diǎn)從所述第 二鏈表中移入第一鏈表。
在本申請(qǐng)的實(shí)施例中,所述內(nèi)存泄露信息確定模塊405還可以包括如下子模塊:
內(nèi)存信息輸出子模塊4051,用于根據(jù)所述第一鏈表和所述第二鏈表,輸出內(nèi)存實(shí)際使用信息;
內(nèi)存泄露信息確定子模塊4052,用于根據(jù)所述內(nèi)存實(shí)際使用信息,確定內(nèi)存泄露信息。
在本申請(qǐng)的實(shí)施例中,所述屬性信息包括內(nèi)存操作編號(hào)、內(nèi)存文件名編號(hào)、內(nèi)存文件行號(hào)、內(nèi)存首地址,和/或,內(nèi)存大小。
對(duì)于裝置實(shí)施例而言,由于其與方法實(shí)施例基本相似,所以描述的比較簡(jiǎn)單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
本說明書中的各個(gè)實(shí)施例均采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似的部分互相參見即可。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本申請(qǐng)實(shí)施例的實(shí)施例可提供為方法、裝置、或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)實(shí)施例可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)實(shí)施例可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。
本申請(qǐng)實(shí)施例是參照根據(jù)本申請(qǐng)實(shí)施例的方法、終端設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備的處理器執(zhí)行的 指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。
這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。
這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理終端設(shè)備上,使得在計(jì)算機(jī)或其他可編程終端設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程終端設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。
盡管已描述了本申請(qǐng)實(shí)施例的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例做出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本申請(qǐng)實(shí)施例范圍的所有變更和修改。
最后,還需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者終端設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者終端設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者終端設(shè)備中還存在另外的相同要素。
以上對(duì)本申請(qǐng)所提供的一種檢測(cè)內(nèi)存泄露的方法和一種檢測(cè)內(nèi)存泄露的裝置,進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個(gè)例對(duì)本申請(qǐng)的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本申請(qǐng)的方法及其核心 思想;同時(shí),對(duì)于本領(lǐng)域的一般技術(shù)人員,依據(jù)本申請(qǐng)的思想,在具體實(shí)施方式及應(yīng)用范圍上均會(huì)有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對(duì)本申請(qǐng)的限制。