我试图追踪在Windows中的C + +应用程序中的内存泄漏,我有一个应用程序与大量的泄漏对象的内存转储。 我使用Windbg通过执行以下操作来追踪它们:
// Get heap stats !heap -s
这显示了以下内容:
Heap Flags Reserv Commit Virt Free List UCR Virt Lock Fast (k) (k) (k) (k) length blocks cont. heap ----------------------------------------------------------------------------- 00150000 00000002 1024 272 272 20 2 1 0 0 L 00250000 00001002 64 24 24 9 1 1 0 0 L 00260000 00008000 64 12 12 10 1 1 0 0 003a0000 00001002 64 24 24 1 0 1 0 0 L 003d0000 00001002 392256 292256 292256 3 1 1 0 49 L 00bb0000 00001002 64 56 56 1 1 1 0 0 L 00c30000 00001002 64 32 32 7 1 1 0 0 L -----------------------------------------------------------------------------
所以我可以看到堆003d0000包含泄漏的对象,所以我使用:
// Get individual heap stats !heap -stat -h 003d0000
这表明:
heap @ 003d0000 group-by: TOTSIZE max-display: 20 size #blocks total ( %) (percent of total busy bytes) 98 105de3 - 9b7bec8 (61.59) 50 f052f - 4b19eb0 (29.75) 8 21829f - 10c14f8 (6.64) 2a0 881 - 1652a0 (0.55) d0 a5e - 86c60 (0.21) 48 19a1 - 73548 (0.18) c0 8f0 - 6b400 (0.17) 490 155 - 613d0 (0.15) 40 1300 - 4c000 (0.12) 20 1ff1 - 3fe20 (0.10) 7c 7e1 - 3d0fc (0.09) 28 120c - 2d1e0 (0.07) 8708 5 - 2a328 (0.07) 34 8f4 - 1d190 (0.05) e0 1dd - 1a160 (0.04) bb88 2 - 17710 (0.04) f0 12b - 11850 (0.03) 30 45d - d170 (0.02) 10 b73 - b730 (0.02) 90 f4 - 8940 (0.01)
所以我有一个98字节大小的对象的泄漏,我可以追查这个对象是什么:
!heap -flt s 98
由此可见:
<snip> 19f56c38 0014 0014 [01] 19f56c40 00098 - (busy) MyApp!MyObject::`vftable' <snip>
这是我的Windbg知识用完的地方,我可以看到堆上的对象是MyObject
类的,但是我怎么知道这个对象是在哪里创build的呢?
任何帮助将非常感激!
谢谢,J
这是一个很好的,简短的教程。 不过,您需要启用一些全局标志来获取堆栈跟踪。 另外,根据您的平台/配置,您可能会遇到一个不幸的问题 。
您也可以使用XPerf(从Windows性能工具包),使用以下标志: -heap -stackwalk HeapCreate+HeapAlloc+HeapRealloc
。 这会给你一个很好的分析器风格的分析内存分配但没有释放。