我想追蹤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
,但是如何找出該對象的創建位置?
任何幫助將非常感謝!
謝謝, Ĵ
完美!這正是我所期待的。在我看的時候,我實際上瀏覽了那篇文章,但完全錯過了頂部的gflags。謝謝。 – JWood 2010-12-22 13:12:27