Pregunta

A veces mi programa C++ falla en modo de depuración y lo que aparece es un cuadro de mensaje que dice que una aserción falló en algunas de las rutinas de administración de memoria interna (acceso a memoria no asignada, etc.).Pero no sé desde dónde se llamó porque no obtuve ningún seguimiento de la pila.¿Cómo obtengo un seguimiento de la pila o al menos veo dónde falla en mi código (en lugar de la biblioteca/rutinas integradas)?

¿Fue útil?

Solución

Si tiene una falla, puede obtener información sobre dónde ocurrió la falla, ya sea que tenga una versión de depuración o de lanzamiento.Y puedes ver la pila de llamadas incluso si estás en una computadora que no tiene el código fuente.

Para hacer esto, necesita usar el archivo PDB que se creó con su EXE.Coloque el archivo PDB dentro del mismo directorio que el EXE que falló.Nota:Incluso si tiene el mismo código fuente, compilar dos veces y usar el primer EXE y el segundo PDB no funcionará.Debe utilizar el PDB exacto que se creó con su EXE.

Luego adjunte un depurador al proceso que falló.Ejemplo:windbg o VS.

Luego, simplemente revisa tu pila de llamadas, mientras también tienes la ventana de hilos abierta.Tendrá que seleccionar el hilo que falló y verificar la pila de llamadas de ese hilo.Cada hilo tiene una pila de llamadas diferente.

Si ya tiene su depurador VS adjunto, irá automáticamente al código fuente que está causando el bloqueo.

Si el bloqueo ocurre dentro de una biblioteca que está utilizando y para la cual no tiene el PDB.No hay nada que puedas hacer.

Otros consejos

Si ejecuta la versión de depuración en una máquina con VS, debería ofrecer abrirla y permitirle ver el seguimiento de la pila.

El problema es que el verdadero problema ya no está en la pila de llamadas.Si libera un puntero dos veces, puede provocar este problema en otro lugar no relacionado con el programa (la próxima vez que algo acceda a las estructuras de datos del montón)

Escribí este blog con algunos consejos para hacer que el problema aparezca en la pila de llamadas para que puedas descubrir qué está pasando.

http://www.atalasoft.com/cs/blogs/loufranco/archive/2007/02/06/6-_2200_Pointers_2200_-on-Debugging-Unmanaged-Code.aspx

El mejor consejo es utilizar la utilidad gflags para hacer que los problemas con el puntero causen problemas inmediatos.

Puede activar un minivolcado configurando un controlador para excepciones no detectadas.Aquí hay un artículo eso explica todo sobre los minivolcados

De hecho, Google implementó su propio controlador de fallas de código abierto llamado Almohadilla de descanso, que creo que también usa Mozilla (si quieres algo más serio: un controlador de fallos rico y robusto).

Este artículo describe cómo calcular un seguimiento de pila.

Si no recuerdo mal, ese cuadro de mensaje debería tener un botón que diga "reintentar".Esto debería interrumpir el programa (en el depurador) en el punto donde ocurrió la afirmación.

Buscador de accidentes puede ayudarle a localizar el lugar de la excepción dada la DLL y la dirección de la excepción reportada.
Puede tomar este código e integrarlo en su aplicación para que se genere automáticamente un error de pila cuando haya una excepción no detectada.Esto generalmente se realiza usando __try{} __except{} o con una llamada a Establecer filtro de excepción no controlado que le permite especificar una devolución de llamada para todas las excepciones no controladas.

También puede tener instalado un depurador post-mortem en el sistema cliente.Esta es una forma general y decente de obtener información cuando no tiene la creación de volcados integrada en su aplicación (tal vez para una versión anterior para la cual aún debe obtener información).

Dr.Watson en Windows se puede instalar ejecutando: drwtsn32 -i Correr drwtsn32 (sin ninguna opción) aparecerá el cuadro de diálogo de configuración.Esto permitirá la creación de archivos de volcado de memoria, que luego podrás analizar con WinDbg o algo similar.

Puedes usar Amapola para esto.Simplemente agregue algunas macros a su código y este recopilará el seguimiento de la pila, junto con los valores de los parámetros reales, las variables locales, los contadores de bucles, etc.Es muy liviano, por lo que se puede dejar en la versión de lanzamiento para recopilar esta información de fallas en las máquinas de los usuarios finales.

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