2011-10-27 35 views
1

我有一個.NET應用程序,與下面的圖層與本地dll進行交互。RegionUsageHeap是什麼意思!地址 - 概要

一個)C++ API GetNames()返回wchar_t的實例
b)中的C/CLI API GetNames2()的代碼調用到C++ API,WCHAR到.NET串的馬歇爾列表,返回此.NET字符串列表的列表
c)託管代碼C#調用interop層GetNames2()API和字符串顯示列表

我在調用InterT層中的CoTaskMemFree API來釋放本機wchar字符串。不過,我只是想知道如何看到由於缺少CoTaskMemFree調用引起的內存泄漏。所以我打電話給CoTaskMemFree。在這種情況下,我的理解是,如果我附加windbg並運行!address -summary命令,則在本地端(尚未釋放)完成的任何分配應顯示在RegionUsageHeap下,但似乎沒有報告。任何想法如何在windbg中看到本地內存使用情況(在託管代碼的情況下)?

回答

1

RegionUsageHeap是用於所有本機堆的總和,此值在相當大的塊中增加,並且在此變量中必須存在相當大的內存泄漏。
您可以使用!heap命令。 CoTaskMemAlloc使用默認的per-process堆,它通常是!heap -s輸出中的第一個句柄,或者在!peb輸出中查看「ProcessHeap」。
當你有這個句柄時,使用!heap -stat -h來查看分配了多少塊。
您也可以轉儲整個堆,檢查!heap命令的windbg幫助。示例:

0:011> !heap -stat -h 00150000 
heap @ 00150000 
group-by: TOTSIZE max-display: 20 
size  #blocks  total  (%) (percent of total busy bytes) 
44  82f - 22c7c (8.73) 
20000  1 - 20000 (8.03) 
<I have cut here>