一般來說內存泄露是常見的問題,那么怎么處理它呢?這里給大家分享一款內存泄露查找清理軟件(MemProof),使用它可以快速的查找內存和資源的泄露,幫助您更好的檢測和處理您的系統。
軟件說明:
內存泄露查找清理軟件(MemProof) 是AutomatedQA出品的一款非常不錯的檢測內存泄漏和資源泄漏的免費調試工具,適合于WIN32平臺下使用DELPHI/C++ BUILDER開發的應用程序。利用它可以方便的查找出一些忘記釋放的指針以及資源。它通過在調試模式下運行目標程序,監視程序的創建和釋放操作,以達到檢測資源泄漏的效果。監測過程中它會根據資源類型計數,每次創建后增加計數,釋放則遞減計數,最后程序結束根據計數即可判斷出資源的泄漏。
安裝說明:
MemProof是一個綠色軟件,下載完成后解壓,運行MemProof.exe即可。
使用說明:
MemProof要求目標程序帶有完整的調試信息。打開工程選項(Project-Options)
1、 Compiler面板
去掉Optimization(代碼優化)選項
選擇Stack Frames(為所有過程函數強制生成調用堆棧)選項
選擇Debug information (在DCU文件中生成調試信息)選項
選擇Use Debug DCUS(編譯時鏈接帶有調試信息的VCL DCU文件)選項
2、 Linker面板
選擇Detailed(生成完整的MAP文件,包含模塊、單元、過程等地址信息)選項
選擇Include TD32 debug info(將調試信息生成到可執行文件)選項
該選項會導致可執行文件體積增大,但不會影響運行效率以及內存占用,建議在正式發布時不要帶上該選項。
打開MemProof:
Resources –資源的類型,包括Error(錯誤)、Pointers(指針)、Memory(內存)、GDI(畫布資源)、User(系統對象)、Kernel(核心對象)、Registry(注冊表)。
Resources Count –資源數目,Current#代表當前數目,Peak#代表峰值數目
Resources Size –資源大小,Current#代表當前大小,Peak#代表峰值大小
選擇File-Open打開要調試的執行文件,再選擇Run-Run開始運行,再正常退出目標程序,如果有資源泄漏MemProof會自動打開Resources Details面板:
MemProof共列出5個內存泄漏,我們可以看到每個內存泄漏都有詳細的調用棧情況,以及相對應的源碼位置。
有時它會提示我們找不到對應的源碼,這是應為沒有指定源碼搜索路徑的原因。MemProof有兩個位置可以設置源碼搜索路徑,一個在Configure- Search Directories,一個在Projects-Search Directories。前者是設置全局路徑,后者是設置當前路徑。一般建議在前者中設置DELPHI的VCL以及共用庫代碼的路徑,后者設置工程本身源碼的路徑。MemProof還為用戶提供了快捷搜索VCL源碼路徑的按鈕Get Default for,使用這個按鈕可以快捷的獲取DELPHI的Libray Path(有的用戶安裝了VC覆蓋了默認調試工具選項,所以有可能得到的是VC的Libray Path,這種情況可以直接到DELPHI的Libray Path中去拷貝即可)。
如果需要測試動態連接庫,可以選擇Project-Parameters,在Host Applications中選擇主體程序,如果需要帶命令行,則在Parameters中輸入命令行,然后就可以開始測試了,和DELPHI中調試的方法是一樣的。MemProof不支持Attach Process的調試方式,這是一個不足的地方。
使用其實非常簡單,一看就明白了,下面介紹些調試中的經驗技巧。
使用技巧:
漸進式測試,從最易發現的錯誤開始解決
一個大型的軟件可能會有很多泄漏或者錯誤,這個時候可以漸進式的來測試,第一次測試可以直接運行后立即退出,檢測在加載的過程中是否存在泄漏,然后逐一更正。再分功能模塊進行測試,比如只針對某個功能進行操作,然后退出檢測該模塊是否存在泄漏,如果存在,更正。最后再進行整體測試。這樣可以避免一些關聯性錯誤導致重復測試,而且可以節省測試時間,可以使測試更有針對性。
分模塊測試,從單個的模塊開始解決
和上一條原則一樣,為了縮小測試面。在Projects的Moudle Configers中選擇測試的模塊,開始每次只選擇一個模塊針對性測試,最后再選擇所有模塊測試。注意:不要選擇一些如:Ole32.dll、kernel32.dll等系統模塊。
錯誤優先,發現錯誤與泄漏并存時,優先解決錯誤
測試過程中,代表錯誤,這些錯誤往往是由于錯誤的使用系統API導致,如:釋放不存在的句柄,訪問權限不夠的資源,傳遞了錯誤的調用參數等。這些錯誤往往會導致代碼沒有按照預計的方式運行,觸發一些內存泄漏。所以,需要優先修正這些位置。
系統資源優先,發現有GDI、User、Kernel、Registry等存在泄漏時優先解決
系統資源泄漏往往是由于窗體、畫布等資源沒有及時釋放,這些錯誤非常明顯,而且這種錯誤往往會帶有很多的Pointers、Memory泄漏,所以,優先修正
什么是內存泄露?
一般我們常說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小可以在程序運行期決定),使用完后必須顯式釋放的內存。應用程序一般使用malloc,calloc,realloc,new等函數從堆中分配到一塊內存,使用完后,程序必須負責相應的調用free或delete釋放該內存塊,否則,這塊內存就不能被再次使用,我們就說這塊內存泄漏了。
內存泄漏是常見的問題。當以前分配的一片內存不再需要使用或無法訪問時,但是卻并沒有釋放它,那么對于該進程來說,會因此導致總可用內存的減少,這時就出現了內存泄漏。盡管優秀的編程實踐可以確保最少的泄漏,但是根據經驗,當使用大量的函數對相同的內存塊進行處理時,很可能會出現內存泄漏。尤其是在碰到錯誤路徑的情況下更是如此。
怎么解決內存泄露問題?
1. 一般內存泄露都是在new 和delete 或malloc和free沒有成對使用的情況下產生的。在代碼量較少的情況下可自行檢測。確保兩著成對使用。
2. c++中有智能指針的概念,sp和wp。這也是內存管理,避免內存泄露的一個方法。不過這個概念相對難度大一些。lz感興趣的話可以上網搜關鍵字“C++智能指針”。
3.在一些大的軟件工程中,一般在代碼設計完成后,會使用一些代碼檢測工具對代碼的運行進行跟蹤。這里就包括對內存泄露問題的檢測,常用的工具有valgrind,它會在跟著整個程序運行一遍后顯示內存的使用和釋放情況。valgrind使用方法不難,lz可上網搜索相應教程。
- PC官方版
- 安卓官方手機版
- IOS官方手機版