2009-06-21 51 views
1

如何使用FASTMM4或默認內存管理器列出所有應用程序中的所有實例化對象?如何列出所有實例化對象?

+0

爲什麼你想要這些信息?你在尋找內存泄漏嗎?我認爲可以有另一種方式。 – Alex 2009-06-23 08:11:10

+0

@亞歷山大:根本沒有人! FASTMM4很容易顯示內存泄漏,事實上,我想知道VCL上的特定類是否已加載,以及誰實例化了它,但現在我只是通過了這個問題。謝謝! – 2009-06-23 10:20:44

回答

3

你也許可以做到這一點與FastMM4,但是這將是一個複雜的。嘗試檢查程序ScanForMemoryLeaks的代碼,看看它是如何完成的。

這種例行檢查與預期的內存泄漏列表中的所有分配的堆內存,並報告一切,顯示了,包括數量和對象類的名稱,如果它發現的對象。你想要做的是檢查所有分配的堆內存並報告你找到的所有對象的計數和對象類名,所以這是一個非常類似的任務。只要省略已註冊的指針列表檢查並過濾掉所有不是對象的東西。

1

那麼它不支持,不鼓勵,但根據您的情況您可能能夠編輯TObject的記錄創造與毀滅 - 因爲所有的對象都是TObject的,這可能做的伎倆。然而,修改VCL確實令人不快,所以我不知道你能否使用Helper對象(自2006年起可用)來做同樣的事情。寫入另一個列表等,並創建每個對象的詳細信息。

0

實施託尼 - 阿倫的建議,一個有趣的方式可能是掛鉤在運行時對象的創建和銷燬方法。谷歌代碼上有一個有趣的圖書館,它是AsmProfiler項目的一部分(一個非常好的工作,恕我直言),可能會伎倆。這裏是鏈接到KOLDetours單位,完成所有繁重的工作。

FWIW我在含有其任選被跟蹤對象的創建/銷燬的儀表基類Delphi的4/5天實現的框架背部。這在追蹤對象泄漏等方面效果很好,但產生了大量的信息。如果您需要知道的是在關機時泄露了什麼對象,FASTMM4是一個更好的選擇。

0

你可以通過調用SetMemoryManager更改內存管理器。 您可以編寫自己的MM,它將成爲一個簡單的存根:它將把所有調用重定向到舊MM(即FastMM,您可以通過調用GetMemoryManager獲取它),並記錄所有內存操作。 您可以通過查看調用堆棧來檢測對象創建/銷燬:應使用TObject的NewInstance方法進行調用。