2013-01-18 55 views
6

我試圖在使用Delphi 7的大型應用程序中調試內存使用情況。我能夠安裝fastmm調試完整的DLL並解決一些泄漏問題。知道在哪裏使用FastMM分配內存

我還安裝了內存使用情況跟蹤器,允許我查看哪些塊被分配以及它們的大小。

我的問題是,有沒有辦法找出塊的分配位置?我知道這是可能的,因爲如果內存未被釋放,堆棧跟蹤將被打印。有沒有辦法在fastmm中「戳」,讓它打印給定分配的堆棧跟蹤?

問題:如果分配的開始地址是已知的,有沒有辦法找出對象是哪個類? (假設分配是針對某個對象的)

回答

4

您可以:

  • 嘗試使用LogAllocatedBlocksToFile程序。如果其參數ALastAllocationGroupToLog小於AFirstAllocationGroupToLog或爲零,則會記錄全部塊及其分配調用堆棧。但是,如果您的應用有很多內存分配,請準備好等待。我經歷了大約4小時的等待時間和1.5Gb的結果文件。(注意:使用glogg來查看這樣的大文件)
  • 修改FastMM4.pas所以實現的LogCallStack將在界面中可見。或者你可以嘗試直接使用它FastMM_FullDebugMode.dll

在側面的問題:嘗試使用DetectClassInstance功能。

2

如果使用FullDebugMode並啓用將數據寫入文件的條件,那麼您應該得到正確的要求,它將寫出一個堆棧跟蹤(如果你正在調試一個有大量內存泄漏的程序,這可能需要一段時間,如果泄漏項目是關閉的,我認爲它會使關閉持續10分鐘或更長時間集裝箱持有大量的其他對象的)

+0

是的,現在我明白了,但是我遇到的問題是當我關閉應用程序時,所有內存都被清理得很好 - 我想知道在給定時間點的信息 - 當應用程序中的所有內容都被加載時。 – wmercer

2

考慮你的評價是應用程序的內存大幹快上的應用程序的收盤很好地清理了我的聲音你正在尋找邏輯內存泄漏說 - 換句話說:對象活着的時間超過需要b當時間到達完成應用程序,他們被清理,因爲存在的代碼來清理它們。

實施例:

  • 創建使用作爲所有者和引用它是全球一個Delphi的創建時創建的形式的單元可變應用程序的TForm的。
  • 配置窗體的CloseAction到caHide(在OnClose事件)
  • 顯示形式,操作上
  • 關閉的形式,從來沒有更多的,直到應用程序關閉
  • 使用它關閉應用,這使得應用清除所有對象它擁有

所以,你有一個邏輯內存泄漏但不是一個物理內存泄漏 - 這是那種FastMM可以很容易地檢測。既然你不打算讓我們假設的TForm直到應用程序結束,它就會在語義上泄漏,但是由於它被引用並且有代碼在應用程序結束時將其銷燬,所以FastMM是一種正常的分配。

這表示你不需要內存管理器的內存轉儲,而是一個內存分析器。

+0

謝謝你的詳細答案,有沒有這樣的事情作爲德爾福的內存分析器? – wmercer

+1

@emuduguntar:除了FastMM本身外,[AQTime](http://smartbear.com/products/qa-tools/application-performance-profiling)是Delphi知道的唯一的內存分析器 –

相關問題