如何在WinDbg中跟踪堆?

问题描述 投票:0回答:1

我找到了一篇文章来学习解决内存泄漏问题,www.codeproject.com/KB/cpp/MemoryLeak.aspx。 当我执行步骤

!heap -stat –h xxx
时,文章告诉我结果应该是这样的

0:001> !heap -stat -h 00330000
heap @ 00330000
group-by: TOTSIZE max-display: 20
    size     #blocks     total     ( %) (percent of total busy bytes)
    1f64 76c6 - e905f58  (99.99)
    1800 1 - 1800  (0.00)
    824 2 - 1048  (0.00)

但是我的结果是

0:009> !heap -stat -h 00000232ab550000
Walking the heap 00000232ab550000 .
 0: Heap 00000232ab550000
   Flags          00001002 - HEAP_GROWABLE 
   Reserved memory in segments              60 (k)
   Commited memory in segments              12 (k)
   Virtual bytes (correction for large UCR) 60 (k)
   Free space                               4 (k) (1 blocks)
   External fragmentation          34% (1 free blocks)
   Virtual address fragmentation   80% (1 uncommited ranges)
   Virtual blocks  0 - total 0 KBytes
   Lock contention 0
   Segments        1
.
.
.
      Buckets info:
  Size   Blocks  Seg  Empty  Aff    Distribution
------------------------------------------------
    16     409    11      2  1 (6-322,1-11,1-11,1-27,1-27,1-11,0-0,0-0)
    32   22248    58      0  1 (32-21414,3-87,5-129,10-386,5-145,3-87,0-0,0-0)
    48    3767    58      0  1 (14-972,25-2216,4-66,7-231,5-213,3-69,0-0,0-0)
    64    4539    41      0  1 (18-3065,15-818,1-254,1-30,4-328,2-44,0-0,0-0)
    80    2704    32      2  1 (19-2354,9-203,1-11,1-11,1-101,1-24,0-0,0-0)
    96    1846    28      1  1 (17-1531,6-141,1-41,2-29,1-20,1-84,0-0,0-0)
   112    1664    42      3  1 (19-926,18-680,1-8,2-34,1-8,1-8,0-0,0-0)

它看起来...非常不同。文章中的下一步

!heap -flt s xxx
也无法在我的WinDbg中运行,看起来像是版本问题(我的WinDbg是最新版本)。 我不知道接下来我应该做什么。有人可以帮忙吗?

memory-leaks windbg
1个回答
0
投票

不是对你的问题的直接回答,但是......(评论太长了)。

关于差异:自您链接的文章发布以来,Windows 堆内部结构已发生变化,因此现在有更多信息。

老实说,如果您无法解释每个命令的输出,那么直接从 Windbg 查找内存泄漏是相当困难的(即使如此,当泄漏很小并且只有在很长一段时间内才开始真正出现时,它仍然很困难)次)。

我通常推荐的是:

  • UMDH
    • 优点:它基本上是调试引擎的包装(因此,与 Windbg 相同),但它会为您完成所有繁重的工作。
    • 缺点:您需要进行多次跟踪并自行解释结果。
  • 性能兽
    • 优点:相对容易使用。
    • 缺点:在某些情况下可能仍然难以解释。

如果您有源代码,并且它是 C 或 C++ 并且专门针对 Windows。

  • 我要做的第一件事是在调试模式下使用 CRT 库 来诊断内存泄漏。
    • 这是最简单的解决方案。易于使用,您可以轻松找到罪魁祸首(除非您的程序从其他地方泄漏...)
    • 它需要对源代码进行一些更改,但不需要那么多(在大多数情况下)。

如果您的程序不执行对 Windows API 的调用或使用 Windows 库(即它可以交叉编译),那么您可以使用 Asan(又名“Address Sanitizer”),更准确地说是 LSan(Leak Sanitizer;Asan 的一部分):

请参阅此处相关问题,例如,使用 MSYS2 或 WSL 在 Windows 上“交叉编译”。

请注意,在撰写本文时,Visual Studio 附带的 Asan 不具备泄漏检测功能。

© www.soinside.com 2019 - 2024. All rights reserved.