2011-10-27 32 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>