RegionUsageHeap在!address -summary中的含义是什么?

时间:2011-10-27 16:25:03

标签: .net interop windbg sos

我有一个.NET应用程序,可以使用以下图层与本机dll进行交互。

a)C ++ API GetNames()返回wchar_t实例的列表
b)C ++ / CLI API GetNames2()代码调用C ++ API,将wchar列表编入.NET字符串,返回此.NET字符串列表
c)托管代码C#调用interop层GetNames2()API并显示字符串列表

我在互操作层中调用CoTaskMemFree API来释放本机wchar字符串。但是我只是想知道如何看到由于缺少CoTaskMemFree调用而导致的内存泄漏。所以我注释掉了对CoTaskMemFree的调用。在这种情况下,我的理解是,如果我附加windbg和run!address -summary命令,那么在本机端(尚未释放)的任何分配都应该显示在RegionUsageHeap下,但它似乎没有报告它。任何想法如何在windbg中看到本机内存使用情况(在托管代码的上下文中)?

1 个答案:

答案 0 :(得分:1)

RegionUsageHeap是用于所有本机堆的总数,此值以相当大的块递增,并且在此变量中必须存在相当大的内存泄漏。
您可以使用!heap命令。 CoTaskMemAlloc使用默认的每进程堆,它通常是!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>