Delphi FastMM4使用(一)

來源:互聯網
上載者:User

記憶體流失經常出現在本地代碼中,特別是多線程和發生異常的情況下,這時候在delphi環境下,FastMM4就特別有用。

調試過程如下:

1.開啟FastMM4的調試功能,首先在自己的project裡把FastMM4放在最前面,例如:

    FastMM4,
    Main   in   ‘Main.pas’   {MainForm},
可以在project中定義編譯常量:FullDebugMode。同時把FastMM_FullDebugMode.dll拷貝到編譯後產生的可執行程式所在目錄。

再要開啟記憶體流失報告:EnableMemoryLeakReporting。一般情況下是預設開啟的。

這樣就開啟了全偵錯模式,如果發生記憶體流失將會產生報告檔案,如果在IDE啟動並執行時候還會彈出一個對話方塊顯示。報告檔案類似:kicoy_MemoryManager_EventLog.txt

2.報告檔案由兩部分組成,並且是每次運行都會追加,所以使用的時候盡量清空一下在運行。

第一部分是泄漏的詳細內容,將每個沒釋放的記憶體塊詳細資料顯示出來。例:

A   memory   block   has   been   leaked.   The   size   is:   28       {一個28位元組的記憶體塊在程式結束後沒有被釋放}

{這個記憶體塊在分配的時候的呼叫堆疊,也就是Call   Stack,可以清楚看出調用函數的次序。如果是系統dll則還有相應的函數名。}
Stack   trace   of   when   this   block   was   allocated   (return   addresses):

4028E7
4030EC
406649
412365
41236E
411DD3
426B45
427236
42888C
{這個記憶體類型,如果是字串string或TObject繼承的對象則會顯示名稱。}
The   block   is   currently   used   for   an   object   of   class:   Unknown

{將記憶體塊頭256個字元顯示出現,作為內容提示。}
Current   memory   dump   of   256   bytes   starting   at   pointer   address   107BDD8:

第二部分是總結性內容,例:

{這個小型記憶體塊泄漏的報告,如果有大型記憶體塊泄漏則會加一行專門提示大型記憶體塊泄漏。}
This   application   has   leaked   memory.   The   small   block   leaks   are   (excluding   expected   leaks   registered   by   pointer):

{21-28位元組的記憶體塊泄漏,未知類型一個}
21   -   28   bytes:   Unknown   x   1

Note:   Memory   leak   detail   is   logged   to   a   text   file   in   the   same   folder   as   this   application.   To   disable   this   memory   leak   check,   undefine   “EnableMemoryLeakReporting”.

有了這份報告只不過瞭解到記憶體流失存在,但是哪裡沒釋放就還需要更進一步地調查。

調查的目標有:

1.記憶體塊分配在哪個函數裡哪段代碼。

這個在報告裡可以結合內容和呼叫堆疊來看。前256個位元組可以進行分析,推測分配者,呼叫堆疊就直接指出了分配函數,不過是一些地址,不能直接知道函數名和程式碼片段。這時候就需要在delphi   ide環境下查看二進位記憶體映像了,就是View   CPU功能。

在設定斷點並停下後,可以View   CPU,在菜單View=> Debug   Window=> CPU     快速鍵:Ctrl+Alt+C

View   CPU   Window:

正中就是記憶體映像,而且源碼也相應地標註好了,左邊列的地址就是記憶體報告中的Call   Stack中的地址,翻頁找到所對應的代碼就知道哪裡分配記憶體了。

2.檢查釋放記憶體的地方是否被調用,可以用日誌或斷點來調試,如果壓根就沒有釋放記憶體那就補上代碼,如果有卻沒有執行則檢查一下執行條件是否正確,如果斷點沒起作用很可能是因為代碼永遠不會被執行(無作用程式碼)。

另:

1.記憶體管理不是GC自動回收記憶體,而是檢查是否有泄漏。

2.windows系統的記憶體流失是無法檢查的,僅限於應用程式內部,不過檢查出系統泄漏也沒辦法,只能等更新了。

3.檢查泄漏後要自己去檢查代碼補齊記憶體釋放,報告並不能做這事。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.