1

我有一个 .NET 应用程序,它与具有以下层的本机 dll 互操作。

a) C++ API GetNames() 返回 wchar_t 实例列表
b) C++/CLI API GetNames2() 代码调用 C++ API,将 wchar 列表编组为 .NET 字符串,返回此 .NET 字符串列表
c) 托管代码 C# 调用互操作层 GetNames2() API 和显示字符串列表

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

4

1 回答 1

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>

于 2011-10-31T08:43:29.550 回答