2010-12-21 7 views
2

Ich versuche, einen Speicherverlust in einer C++ - Anwendung in Windows zu finden, und ich habe einen Speicherauszug der Anwendung mit einer großen Anzahl von Objekten durchgesickert. Ich verwende Windbg sie, indem Sie die folgenden auf die Spur:Verfolgen Sie Stack-Trace, der Objekt in Windbg erstellt

// Get heap stats 
!heap -s 

Dies zeigt folgendes:

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 
----------------------------------------------------------------------------- 

So kann ich diesen Haufen sehen 003d0000 das undichte enthält Objekte so verwende ich:

// Get individual heap stats 
!heap -stat -h 003d0000 

Welche zeigt:

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) 
So 10

Ich habe ein Leck eines Objekts 98 Bytes groß, kann ich die Spur zu kommen, was das Objekt ist mit:

!heap -flt s 98 

Dies zeigt:

<snip> 
19f56c38 0014 0014 [01] 19f56c40 00098 - (busy) 
     MyApp!MyObject::`vftable' 
<snip> 

Dies ist, wo mein Wissen über Windbg läuft aus, ich kann sehen, dass das Objekt auf dem Haufen der Klasse MyObject ist, aber wie finde ich heraus, wo dieses Objekt erstellt wurde?

Jede Hilfe würde sehr geschätzt werden!

Danke, J

Antwort

3

Here ist eine schöne, kurze Anleitung. Sie müssen einige globale Flags aktivieren, um die Stack-Ablaufverfolgung zu erhalten. Je nach Plattform/Konfiguration kann es auch zu einem unglücklichen problem kommen.

+0

Perfekt! Genau das habe ich gesucht. Ich habe diesen Artikel zwar überflogen, während ich geschaut habe, aber die gflags ganz oben vermisst. Vielen Dank. – JWood

0

Sie können es auch mit XPerf (von Windows Performance Toolkit) mit den folgenden Flags verwenden: -heap -stackwalk HeapCreate+HeapAlloc+HeapRealloc. Das würde Ihnen eine schöne Profiler-Analyse geben, wo der Speicher zwar zugewiesen, aber nicht freigegeben wurde.