我找到了一篇文章来学习解决内存泄漏问题,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是最新版本)。
我不知道接下来我应该做什么。有人可以帮忙吗?
不是对你的问题的直接回答,但是......(评论太长了)。
关于差异:自您链接的文章发布以来,Windows 堆内部结构已发生变化,因此现在有更多信息。
老实说,如果您无法解释每个命令的输出,那么直接从 Windbg 查找内存泄漏是相当困难的(即使如此,当泄漏很小并且只有在很长一段时间内才开始真正出现时,它仍然很困难)次)。
我通常推荐的是:
如果您有源代码,并且它是 C 或 C++ 并且专门针对 Windows。
如果您的程序不执行对 Windows API 的调用或使用 Windows 库(即它可以交叉编译),那么您可以使用 Asan(又名“Address Sanitizer”),更准确地说是 LSan(Leak Sanitizer;Asan 的一部分):
请参阅此处相关问题,例如,使用 MSYS2 或 WSL 在 Windows 上“交叉编译”。
请注意,在撰写本文时,Visual Studio 附带的 Asan 不具备泄漏检测功能。