我正在研究在 32 位 Win 7 上运行的应用程序的内存,该应用程序使用混合模式(VC++ 和 C#.net)构建
我已经通过以下步骤尝试分析泄漏的原因:
在 GFlags 中启用用户模式堆栈跟踪数据库
通过使用 UMDH.exe,我运行了 2 个快照之间的差异,我看到最高的内存分配是
+ 243040 ( 15884374 - 15641334) 872075 allocs BackTrace17A3C8 + 243026 ( 872075 - 629049) BackTrace17A3C8 allocations ntdll!RtlAllocateHeap+00000274
它只包含一行,没有任何调用堆栈。这让我很困惑。
使用 Windbg 进一步分析:
在 Windbg 中,键入以下命令:(
!heap -stat -h 02150000
其中 2150000 是发生泄漏的堆的地址) 在比较多个转储后,我看到大小为 1 的内存块随着时间的推移而增加,并且可能是泄漏的内存。输入以下命令:
!heap -flt s 1
给出这些分配的 UserPtr,最后:!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 分析相匹配。在这里,我也看不到调用堆栈。
谁能帮我在这里指个方向?