2010-12-21 96 views
2

我想追踪Windows中的C++应用程序中的内存泄漏,并且我有大量泄漏对象的应用程序的内存转储。我使用WinDBG的通过执行以下操作来跟踪他们失望:追踪在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,但是如何找出该对象的创建位置?

任何帮助将非常感谢!

谢谢, Ĵ

回答

3
Here

是一个不错的,简短的教程。不过,您需要启用一些全局标志来获取堆栈跟踪。另外,根据您的平台/配置,您可能遇到不幸problem

+0

完美!这正是我所期待的。在我看的时候,我实际上浏览了那篇文章,但完全错过了顶部的gflags。谢谢。 – JWood 2010-12-22 13:12:27

0

您也可以将它与XPerf(来自Windows Performance Toolkit)一起使用,具有以下标志: -heap -stackwalk HeapCreate+HeapAlloc+HeapRealloc。这会给你一个很好的分析器风格的分析内存分配但没有释放的地方。