¿Por qué no obtienes trazas de pila completas al habilitar la traza de la pila de modo de usuario?

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

  •  27-10-2019
  •  | 
  •  

Pregunta

Estoy solucionando algunos problemas de fragmentación de memoria y he estado tratando de descubrir por qué se están asignando las cosas y quién está haciendo la asignación. Así que habilité las trazas de la pila USERMode para el proceso (+Flager en GFLAGS) y obtuve un volcado. Cuando analizo el volcado y uso el toap -p -a some_address. Veo un rastro de pila, pero definitivamente no es un rastro completo. Por lo general, solo veo 4-7 funciones en la traza y luego se detiene. No se informan errores en la pila, pero desafortunadamente no tiene suficiente información. Revisé un montón de asignaciones y todos parecen tener este mismo problema. Pensé que podría ser el tamaño de la base de datos de pila, pero hubiera esperado perder entradas enteras en lugar de perder parte de ellas. ¿Hay algo que pueda hacer para aumentar el tamaño total de la pila visible? Algunos ejemplos están debajo de las pilas que estoy viendo.

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
¿Fue útil?

Solución

En las ventanas de 32 bits, el sistema utiliza la cadena EBP para tomar un rastro de pila. Necesita deshabilitar la optimización de FPO (/Oy-). En las ventanas de 64 bits obtendrá una buena rastreo de pila incluso con optimización.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top