¿Cómo evitar "StackTrace" (nulo) en DPH_BLOCK_INFORMATION?
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!
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.