2009-07-15 45 views
0

我想在Windows MFC 8.0應用程序(發佈版本)中發現內存泄漏。如何在MFC 8.0應用程序中訪問malloc的完整堆棧跟蹤?

未能到場使用WinDbg的(或UMDH)由於VC8 CRT's malloc problem with FPO分配的完整堆棧跟蹤後,我試圖以應用解決方案提出here(即使用LeakDiag與DbgHlp StackWalk啓用)才知道原來LeakDiag做在監視C運行時分配器時,不會生成日誌文件,但是,在監視它的Windows堆分配器時,它確實起作用,但同樣,堆跟蹤在malloc調用中結束。

符號配置正確,因爲我可以在生成的文件中看到函數名稱,文件名,行等。

有誰知道我爲什麼不能登錄C Runtime Allocator?以及爲什麼即使使用DbgHlp StackWalk API我也無法獲得完整的堆棧跟蹤?

我會很感激您可以提供的任何提示。

其他信息:

如何我堆棧跟蹤看起來像:

我有了這個使用WinDbg的。地址是由heap -l報告的一個泄漏塊。

0:000> !heap -p -a 25b18400 
address 25b18400 found in 
_HEAP @ 2a70000 
    HEAP_ENTRY Size Prev Flags UserPtr UserSize - state 
    25b183f8 0008 0000 [07] 25b18400 00021 - (busy) 
    Trace: 00a4 
    7c97d6dc ntdll!RtlDebugAllocateHeap+0x000000e1 
    7c959d18 ntdll!RtlAllocateHeapSlowly+0x00000044 
    7c92b298 ntdll!RtlAllocateHeap+0x00000e64 
    78134d83 MSVCR80!malloc+0x0000007a 

回答

1

爲什麼不使用第三方工具?

I.e.下載intel並行檢查員的評估副本。它非常簡單地安裝並運行在現有的發行版本上。它顯示 - 在大多數情況下 - 一個完整的堆棧(我很確定,但它也發現一些誤報)。

從配置管理器中選擇發佈版本,並確保它創建一個pdb文件(在鏈接器選項中)。然後,開始「檢查內存錯誤」。

存在許多其他類似的工具:AQTime,GlowCode。所有這些都不需要重新編譯或檢測。

+0

我已經嘗試過英特爾並行工作室,但它只是掛起...它似乎很沉重,所以是我的應用程序... 除此之外,我正在尋找的內存泄漏只發生在一個生產電腦缺乏任何開發工具。我可以安裝一個編譯器,但爲什麼IPS甚至不能在我的開發機器上啓動呢? 我會看看你提到的其他工具。 謝謝你的回答! – 2009-08-06 12:07:03

1

有誰知道爲什麼我無法登錄C運行時分配器?

您正在使用Debug版本嗎?調試CRT擁有自己的堆檢查功能,可以擊敗在全局操作系統堆上運行的UMDH和其他工具。確保在使用UMDH和朋友時,所有MFC和MSVCRT堆調試功能關閉

也許還你,或者從0

否則默認的東西在你的進程,changed the small-block allocator threshold,8.0版CRT應該只是請求轉發到全局堆,這是你想要的堆調試工具。

爲什麼即使我使用DbgHlp StackWalk API,我也無法獲得完整的堆棧跟蹤?

我認爲Skywing在你給出的鏈接中描述的細節非常好。爲了重新迭代,他可能聲明的部分是「在x86上」,完美的「堆棧跟蹤通常是不可能的,因爲沒有元數據附有特定函數(調試符號之外),該函數描述瞭如何放鬆過去。「對於DbgHlp來說,使用EBP作爲臨時寄存器來解開函數(比如MSVCRT的malloc)是非常不切實際的。

你當然可以從正確的來源重建自己的CRT庫,或者嘗試替換CRT malloc/free。

真的,我認爲你最好的舉措是在x64平臺上重現泄漏,其中堆棧展開保證相當可靠。

相關問題