Pregunta

Si mis C ++ aplicación se bloquea en Windows Me quieren enviar información útil depuración a nuestro servidor.

En Linux volvería a usar la función de GNU backtrace() - ¿hay un equivalente para Windows

¿Hay una manera de extraer información de depuración útil después de un programa se ha estrellado? O sólo desde dentro del proceso?

(Consejo a lo largo de las líneas de "prueba que la aplicación por lo que no se desplome" no es útil - todos los programas no triviales tendrán errores)

¿Fue útil?

Solución

La función StackWalk64 puede ser utilizado para tomar una traza de la pila en Windows.

Si usted tiene la intención de utilizar esta función, debe estar seguro de compilar el código con FPO discapacitados -. Sin símbolos, StackWalk64 no será capaz de caminar correctamente marcos FPO'd

Puede conseguir un poco de código que se ejecuta en el proceso en el momento del accidente a través de un bloque de nivel superior __try/__except llamando SetUnhandledExceptionFilter. Esto es un poco fiable, ya que requiere que tenga código que se ejecuta dentro de un proceso de estrellado. Como alternativa, puede simplemente la incorporada en el Informe de errores de Windows para recopilar los datos de accidentes. Esto es más fiable, ya que no requiere que añadir código que se ejecuta dentro del comprometida, proceso de estrellado. El único costo es conseguir un certificado de firma de código, ya que debe presentar un binario con signo al servicio. https://sysdev.microsoft.com/en-US/Hardware/signup/ tiene más detalles.

Otros consejos

Puede utilizar la llamada API de Windows MiniDumpWriteDump si lo desea a rodar su propio código. Tanto Windows XP y Vist automatizar este proceso y que pueden inscribirse en https://winqual.microsoft.com a tener acceso a los informes de errores.

También puedes ver http://kb.mozillazine.org/Breakpad y http://www.codeproject.com/KB/debug/crash_report.aspx para otras soluciones .

Este sitio web proporciona bastante una visión detallada de la recuperación de pila en Win32 después de una excepción de C ++:

http://www.eptacom.net/pubblicazioni/pub_eng/except.html

Por supuesto, esto sólo funcionará dentro del proceso, por lo que si el proceso se termina o se bloquea hasta el punto donde termina antes de ejecutar ese código, no va a funcionar.

Generar un archivo de minivolcado. A continuación, puede cargarla en windbg o Visual Studio e inspeccionar toda la pila donde ocurrió el accidente.

Aquí es un buen lugar para empezar a leer.

Es bastante sencillo para volcar las direcciones StackFrame actuales en un archivo de registro. Todo lo que tiene que hacer es conseguir tal función llamada en las fallas del programa (es decir, un manejador de interrupciones en Windows) o afirma. Esto puede hacerse en versiones liberadas así. El archivo de registro a continuación, se pueden combinar con un archivo de mapa que resulta en una pila de llamadas con los nombres de función.

publiqué un artículo sobre esto hace algunos años.

http://www.ddj.com/architect/185300443

Permítaseme describir cómo manejo accidentes en mi C ++ / WTL aplicación.

En primer lugar, en la función principal, que llamo _set_se_translator , y pasar de una función que lanzar una excepción de C ++ en lugar de utilizar excepciones estructuradas ventanas. Esta función obtiene un código de error, por lo que se puede obtener un mensaje de error de Windows a través de FormatMessage , y un argumento PEXCEPTION_POINTERS, que se puede utilizar para escribir un minidump código aquí ). También puede comprobar el código de excepción para ciertos errores "meltdown" que sólo debe rescatar a partir, como EXCEPTION_NONCONTINUABLE_EXCEPTION o EXCEPTION_STACK_OVERFLOW :) (Si es recuperable, que indicará al usuario que me envía este archivo de minivolcado.)

El archivo de minivolcado en sí se puede abrir en Visual Studio como un proyecto normal, y que le proporciona hemos creado un archivo .pdb para su ejecutable, puede ejecutar el proyecto y que va a saltar a la ubicación exacta del accidente, junto con la pila y los registros de llamadas, el cual puede ser examinada desde el depurador.

Si desea tomar una pila de llamadas (además de otra buena información) para un accidente de tiempo de ejecución, en una versión de lanzamiento, incluso en el lugar, entonces usted necesita para ajustar Dr Watson (ejecutar Drwtsn32.exe). Si activas la opción 'generar archivos de volcado', cuando una aplicación se bloquea, que va a escribir un archivo de mini volcado en la ruta especificada (denominada user.dmp).

Puede tomar este, combinarlo con los símbolos que ha creado cuando se construyó su servidor (establecido esto en su compilador / enlazador para generar archivos de AP - Mantenga estos seguros en casa, los utiliza para que coincida con el volcado para que puedan trabajar la fuente de donde ocurrió el accidente)

windbg , abrirlo y usar la opción de menú de 'carga volcado de bloqueo'. Una vez que se ha cargado todo lo que puede escribir '~ # kp' para obtener una pila de llamadas para cada subproceso (o haga clic en el botón en la parte superior para el subproceso actual).

Hay buenos artículos para saber cómo hacer esto en toda la web, Éste es mi favorito, y usted querrá a leer este conseguir una comprensión de cómo manejar los símbolos helpyourself muy fácilmente.

Usted tendrá que establecer un marco de generación de volcado en su aplicación, aquí es cómo puede hacerlo.

A continuación, puede cargar el archivo de volcado al servidor para su posterior análisis mediante analizadores basurero como windbg.

Es posible que desee utilizar ADPlus para capturar la pila de llamadas accidente.

Puede descargar e instalar las herramientas de depuración para Windows.

El uso de adplus se menciona aquí: Adplus

Esto crea el fallo completo o pasar el volcado. Una vez que tenga el vertedero, WinDbg viene al rescate. En el mapa los PDB y símbolos correctos y usted está listo para analizar el volcado. Para comenzar con el uso del comando "! Analyze -v"

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