2011-05-10 69 views
0

我目前正在研究一個應用程序正在使用很多私人內存的C++應用程序的問題。它看起來很像基於轉儲分析的提交和保留內存。怎麼辦!address -filter Windbg

我使用Windbg。有沒有什麼辦法可以看出在提交和保留內存中有什麼?我已經縮小到一個特定的堆。

我的理論是它沒有被釋放。我無法進行調試,只能繼續進行調試。

我已經使用了命令!address-filter並得到了一個很好的輸出,但我該如何前進?

任何建議都會有幫助。

回答

1

您可以使用!heap -s命令獲取WinDbg中的內存使用信息。有一個與windbg here泄漏檢測教程。

+0

是的我已經使用過這個命令howerver,它沒有提供堆棧到堆地址。 – Andy12 2011-05-10 14:35:12

+0

@Andy:你的意思是「堆棧到堆地址」? – 2011-05-10 14:37:26

+0

我有堆,我懷疑是問題。 – Andy12 2011-05-10 14:54:03

1

有幾個方法,你可以如何diagnoze內存泄漏:

後面的選項(UMDH工具)是WinDbg包的一部分,通常是調查內存泄漏的最簡單的選項。這兩個選項實際上都基於相同的功能,這是一個NT堆的能力,以保持調用堆棧與分配的條目一起分配。

請注意,除了在堆中泄漏內存之外,還可能存在其他類型的泄漏,這會導致提交的內存空間增加。例如,您可能直接調用VirtualAlloc並忘記VirtualFree。

+0

+1 UMDH - 我發現UMDH是我嘗試過的許多工具中最簡單也是最可靠的。如果你打算使用它,只是一個提示。我發現在某些情況下,無論您嘗試什麼,它都拒絕正確解析符號。如果這是您的情況,請不要打擾符號,而是在執行差異報告之後,對流程進行快照轉儲,並使用WinDbg手動轉至UMDH堆棧中的地址位置。每次都有效。 – DXM 2011-05-14 03:41:46

+0

第二個提示:在過去的8年中,有一次我調查了內存泄漏,UMDH沒有工作。如果調用malloc(或HeapAlloc)的請求足夠大,它將跳過堆並直接進入VirtualAlloc,UMDH不會追蹤這些分配。我最終將ntdll中的2個(或4個,不記得)位置的條件斷點破壞,只要請求大於閾值就會中斷。只需按照任何內存分配來查看它們最終在哪個ntdll中運行。祝您好運 – DXM 2011-05-14 03:45:27