delphi記憶體泄露尋找工具之MemProof教程

來源:互聯網
上載者:User

MemProof教程簡介

       MemProof(記憶體清道夫)是AutomatedQA出品的一款非常不錯的檢測記憶體流失和資源泄漏的免費調試工具,適合於WIN32平台下使用DELPHI/C++ BUILDER開發的應用程式。
正在裝載資料……利用它可以方便的尋找出一些忘記釋放的指標以及資源。它通過在偵錯模式下運行目標程式,監視程式的建立和釋放操作,以達到檢測資源泄漏的效果。監測過程中它會根據資源類型計數,每次建立後增加計數,釋放則遞減計數,最後程式結束根據計數即可判斷出資源的泄漏。

       MemProof的原作者是Atanas Stoyanov,後加盟了AutomatedQA公司,他目前是大名鼎鼎的AQTIME軟體的主力開發人員。MemProof已經很久沒有更新了,作者在AutomatedQA的官方網站上也推薦大家使用AQTIME(http://www.automatedqa.com/products/aqtime/memproofusers.asp),因為AQTIME包含了MemProof的所有功能,並且擁有很多MemProof所不具備的特性,如:更好的COM支援,結合MSDN擷取協助,平台測試等等。雖然有這麼多好處,但是AQTIME畢竟是收費的商業軟體,價格不菲,而且體積相對龐大。對於我來說,更願意選擇MemProof。輕佻的體積,簡單的操作,還是免費的(這條最關鍵~~)。當然,對於大的企業使用者來說,AQTIME也是個非常不錯的選擇。

使用方法
l         下載

官方網站上的最新版本為 (Build 0.950 July 19, 2004)

1:http://www.automatedqa.com/products/memproof/index.asp
2:http://www.delphifans.com/SoftView/SoftView_1947.html

l         安裝

MemProof是一個綠色軟體,下載完成後解壓,運行MemProof.exe即可。

l         準備

MemProof要求目標程式帶有完整的調試資訊。開啟工程選項(Project-Options)

1、  Compiler面板

l         去掉Optimization(代碼最佳化)選項

l         選擇Stack Frames(為所有過程函數強制產生呼叫堆疊)選項

l         選擇Debug information (在DCU檔案中產生調試資訊)選項

l         選擇Use Debug DCUS(編譯時間連結帶有調試資訊的VCL DCU檔案)選項



2、  Linker面板

l         選擇Detailed(產生完整的MAP檔案,包含模組、單元、過程等地址資訊)選項

l         選擇Include TD32 debug info(將調試資訊產生到可執行檔)選項


該選項會導致可執行檔體積增大,但不會影響運行效率以及記憶體佔用,建議在正式發布時不要帶上該選項。




l         開始

一切準備就緒,現在可以開始調試了。

下面是用於調試的一段測試程式:

建立一個空白工程,在OnCreate事件中加入以下代碼:

procedure TForm1.FormCreate(Sender: TObject);

begin

  TFont.Create;  //建立一個TFONT對象,但不釋放

  CloseHandle(0);  //關閉一個不存在的控制代碼

end;

再根據上面的介紹設定好工程選項。開啟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中去拷貝即可)。

      另外MemProof還可以記錄上次的測試結果方便使用者做比較,以及過濾等功能。

      如果需要測試動態串連庫,可以選擇Project-Parameters,在Host Applications中選擇主體程式,如果需要帶命令列,則在Parameters中輸入命令列,然後就可以開始測試了,和DELPHI中調試的方法是一樣的。

       MemProof不支援Attach Process的調試方式,這是一個不足的地方。

 

使用其實非常簡單,一看就明白了,下面介紹些調試中的經驗技巧。

技巧
l         漸進式測試,從最易發現的錯誤開始解決

一個大型的軟體可能會有很多泄漏或者錯誤,這個時候可以漸進式的來測試,第一次測試可以直接運行後立即退出,檢測在載入的過程中是否存在泄漏,然後逐一更正。再分功能模組進行測試,比如只針對某個功能進行操作,然後退出檢測該模組是否存在泄漏,如果存在,更正。最後再進行整體測試。這樣可以避免一些關聯性錯誤導致重複測試,而且可以節省測試時間,可以使測試更有針對性。

l         分模組測試,從單個的模組開始解決

和上一條原則一樣,為了縮小測試面。在Projects的Moudle Configers中選擇測試的模組,開始每次只選擇一個模組針對性測試,最後再選擇所有模組測試。

注意:不要選擇一些如:Ole32.dll、kernel32.dll等系統模組。

 

l         錯誤優先,發現錯誤與泄漏並存時,優先解決錯誤

測試過程中,代表錯誤,這些錯誤往往是由於錯誤的使用系統API導致,如:釋放不存在的控制代碼,存取權限不夠的資源,傳遞了錯誤的調用參數等。這些錯誤往往會導致代碼沒有按照預計的方式運行,觸發一些記憶體流失。所以,需要優先修正這些位置。

l         系統資源優先,發現有GDI、User、Kernel、Registry等存在泄漏時優先解決

系統資源泄漏往往是由於表單、畫布等資源沒有及時釋放,這些錯誤非常明顯,而且這種錯誤往往會帶有很多的Pointers、Memory泄漏,所以,優先修正

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.