【问题标题】:windbg memory leak investigation - missing heap memorywindbg 内存泄漏调查 - 缺少堆内存
【发布时间】:2014-11-09 17:43:44
【问题描述】:

我正在使用 windbg 调查 Windows 应用程序中的缓慢内存泄漏

!heap -s 给出以下输出

          Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                            (k)     (k)    (k)     (k) length      blocks cont. heap 
-------------------------------------------------------------------------------------
00000023d62c0000 08000002 1182680 1169996 1181900  15759  2769    78    3   2b63   LFH
00000023d4830000 08008000      64      4     64      2     1     1    0      0      
00000023d6290000 08001002    1860    404   1080     43     7     2    0      0   LFH
00000023d6dd0000 08001002   32828  32768  32828  32765    33     1    0      0      
    External fragmentation  99 % (33 free blocks)
00000023d8fb0000 08001000   16384   2420  16384   2412     5     5    0   3355      
    External fragmentation  99 % (5 free blocks)
00000023da780000 08001002      60      8     60      5     2     1    0      0      
-------------------------------------------------------------------------------------

这表明地址为00000023d62c0000 的堆拥有超过1 GB 的保留内存。

接下来我运行命令!heap -stat -h 00000023d62c0000

 heap @ 00000023d62c0000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
    30 19b1 - 4d130  (13.81)
    20 1d72 - 3ae40  (10.55)
    ccf 40 - 333c0  (9.18)
    478 8c - 271a0  (7.01)
    27158 1 - 27158  (7.00)
    40 80f - 203c0  (5.78)
    410 79 - 1eb90  (5.50)
    68 43a - 1b790  (4.92)
    16000 1 - 16000  (3.94)
    50 39e - 12160  (3.24)
    11000 1 - 11000  (3.05)
    308 54 - fea0  (2.85)
    60 28e - f540  (2.75)
    8018 1 - 8018  (1.43)
    80 f2 - 7900  (1.36)
    1000 5 - 5000  (0.90)
    70 ac - 4b40  (0.84)
    4048 1 - 4048  (0.72)
    100 3e - 3e00  (0.69)
    48 c9 - 3888  (0.63)

如果我将上述命令中的堆块的总大小 (4d130 + 3ae40 + ...) 相加,我会得到几兆字节的分配内存。

我在这里遗漏了什么吗?我怎样才能找到哪些块正在消耗已分配的堆内存的千兆字节?

【问题讨论】:

    标签: windows memory memory-leaks windbg


    【解决方案1】:

    我相信 !heap –stat 对于 64 位转储已损坏,至少是大转储。我改为使用 debugdiag 1.2 来寻找 64 位内存泄漏。

    【讨论】:

    • 为什么是 DebugDiag 1.2 而不是 2.1?
    • 当我开始在 w7 上使用 64 位时,1.2 是当前版本。我没有尝试过更高的版本,但它们实际上可能更好。即使 1.2 可以很好地满足我的目的,我下次可能会尝试更高版本。
    • 如果您不能使用 windbg 的 !heap 命令,DebugDiag 本身是否有助于确定泄漏的位置?还是有不同的windbg命令?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多