A menudo tengo que depurar el bloqueo de programas C++ en Windows donde puedo reproducir el bloqueo, pero es difícil determinar qué secuencia de instrucciones causó el bloqueo (por ejemplo, otro subproceso que sobrescribe la memoria del subproceso que falla). Incluso una pila de llamadas no ayuda en ese caso. Por lo general, recurro a reducir la causa del error comentando secciones del código fuente, pero esto es muy tedioso.Cómo iniciar sesión o reproducir líneas o instrucciones ejecutadas inmediatamente antes de un bloqueo
¿Alguien conoce una herramienta para Windows que pueda informar o reproducir las últimas pocas líneas de código fuente o instrucciones de código de máquina ejecutadas en todos los hilos inmediatamente antes de un bloqueo? Es decir. algo así como la capacidad de depuración inversa de gdb o algo así como BugTrapper de Mutek (que ya no está disponible). Estoy buscando una herramienta liberada y estable (conozco el 'Validador de errores' de SoftwareVerify y el Reproductor de seguimiento IDA Pro 6.3 de Hexray, los cuales aún están en programas beta cerrados).
Lo que ya probé fueron los comandos de rastreo WinDbg wt
y ta @$ra
, pero ambos comandos tienen la desventaja de que se detienen automáticamente después de unos segundos. Necesito comandos de rastreo que se ejecutan hasta que ocurre el bloqueo y que rastrean todos los hilos del programa en ejecución.
NOTA: estoy no buscando una herramienta de depuración diseñado para solucionar un problema particular, como gflags, PageHeap, Memoria del validador, purifica, etc. Estoy buscando la herramienta liberada y estable para rastrear o volver a reproducir en el nivel de instrucción.
Simplemente ejecute su código en un depurador y debería indicarle la ubicación en la fuente de origen que desencadena el bloqueo. –
@Als: Encontrar la ubicación del choque generalmente no es un problema; el problema es cómo determinar * por qué * ha tenido lugar el bloqueo. Por ejemplo, puede haber un bloqueo porque otro subproceso ha sobrescrito las regiones de memoria del subproceso bloqueado (por ejemplo, las escrituras no válidas en el montón o en el área de la pila). Entonces, sería realmente útil ver las últimas líneas o instrucciones ejecutadas por el programa para determinar qué hilo ha escrito algo en la región de memoria dañada. He adaptado mi pregunta anterior para aclarar esto. –
posible duplicado de [Depuración revés] (http://stackoverflow.com/questions/221806/debugging-backwards) – Ferruccio