2011-03-07 6 views
20

Tengo una aplicación de C++ compilado con MinGW para el que he estado recibiendo quejas de los clientes de choque. Así, además de la tala en gran medida en las partes que podrían ser Crashing (antes de lanzar una nueva versión), he estado buscando un reportero accidente que le ayudará a encontrar a cabo el seguimiento de pila y cualquier otra información útil de depuración cada vez que surja un error.Crash de informes para aplicaciones MinGW

¿Existe alguna herramienta de este tipo que sea compatible con aplicaciones MinGW? (Parece que existe una estrecha relación entre el compilador de entonces y la estrategia de informe de fallos, por lo tanto, la pregunta).

¿Hay algunas herramientas de Windows que me puedan ayudar? La aplicación se ejecuta principalmente en máquinas con Windows XP.

Ser capaz de escribir información en un archivo es suficiente para mis propósitos. Entonces puedo pedirle a mi cliente que me envíe la información.

He estado buscando en google-breakpad y SetUnhandledExceptionFilter, pero todavía no sé si serán útiles de ninguna manera. Otras utilidades de informe de bloqueo, como crashrpt, están diseñadas para Visual C++, así que supongo que probarlas con MinGW no tiene mucho sentido.

EDIT: algunos enlaces útiles sobre el tema

+0

¿Qué IDE estás usando? Si se trata de una libreta, considere descargar QT framework y QTCreator gratis, que usa MinGW en Windows de manera predeterminada y tiene capacidades de depuración. – AJG85

+1

Gracias, pero estoy buscando un reportero de bloqueos, algo que me permita depurar un programa que está instalado en la computadora del cliente. –

Respuesta

13

En realidad, el problema no es conseguir tanto los informes de fallos a trabajar. Eso es bastante trivial con las funciones de la biblioteca DbgHelp y lo más destacado es MiniDumpWriteDump. Sin embargo, recuerde redistribuir la biblioteca DbgHelp en sistemas más antiguos y observar los requisitos de versión para las funciones que desea llamar: las versiones más nuevas de Windows vienen con al menos alguna versión de esta biblioteca.

Su problema con el uso de un compilador no-EM (el problema también existe con el Embarcadero, anteriormente Borland, los productos, por ejemplo, o Watcom) es que los símbolos de depuración creados no tienen sentido para la biblioteca DbgHelp - el cual es la instalación estándar para la depuración en Windows. El formato PDB no está documentado en gran medida (para algunas pistas busca los términos: Sven Schreiber PDB) y las bibliotecas utilizadas para crear no son "públicas" en el mismo sentido que la biblioteca DbgHelp; esta última solo se puede usar para leer/analizar los símbolos de depuración creados. Son parte de los productos de Visual Studio y generalmente tienen el nombre de mspdbXY.dll (donde XY son dígitos decimales).

lo tanto, si desea crear informes de errores te sugiero que en lugar de concentrarse en los "problemas" del compilador, se concentran en los problemas del depurador.Estas son las direcciones generales en las que se puede practicar:

  1. Utilice un depurador que entiende el formato de depuración en particular (BGF para enano en MinGW, IIRC)
  2. uso de un depurador que comprende múltiples formatos (AIF viene a la mente y tiene otras ventajas también;))
  3. Escriba una extensión a algo así como WinDbg para dar sentido a sus símbolos dedebug (DWARF) o más genéricamente .map (soy consciente de que tales extensiones fueron escritas hace algunos años para Borland .map archivos)
  4. Aprenda el lenguaje ensamblador y use las herramientas disponibles (Wi nDbg o más generalmente la biblioteca DbgHelp) sin símbolos (probablemente una curva de aprendizaje muy empinada a menos que sepa que ya)

Como una extensión a 4 también se puede dejar que GCC crear los archivos .S (montaje) durante la compilación para hacer una referencia cruzada entre el código fuente y el volcado de emergencia cuando se trabaja sin soporte de símbolos.

Dado que prefiero GDB en plataformas unixoid, pero WinDbg y otros depuradores en Windows, realmente no puedo decir si hay soporte para el formato de volcado de emergencia real (creado con MiniDumpWriteDump) en GDB en Windows, entonces no estoy seguro qué formato puede esperar GDB en este caso.

BTW: si utiliza Windows XP o superior y puede confiar en ese hecho, use AddVectoredExceptionHandler en lugar de SetUnhandledExceptionFilter para preparar la escritura del volcado de emergencia.

+0

Gracias por su respuesta detallada. Configurar el informe de fallos era realmente trivial usando las funciones que mencionas. Y GDB no reconoce el volcado creado con MiniDumpWriteDump, que era de esperar. Los formatos de depuración definitivamente parecen ser el problema principal aquí, ya que otras personas con el mismo problema no han encontrado respuestas satisfactorias. Ahora al menos puedo obtener un seguimiento de la pila (más o menos, ya que no aparecen todos los nombres de las funciones, los interesados, vea el enlace en mi pregunta) y finalice la aplicación correctamente. –