本發(fā)明涉及計算機領域,尤其涉及一種檢測計算機程序運行過程中內(nèi)存泄露的方法與裝置。
背景技術(shù):在使用支持有內(nèi)存分配的語言,(例如C,C+,C++,OBJECTIVE-C語言)過程中,需要大量的手動分配內(nèi)存,而分配之后的釋放時常會遺忘,造成內(nèi)存泄漏,因此對于內(nèi)存泄漏的檢測是十分必要的。目前,業(yè)界已經(jīng)有許多代碼和工具用于做內(nèi)存泄漏的檢測,但是通過代碼運行后進行內(nèi)存泄漏檢測,其檢測后的內(nèi)容不直觀,還需要分析是哪一行的代碼存在內(nèi)存泄漏。如果使用工具進行檢測,消耗的成本比較大,而且可能會產(chǎn)生漏測的情況。而且通常的測量方式存在生成的目標代碼過大,檢測開關(guān)切換不方便等問題。
技術(shù)實現(xiàn)要素:本發(fā)明的目的在于,提供一種檢測內(nèi)存泄露的方法與裝置,既可以直觀方便地檢測內(nèi)存泄露,又不會使生成的目標代碼過大,也可以非常方便的切換檢測開關(guān)。為實現(xiàn)上述發(fā)明目的,本發(fā)明提供了一種檢測內(nèi)存泄露的方法,包括以下步驟:啟動程序;分配新內(nèi)存時,根據(jù)內(nèi)存分配的地址,在設定的路徑內(nèi)生成內(nèi)存跟蹤文件,內(nèi)存跟蹤文件的內(nèi)容或文件名與分配的內(nèi)存地址、分配內(nèi)存的文件或分配內(nèi)存的源代碼的行號相關(guān);釋放內(nèi)存時,根據(jù)傳進的內(nèi)存地址,刪除相應的內(nèi)存跟蹤文件。優(yōu)選地,在步驟啟動程序與步驟分配新內(nèi)存之間,進行步驟:創(chuàng)立內(nèi)存跟蹤文件夾;在步驟分配新內(nèi)存時,根據(jù)內(nèi)存分配的地址,在內(nèi)存跟蹤文件夾內(nèi)生成內(nèi)存跟蹤文件。優(yōu)選地,所述內(nèi)存跟蹤文件的文件名為分配的內(nèi)存的地址號,文件內(nèi)容為分配內(nèi)存的文件和分配內(nèi)存的源代碼的行號。優(yōu)選地,在步驟啟動程序之后,判斷是否檢測內(nèi)存泄露,若是,則進行步驟:根據(jù)內(nèi)存分配的地址,在設定的路徑內(nèi)生成內(nèi)存跟蹤文件;若否,不檢測內(nèi)存泄露。更優(yōu)選地,若不檢測內(nèi)存泄露,使用程序語言自身函數(shù)進行內(nèi)存的分配與釋放。優(yōu)選地,分配新內(nèi)存通過運行定義的分配內(nèi)存宏實現(xiàn),所述分配內(nèi)存宏與以下參數(shù)相關(guān):要分配的內(nèi)存的地址、代碼文件的名稱以及程序代碼的行號;所述釋放內(nèi)存是通過定義的釋放內(nèi)存宏實現(xiàn)的,所述釋放內(nèi)存與參數(shù):分配的內(nèi)存的地址相關(guān)。更優(yōu)選地,所述判斷是否檢測內(nèi)存泄露是通過檢測配置文件中檢測開關(guān)是否開啟進行判斷。優(yōu)選地,所述程序的源代碼使用C,C+,C++或OBJECTIVE-C語言編寫。為實現(xiàn)本發(fā)明的另一個發(fā)明目的,本發(fā)明提供了一種檢測內(nèi)存泄露的裝置,所述檢測內(nèi)存泄露的裝置包括以下模塊:生成模塊,分配新內(nèi)存時,根據(jù)內(nèi)存分配的地址,在設定的路徑內(nèi)生成內(nèi)存跟蹤文件,內(nèi)存跟蹤文件的內(nèi)容或文件名與分配的內(nèi)存地址、分配內(nèi)存的文件或分配內(nèi)存的源代碼的行號相關(guān);刪除模塊,用于釋放內(nèi)存時,根據(jù)傳進的內(nèi)存地址,刪除相應的內(nèi)存跟蹤文件。優(yōu)選地,所述生成模塊還用于創(chuàng)立內(nèi)存跟蹤文件夾,在步驟分配新內(nèi)存時,根據(jù)內(nèi)存分配的地址,在內(nèi)存跟蹤文件夾內(nèi)生成內(nèi)存跟蹤文件,所述內(nèi)存跟蹤文件的文件名為分配的內(nèi)存的地址號,文件內(nèi)容為分配內(nèi)存的文件和分配內(nèi)存的源代碼的行號。與現(xiàn)有技術(shù)不同地,本發(fā)明通過分配新內(nèi)存時,根據(jù)內(nèi)存分配的地址,在設定的路徑內(nèi)生成內(nèi)存跟蹤文件,然后釋放內(nèi)存時,根據(jù)傳進的內(nèi)存地址,刪除相應的內(nèi)存跟蹤文件。由于內(nèi)存跟蹤文件的內(nèi)容或文件名與分配的內(nèi)存地址、分配內(nèi)存的文件或分配內(nèi)存的源代碼的行號相關(guān);因此當程序運行完畢之后,可以根據(jù)設定的路徑內(nèi)所存在的內(nèi)存跟蹤文件判斷內(nèi)存泄露的情況。若設定的路徑內(nèi)存在未刪除的內(nèi)存跟蹤文件,則說明有分配的內(nèi)存未被釋放。本發(fā)明操作十分方便,且不會使生成的目標代碼過大,通過肉眼觀察即可很直觀地發(fā)現(xiàn)代碼文件中是否出現(xiàn)內(nèi)存泄漏的問題。而且本發(fā)明布署方便,無需工具,不需要開發(fā)人員具備很強的代碼調(diào)試能力;同時不需要開發(fā)人員全程參與,減小測試時對開發(fā)人員的依賴。附圖說明圖1為本發(fā)明具體實施方式所述檢測內(nèi)存泄露的方法的流程圖;圖2為本發(fā)明具體實施方式所述檢測內(nèi)存泄露的裝置的模塊圖。具體實施方式為詳細說明本發(fā)明的技術(shù)內(nèi)容、構(gòu)造特征、所實現(xiàn)目的及效果,以下結(jié)合實施方式并配合附圖詳予說明。請參閱圖1本實施例提供了一種檢測內(nèi)存泄露的方法,包括以下步驟:S101啟動程序;S102判斷是否檢測內(nèi)存泄露,若是,則進行內(nèi)存泄露檢測;若否,不檢測內(nèi)存泄露,進行步驟S106使用程序語言自身函數(shù)進行內(nèi)存的分配與釋放。進行內(nèi)存泄露檢測的步驟具體如下,S103創(chuàng)立內(nèi)存跟蹤文件夾;S104分配新內(nèi)存時,根據(jù)內(nèi)存分配的地址,在內(nèi)存跟蹤文件夾內(nèi)生成內(nèi)存跟蹤文件,內(nèi)存跟蹤文件的內(nèi)容或文件名與分配的內(nèi)存地址、分配內(nèi)存的文件或分配內(nèi)存的源代碼的行號相關(guān);在某些實施例中,所述內(nèi)存跟蹤文件的文件名為分配的內(nèi)存的地址號,文件內(nèi)容為分配內(nèi)存的文件和分配內(nèi)存的源代碼的行號。這樣可以更加方便直觀地根據(jù)文件名以及文件中保存的內(nèi)容得知哪個代碼文件的哪一段程序代碼分配的內(nèi)存沒有被釋放,操作人員即可采取相應措施。在某些實施例中,可以采用與“創(chuàng)立內(nèi)存跟蹤文件夾,進而在后續(xù)分配內(nèi)存時,將內(nèi)存跟蹤文件生成在創(chuàng)立的內(nèi)存跟蹤文件夾內(nèi)”這一方案不同的技術(shù)方案。設定的路徑可以是設定的文件夾,也可以是盤符下的根目錄。例如用于生成內(nèi)存跟蹤文件的設定的文件夾可以不必是創(chuàng)立的內(nèi)存跟蹤文件夾,而直接指定一個現(xiàn)有的文件或指定的目標文件夾。S105釋放內(nèi)存時,根據(jù)傳進的內(nèi)存地址,刪除相應的內(nèi)存跟蹤文件。在結(jié)束程序的時候,可以手動或者使用工具來分析跟蹤目錄,以得到內(nèi)存泄漏的信息。例如根據(jù)各文件中保存的內(nèi)容進行統(tǒng)計形成一個內(nèi)存泄露表,根據(jù)內(nèi)存泄露表即可得知各個代碼文件存在的內(nèi)存泄露的嚴重程度。在某些實施例中,設計內(nèi)存管理的函數(shù)如下:void*et_alloc(void**ppAddr,intiCount,char*szFile,intiLine);這是分配內(nèi)存的函數(shù),在這個函數(shù)中,將分配內(nèi)存,同時創(chuàng)建跟蹤文件,記錄行號和文件名,ppAddr這個二級指針是將要分配內(nèi)存的地址,szFile是代碼文件名,iLine是行號,voidet_free(void**ppAddr);這是釋放內(nèi)存的函數(shù),同時還要刪除內(nèi)存跟蹤文件。分配新內(nèi)存通過運行定義的分配內(nèi)存宏實現(xiàn),所述分配內(nèi)存宏與以下參數(shù)相關(guān):要分配的內(nèi)存的地址、代碼文件的名稱以及程序代碼的行號;所述釋放內(nèi)存是通過定義的釋放內(nèi)存宏實現(xiàn)的,所述釋放內(nèi)存與參數(shù):分配的內(nèi)存的地址相關(guān)。同時宏還用于獲取文件名,代碼的行號等參數(shù),并把這些信息傳給相應的函數(shù),生成內(nèi)存跟蹤文件,或刪除相應的內(nèi)存跟蹤文件。某些實施例中,文件標記不僅適用在跟蹤文件,同時適用在配置中。在相應的情況下,需要在一套已經(jīng)生成的二進制可執(zhí)行文件中同時支持檢測與不檢測??梢园褭z測開關(guān)放在配置文件中,需要的時候打開檢查。為方便檢測開關(guān)的切換,在優(yōu)選的實施例中,可以通過配置文件實現(xiàn)檢測開關(guān)的切換,例如可以將檢測開關(guān)放置在文件根目錄下,需要切換檢測與否時,找到檢測文件,修改0或1(當然在具體實現(xiàn)時,有可能是true/false,也有可能是0/1,也有可能是on/off),就可以實現(xiàn)配置,無需重新編譯。這適用在已經(jīng)把可執(zhí)行程序發(fā)布給使用者,然后又需要在不重新編譯的情況下進行泄漏檢查,做法就是在et_alloc和et_free這一套分配和釋放的函數(shù)中,讀取全局的一個變量,而這一全局變量,在程序啟動時,就從配置文件中讀取了。在程序啟動時,對內(nèi)存泄漏是否進行檢測做一判定,內(nèi)存泄漏是否進行檢測的判定具體為:定義一配置文件,該配置文件設置有一是否進行檢測的開關(guān),該配置文件的內(nèi)容配置為0時,則檢測開關(guān)關(guān)閉,為1時,則檢測開關(guān)開啟。判斷是否檢測內(nèi)存泄露是通過檢測配置文件中檢測開關(guān)是否開啟進行判斷。上述實施例所述程序的源代碼使用C,C+,C++或OBJECTIVE-C語言編寫。本發(fā)明的上述實施例可以適用于:c語言,c++語言(可以相應的擴展new,delete),objective-c,上述實施例具有如下優(yōu)勢:可以直觀地發(fā)現(xiàn)程序中內(nèi)存泄露的問題,并能迅速找到泄露的原因;布署方便,成本低廉;不需要開發(fā)人員全程參與,減小測試時對開發(fā)人員的依賴。還可以便于異地開發(fā)調(diào)試,只需要將測試后的相應內(nèi)存跟蹤文件夾或內(nèi)存跟蹤文件通過網(wǎng)絡發(fā)送給分析、解決問題的人員即可。如圖2所示,本發(fā)明還提供了一種檢測內(nèi)存泄露的裝置20,所述檢測內(nèi)存泄露的裝置包括以下模塊:生成模塊201,分配新內(nèi)存時,根據(jù)內(nèi)存分配的地址,在設定的路徑內(nèi)生成內(nèi)存跟蹤文件,內(nèi)存跟蹤文件的內(nèi)容或文件名與分配的內(nèi)存地址、分配內(nèi)存的文件或分配內(nèi)存的源代碼的行號相關(guān);在某些實施例中,所述生成模塊還用于創(chuàng)立內(nèi)存跟蹤文件夾,在步驟分配新內(nèi)存時,根據(jù)內(nèi)存分配的地址,在內(nèi)存跟蹤文件夾內(nèi)生成內(nèi)存跟蹤文件,所述內(nèi)存跟蹤文件的文件名為分配的內(nèi)存的地址號,文件內(nèi)容為分配內(nèi)存的文件和分配內(nèi)存的源代碼的行號。刪除模塊202,用于釋放內(nèi)存時,根據(jù)傳進的內(nèi)存地址,刪除相應的內(nèi)存跟蹤文件。以上所述僅為本發(fā)明的實施例,并非因此限制本發(fā)明的專利范圍,凡是利用本發(fā)明說明書及附圖內(nèi)容所作的等效結(jié)構(gòu)或等效流程變換,或直接或間接運用在其他相關(guān)的技術(shù)領域,均同理包括在本發(fā)明的專利保護范圍內(nèi)。