如何使用FASTMM4或默認內存管理器列出所有應用程序中的所有實例化對象?如何列出所有實例化對象?
回答
你也許可以做到這一點與FastMM4,但是這將是一個複雜的。嘗試檢查程序ScanForMemoryLeaks的代碼,看看它是如何完成的。
這種例行檢查與預期的內存泄漏列表中的所有分配的堆內存,並報告一切,顯示了,包括數量和對象類的名稱,如果它發現的對象。你想要做的是檢查所有分配的堆內存並報告你找到的所有對象的計數和對象類名,所以這是一個非常類似的任務。只要省略已註冊的指針列表檢查並過濾掉所有不是對象的東西。
那麼它不支持,不鼓勵,但根據您的情況您可能能夠編輯TObject的記錄創造與毀滅 - 因爲所有的對象都是TObject的,這可能做的伎倆。然而,修改VCL確實令人不快,所以我不知道你能否使用Helper對象(自2006年起可用)來做同樣的事情。寫入另一個列表等,並創建每個對象的詳細信息。
實施託尼 - 阿倫的建議,一個有趣的方式可能是掛鉤在運行時對象的創建和銷燬方法。谷歌代碼上有一個有趣的圖書館,它是AsmProfiler項目的一部分(一個非常好的工作,恕我直言),可能會伎倆。這裏是鏈接到KOLDetours單位,完成所有繁重的工作。
FWIW我在含有其任選被跟蹤對象的創建/銷燬的儀表基類Delphi的4/5天實現的框架背部。這在追蹤對象泄漏等方面效果很好,但產生了大量的信息。如果您需要知道的是在關機時泄露了什麼對象,FASTMM4是一個更好的選擇。
你可以通過調用SetMemoryManager更改內存管理器。 您可以編寫自己的MM,它將成爲一個簡單的存根:它將把所有調用重定向到舊MM(即FastMM,您可以通過調用GetMemoryManager獲取它),並記錄所有內存操作。 您可以通過查看調用堆棧來檢測對象創建/銷燬:應使用TObject的NewInstance方法進行調用。
- 1. 如何列出所有實例變量?
- 2. 查找所有出現的對象實例化
- 3. GORM:列出屬於用戶的所有域實例(根對象)
- 4. 如何爲對象的所有實例調用對象函數
- 5. 對象實例化
- 6. 對象實例化
- 7. 實例化對象
- 8. 對所有請求使用單個servlet對象實例化
- 9. 實例化對象時出現故障
- 10. 如何實例化假CGImageRef對象?
- 11. 如何正確實例化HttpContext對象?
- 12. 如何動態實例化對象?
- 13. db4o如何實例化對象?
- 14. 如何緩存實例化對象?
- 15. 如何實例化菜單對象?
- 16. 如何實例化FormFile對象?
- 17. 列出所有類對象
- 18. 如何反序列化所有SOAP序列化對象
- 19. 實例化一個對象的列表
- 20. 反序列化JavaScript對象實例
- 21. 從列表c實例化對象#
- 22. 實例化JavaScript錯誤對象實例
- 23. ActionScript - 從實例實例化新對象?
- 24. AS3刪除對象的所有實例?
- 25. XMLHttpRequest對象沒有被實例化?
- 26. 對象沒有正確實例化
- 27. 依賴容器:如何實例化對象實例
- 28. 獲取所有實例化的javascript對象並更新值
- 29. 如何找出對象已被實例化的地方?
- 30. 如何找出使用gdb實例化對象的位置?
爲什麼你想要這些信息?你在尋找內存泄漏嗎?我認爲可以有另一種方式。 – Alex 2009-06-23 08:11:10
@亞歷山大:根本沒有人! FASTMM4很容易顯示內存泄漏,事實上,我想知道VCL上的特定類是否已加載,以及誰實例化了它,但現在我只是通過了這個問題。謝謝! – 2009-06-23 10:20:44