2012-07-25 8 views
5

#define ing _GLIBCXX_DEBUG fuerzas del CCG para atrapar una gran clase de errores de ejecución en C++, como fuera de los límites de acceso STL, iteradores no válidos, etc.cómo hacer que GCC imprima útil RUNTIME mensaje de error?

Por desgracia, cuando ocurre el error, el mensaje impreso no es muy servicial. Sé cómo imprimir una traza inversa con una función, y __FILE__ y __LINE__ con una macro.

¿Hay alguna manera fácil de convencer a GCC para que lo haga, o para especificar una función/macro a la que llamar cuando se produce realmente el tipo de errores que _GLIBCXX_DEBUG atrapa?

Respuesta

3

Supongo que quiere decir que quiere mensajes que impriman el contexto de uso en su código, en lugar del nombre y el número de línea de algún archivo de encabezado interno utilizado por GCC.

Parece que hay una única macro en .../debug/macros.h que utiliza el código de comprobación llamado _GLIBCXX_DEBUG_VERIFY. Puede modificarlo para adaptarlo a sus necesidades.

Editar: Jonathan Wakely señala que todos los controles son fatales.

+0

No hay comprobaciones de modo de depuración no fatales, si fallan todas llaman 'abort()' –

3

Cuando una comprobación del Modo de depuración falla, llama al abort(), por lo que descarga un archivo central que puede examinar fácilmente con un depurador para ver dónde falló. Si ejecuta el programa en un depurador, se detendrá cuando se interrumpa y podrá imprimir el seguimiento de la pila con backtrace.

Para que sea automático, deberá cambiar la llamada al abort() (en libstdc++-v3/src/c++11/debug.cc). Creo que puede cambiarlo para llamar al std::terminate() y luego instalar su propio terminate_handler con set_terminate para que imprima una traza inversa.

Cuestiones relacionadas