0

我正在研究在 32 位 Win 7 上运行的应用程序的内存,该应用程序使用混合模式(VC++ 和 C#.net)构建

我已经通过以下步骤尝试分析泄漏的原因:

  1. 在 GFlags 中启用用户模式堆栈跟踪数据库

  2. 通过使用 UMDH.exe,我运行了 2 个快照之间的差异,我看到最高的内存分配是

    +  243040 ( 15884374 - 15641334) 872075 allocs  BackTrace17A3C8
    +  243026 ( 872075 - 629049)    BackTrace17A3C8 allocations
    
    ntdll!RtlAllocateHeap+00000274  
    

    它只包含一行,没有任何调用堆栈。这让我很困惑。

使用 Windbg 进一步分析:

  1. 在 Windbg 中,键入以下命令:(!heap -stat -h 02150000其中 2150000 是发生泄漏的堆的地址) 在比较多个转储后,我看到大小为 1 的内存块随着时间的推移而增加,并且可能是泄漏的内存。

  2. 输入以下命令:!heap -flt s 1给出这些分配的 UserPtr,最后:

  3. !heap -p -a address在其中一些地址上键入总是显示以下分配调用堆栈:

    address 0813fe08 found in
    _HEAP @ 2150000
        HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        0813fdf0 0004 0000  [00]   0813fe08    00001 - (busy)
        76ecd84c ntdll!RtlAllocateHeap+0x00000274
    

    这与 UMDH 分析相匹配。在这里,我也看不到调用堆栈。

谁能帮我在这里指个方向?

4

0 回答 0