Perché non si ottiene tracce stack completo quando si abilita l'utente traccia modalità di stack?

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

  •  27-10-2019
  •  | 
  •  

Domanda

Sono la risoluzione di alcuni problemi di frammentazione della memoria e ho cercato di capire il motivo per cui le cose vengono assegnati e chi è in ultima analisi, a fare l'allocazione. Così ho attivato usermode stack per il processo (bandiera + UST in gflags) e ottenuto una discarica. Quando analizzo la discarica e utilizzare il! Mucchio -p -a Some_Address. Vedo una traccia dello stack, ma non è sicuramente una traccia completa. Io di solito vedo solo 4-7 funzioni per la traccia e poi si ferma. Nessun errore sono riportati nello stack, ma purtroppo non ha abbastanza informazioni. Ho controllato un mucchio delle assegnazioni e tutti sembrano avere lo stesso problema. Ho pensato che potrebbe essere la dimensione del database pila, ma mi sarei aspettato di perdute intere voci invece di solo perdere una parte di essi. C'è qualcosa che posso fare per aumentare la dimensione totale della pila visualizzabile. Alcuni esempi sono al di sotto delle pile che sto vedendo.

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
È stato utile?

Soluzione

In Windows a 32 bit della catena usi sistema EBP di prendere una traccia dello stack. È necessario l'ottimizzazione FPO disabilitare ( / Oy- ). Su Windows a 64 bit si otterrà una traccia di stack buona, anche con l'ottimizzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top