gpt4 book ai didi

windows - Windbg !heap -s 和 !heap -stat 命令在输出上不一致

转载 作者:可可西里 更新时间:2023-11-01 14:24:19 32 4
gpt4 key购买 nike

我有一个内存转储。在这个转储中,我有一个句柄为 fd00000 的堆。这是 !heap -s fd00000 命令输出的摘录:

 0: Heap 0fd00000
Flags 00001002 - HEAP_GROWABLE
Reserved memory in segments 80192 (k)
Commited memory in segments 56540 (k)
Virtual bytes (correction for large UCR) 60592 (k)
Free space 3884 (k) (572 blocks)
External fragmentation 6% (572 free blocks)
Virtual address fragmentation 6% (69 uncommited ranges)
Virtual blocks 124 - total 0 KBytes
Lock contention 23
Segments 1

您会看到它按预期显示了摘要信息。但是 !heap -stat -h 0fd00000 的输出显示如下:

 heap @ 0fd00000
group-by: TOTSIZE max-display: 20
size #blocks total ( %) (percent of total busy bytes)
19fa40 7a - c614280 (93.96)
62d30 4 - 18b4c0 (0.73)
d49 13d - 107365 (0.49)

都是十六进制的,所以从这里我看到“total busy bytes”超过了 205 MBytes。 所以你看到 !heap -s 告诉我这个堆有 80 MB/60 MB 的保留/虚拟内存,而 !heap -stat 告诉我这个堆占用了205MBytes。差距太大了。这怎么可能?当我运行 !heap -s 时,我看到了多个这样的条目:

Virtual block: 293c0000 - 293c0000 (size 00000000)

也许是这个原因?

最佳答案

一些 !heap 开关在大量分配流经堆管理器时会出现错误行为。堆管理器会将大量分配直接转发给 VirtualAlloc,而一些 !heap 命令知道如何跟踪这些分配,而其他命令则不知道。您还应该尝试将您的 WinDbg 版本更新到最新的 Windows SDK,因为 !heap 命令与堆管理器的内部数据结构密切相关,该数据结构随 Windows 版本而变化。

我建议在这种情况下使用 VMMap 来检测大型分配源。

关于windows - Windbg !heap -s 和 !heap -stat 命令在输出上不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23681067/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com