2012-02-10 41 views
2

我想知道哪些庫正在使用最多的內存。我想在我的應用程序中製作一種記憶記錄器。這需要以編程方式查找自己進程中的庫有多少內存使用。我想確定動態鏈接庫使用多少內存

例如,我有一個使用10MB內存的程序,那裏有一個使用9MB內存的.dll。我想看看他們使用的所有dll和多少內存。 此應用程序將在Windows上運行。一切都需要以編程方式完成。

+0

只是DLL本身或包含它們分配的所有動態內存? – 2012-02-10 11:17:57

+1

包括它們分配的所有動態內存 – Laurence 2012-02-10 11:20:53

+0

除非有自己編寫代碼的理由,否則至少應該在https://code.google.com/p/gperftools/wiki/GooglePerformanceTools中查看堆分析器。它在UNIX上幾乎完成了你想要的任務,但也有(通過我未經測試的)Windows支持。如果沒有別的,這是一個很好的起點來獲得一些想法。 – 2012-02-10 11:36:44

回答

2

不知道它是否是最簡單的方法,但也許你應該在加載每個庫後立即掛鉤內存分配WinAPI函數。 然後在你的鉤子,你將能夠做必要的計數 看看微軟Detours庫作爲一個良好的鉤子框架(http://research.microsoft.com/en-us/projects/detours/)。它通常不是免費的,但可免費使用「用於研究,非商業和非生產用途」

要掛鉤的實際函數實際上取決於需要跟蹤的dll。

如果它們都是使用MSVC運行時動態鏈接編譯的,則必須掛接malloc()/ free()/ calloc()/ realloc()系列函數。 如果它與運行時靜態鏈接,或者沒有使用MS VC編譯,那麼您必須掛鉤與內存相關的WinAPI調用,例如HeapAlloc/HeapCreate/HeapDestroy/HeapFree/heapReAlloc/VirtualAlloc/VirtualFree(我只是尋找內存 - msvcr100.dll從kernel32.dll導入的相關函數)

+0

我知道如何掛鉤,我之前做過。但是,我怎樣才能找到我需要的功能呢?那麼,什麼函數處理DLL和它們的內存呢? – Laurence 2012-02-10 11:45:55

+0

我編輯了我的回覆,在那裏添加了更多信息 – 2012-02-10 12:07:20