Warum erhalten Sie keine vollständigen Stapelspuren, wenn Sie den Benutzermodus -Stack -Trace aktivieren?

StackOverflow https://stackoverflow.com/questions/7322921

  •  27-10-2019
  •  | 
  •  

Frage

Ich behebe einige Probleme mit Gedächtnisfragmentierung und habe versucht herauszufinden, warum die Dinge zugewiesen werden und wer letztendlich die Zuteilung durchführt. Deshalb habe ich Usermode -Stapelspuren für den Prozess (+UST -Flag in GFLAGs) aktiviert und einen Müllkippe erhalten. Wenn ich den Dump analysiere und den! Heap -p -a son_address verwende. Ich sehe eine Stapelspur, aber es ist definitiv keine vollständige Spur. Normalerweise sehe ich nur 4-7 Funktionen in der Spur und dann stoppt es. Im Stapel werden keine Fehler gemeldet, aber leider hat es nicht genügend Informationen. Ich habe ein Haufen Zuteilungen überprüft und alle scheinen das gleiche Problem zu haben. Ich dachte, es könnte die Größe der Stack -Datenbank sein, aber ich hätte erwartet, ganze Einträge verloren zu haben, anstatt nur einen Teil davon zu verlieren. Gibt es etwas, das ich tun kann, um die Gesamtgröße des sichtbaren Stapels zu erhöhen? Einige Beispiele sind unter den Stapeln, die ich sehe.

0:000> !heap -p -a 3cb49008
    address 3cb49008 found in
    _HEAP @ 80000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        3cb49000 0fdd 0000  [07]   3cb49008    07ed0 - (busy)
        Trace: 6b69
        7c855014 ntdll!RtlAllocateHeapSlowly+0x00000041
        7c83d9aa ntdll!RtlAllocateHeap+0x00000e9f
        776bcfce ole32!CRetailMalloc_Alloc+0x00000016
        77d0404a oleaut32!APP_DATA::AllocCachedMem+0x0000004f
        77d04341 oleaut32!SysAllocStringByteLen+0x0000003c
        77d03f9b oleaut32!ErrStringCopyNoNull+0x00000016
        77d0456f oleaut32!VariantCopy+0x0000007e
        3ff1946 xxxx!_variant_t::_variant_t+0x00000016


0:000> !heap -p -a 2774cfc8
    address 2774cfc8 found in
    _HEAP @ 3cc0000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        2774cfc0 0008 0000  [17]   2774cfc8    00020 - (busy)
        Trace: 7de8
        7c855014 ntdll!RtlAllocateHeapSlowly+0x00000041
        7c83d9aa ntdll!RtlAllocateHeap+0x00000e9f
        4f6ad17 xxxx!malloc+0x0000007a


0:000> !heap -p -a 3ca25e08
    address 3ca25e08 found in
    _HEAP @ 80000
      HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
        3ca25e00 0007 0000  [07]   3ca25e08    00020 - (busy)
        Trace: 8588
        7c855014 ntdll!RtlAllocateHeapSlowly+0x00000041
        7c83d9aa ntdll!RtlAllocateHeap+0x00000e9f
        776bcfce ole32!CRetailMalloc_Alloc+0x00000016
        77d0404a oleaut32!APP_DATA::AllocCachedMem+0x0000004f
        77d04341 oleaut32!SysAllocStringByteLen+0x0000003c
        77d03f9b oleaut32!ErrStringCopyNoNull+0x00000016
        77d0456f oleaut32!VariantCopy+0x0000007e
        4f35abd xxxx!std::_Construct<_variant_t,_variant_t>+0x0000004d
War es hilfreich?

Lösung

Bei 32-Bit-Fenstern verwendet das System die EBP-Kette, um eine Stapelspur zu nehmen. Sie müssen die FPO -Optimierung deaktivieren (/Oy-). Bei 64-Bit-Fenstern erhalten Sie auch bei Optimierung eine gute Stapelspur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top