我有一个.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中看到本机内存使用情况(在托管代码的上下文中)?
答案 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>