2009-05-12 14 views
11

Si mi aplicación C++ falla en Windows, deseo enviar información de depuración útil a nuestro servidor.Cómo extraer información de depuración de un bloqueo

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

¿Hay alguna manera de extraer información de depuración útil después de que un programa se cuelga? ¿O solo 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)

Respuesta

7

La función Stackwalk64 se puede utilizar para ajustar un seguimiento de pila en Windows.

Si tiene la intención de utilizar esta función, asegúrese de compilar su código con FPO desactivado: sin símbolos, StackWalk64 no podrá recorrer correctamente los cuadros de FPO.

Puede obtener algún código ejecutándose en proceso en el momento del bloqueo a través de un bloque de nivel superior __try/__except llamando a SetUnhandledExceptionFilter. Esto es poco confiable ya que requiere que se ejecute un código dentro de un proceso bloqueado. De forma alternativa, puede simplemente incluir el Informe de errores de Windows para recopilar datos de fallas. Esto es más confiable, ya que no requiere que agregue código que se ejecuta dentro del proceso comprometido y bloqueado. El único costo es obtener un certificado de firma de código, ya que debe enviar un binario firmado al servicio. https://sysdev.microsoft.com/en-US/Hardware/signup/ tiene más detalles.

+0

No es necesario que los binarios estén firmados para recuperar los datos de bloqueo de WER. En su lugar, ejecuta una herramienta especial que escanea sus binarios y recopila los nombres de archivo, marcas de tiempo, CRC, etc. La herramienta guarda esta información en un archivo XML que usted carga en Winqual. – bk1e

+0

El binario firmado es para establecer la identidad. De http://www.microsoft.com/whdc/winlogo/maintain/StartWER.mspx: Para proteger a las empresas de la suplantación y garantizar que los informes de errores vayan a un representante de la compañía correcta, el sitio web de Winqual requiere que su empresa tener una identificación válida de VeriSign. – Michael

2

Este sitio web proporciona un buen resumen detallado de recuperación de pila en Win32 después de un C excepción ++:

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 que el código se ejecuta, ganó' t trabajo.

2

Genera un archivo de minivolcado. A continuación, puede cargarlo en windbg o Visual Studio e inspeccionar toda la pila donde se produjo el bloqueo.

Here's un buen lugar para comenzar a leer.

+0

desafortunadamente MiniDumpWriteDump requiere ciertos privilegios, que no puedo asumir que mis usuarios tengan – hoju

2

Es bastante simple volcar las direcciones actuales de la pila en un archivo de registro. Todo lo que tiene que hacer es obtener esa función llamada a las fallas del programa (es decir, un controlador de interrupción en Windows) o afirma. Esto también se puede hacer en las versiones lanzadas. El archivo de registro se puede combinar con un archivo de mapa que da como resultado una pila de llamadas con nombres de funciones.

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

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

1

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 configurar Dr Watson (ejecutar Drwtsn32.exe).Si marca la opción 'generar volcados de volcado', cuando una aplicación se cuelga, se escribirá un pequeño archivo de volcado en la ruta especificada (llamada user.dmp).

Puede tomar esto, combinarlo con los símbolos que creó cuando construyó su servidor (configúrelo en su compilador/enlazador para generar archivos pdb; manténgalos seguros en su hogar, los usa para hacer coincidir el volcado para que puedan averigüe la fuente donde se produjo el bloqueo)

Obtenga usted mismo windbg, ábralo y utilice la opción de menú para 'cargar el volcado de emergencia'. Una vez que haya cargado todo, puede escribir '~ # kp' para obtener una lista de llamadas para cada hilo (o haga clic en el botón de la parte superior del hilo actual).

Hay buenos artículos para saber cómo hacer esto en toda la web, This one es mi favorito, y querrá saber read this para obtener una comprensión de cómo ayudarse a sí mismo a administrar los símbolos muy fácilmente.

1

Tendrá que configurar un marco de generación de volcado en su aplicación, here es cómo puede hacerlo.

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

2

Déjenme describir cómo manejo los bloqueos en mi aplicación C++/WTL.

Primero, en la función principal, llamo a _set_se_translator, y paso una función que generará una excepción de C++ en lugar de usar excepciones de ventanas estructuradas. Esta función obtiene un código de error, para lo cual puede obtener un mensaje de error de Windows a través de FormatMessage, y un argumento PEXCEPTION_POINTERS, que puede usar para escribir un minivolcado (code here). 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 se puede abrir en Visual Studio como un proyecto normal, y siempre que haya creado un archivo .pdb para su ejecutable, puede ejecutar el proyecto y saltará a la ubicación exacta del bloqueo, junto con la pila de llamadas y registros, que se pueden examinar desde el depurador.

0

Es posible que desee utilizar adplus para capturar la pila de llamadas de bloqueo.

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

Uso de adplus se menciona aquí: Adplus usage

Esto crea el fallo completo o pasar el volcado. Una vez que tienes el vertedero, Windbg viene al rescate. Asigne los pdbs y símbolos correctos y ya está listo para analizar el volcado. Para comenzar, utilice el comando "! Analyze -v"

Cuestiones relacionadas