Pregunta

Estoy teniendo una explosión rastreando algo de corrupción del montón. He habilitado la verificación de montón de páginas estándar con

gflags /p /enable myprogram.exe

y esto logra confirmar la corrupción:

===========================================================
VERIFIER STOP 00000008: pid 0x1040: corrupted suffix pattern 

    10C61000 : Heap handle
    19BE0CF8 : Heap block
    00000010 : Block size
    00000000 : 
===========================================================

Cuando enciendo la verificación del montón de página completa ( gflags / p / enable myprogram.exe / full ) anticipando que esto causará un error en el momento en que se introduce la corrupción, obtengo nada más.

Empecé a hacerme ilusiones mientras leía Depuración avanzada de Windows: corrupción de memoria Parte II & # 8212; Montones , que es un capítulo de Depuración avanzada de Windows . Instalé WinDbg y descargué símbolos de depuración para user32.dll , kernel32.dll , ntdll.dll de acuerdo con http://support.microsoft.com/kb/311503 . Ahora, cuando el programa se detiene en el depurador, puedo emitir este comando para ver información sobre la página del montón:

0:000> dt _DPH_BLOCK_INFORMATION 19BE0CF8-0x20
ntdll!_DPH_BLOCK_INFORMATION
   +0x000 StartStamp       : 0xabcdaaaa
   +0x004 Heap             : 0x90c61000 
   +0x008 RequestedSize    : 0x10
   +0x00c ActualSize       : 0x38
   +0x010 FreeQueue        : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x010 TraceIndex       : 0
   +0x018 StackTrace       : (null) 
   +0x01c EndStamp         : 0xdcbaaaaa

Estoy consternado por el seguimiento de la pila (nulo) . Ahora, http://msdn.microsoft.com/ es-es / library / ms220938% 28VS.80% 29.aspx dice:

  

El campo StackTrace no siempre contendrá un valor no nulo por varias razones. En primer lugar, la detección de seguimiento de pila solo es compatible con plataformas x86 y, en segundo lugar, incluso en máquinas x86, los algoritmos de detección de seguimiento de pila no son completamente confiables. Si el bloque es un bloque asignado, el seguimiento de la pila es para el momento de asignación. Si se liberó el bloque, el seguimiento de la pila es para el momento libre.

Pero me pregunto si alguien tiene alguna idea sobre aumentar las posibilidades de ver el seguimiento de la pila desde el momento de la asignación.

¡Gracias por leer!

¿Fue útil?

Solución

¡Ah, ja! Resulta que necesitaba habilitar más opciones de gflags :

gflags /i myprogram.exe +ust

Que tiene este efecto:

ust - Create user mode stack trace database

Parece sencillo cuando veo la descripción del parámetro. Tonto de mí. Pero también parece que necesito establecer el tamaño de la base de datos de rastreo antes de que surta efecto:

gflags /i myprogram.exe /tracedb 512

... o lo que sea (en MB).

Otros consejos

Según Microsoft, la función malloc en el módulo de tiempo de ejecución C (CRT) usa la omisión de puntero de marco (FPO) en algunas versiones de Windows. Es posible que no vea la información completa de la pila de la función malloc. (http://support.microsoft.com/kb/268343)

Si es posible, intente vincular la versión de depuración CRT, p. enlace con la opción / MDd, para resolver este problema.

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