【问题标题】:What does RegionUsageHeap mean in !address -summary!address -summary 中的 RegionUsageHeap 是什么意思
【发布时间】:2011-12-16 16:14:58
【问题描述】:

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

【问题讨论】:

    标签: .net interop windbg sos


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2017-06-11
      • 2018-03-05
      • 2023-03-27
      相关资源
      最近更新 更多