Cómo mostrar un seguimiento de la pila cuando se lanza una excepción

Resuelto rlbond asked hace 15 años • 16 respuestas

Quiero tener una manera de informar el seguimiento de la pila al usuario si se produce una excepción. ¿Cuál es la mejor manera de hacer esto?

Me gustaría que fuera portátil si es posible. Quiero que aparezca información para que el usuario pueda copiar el seguimiento de la pila y enviármelo por correo electrónico si surge un error.

rlbond avatar Mar 28 '09 05:03 rlbond
Aceptado

La respuesta de Andrew Grant no ayuda a obtener un seguimiento de la pila de la función de lanzamiento , al menos no con GCC, porque una declaración de lanzamiento no guarda el seguimiento de la pila actual por sí sola y el controlador de captura no tendrá acceso al seguimiento de la pila en ese punto más.

La única forma (usando GCC) de resolver esto es asegurarse de generar un seguimiento de la pila en el punto de la instrucción de lanzamiento y guardarlo con el objeto de excepción.

Este método requiere, por supuesto, que cada código que arroje una excepción utilice esa clase de excepción en particular.

Actualización del 11 de julio de 2017 : para obtener código útil, eche un vistazo a la respuesta de cahit beyaz , que apunta a http://stacktrace.sourceforge.net . Aún no lo he usado, pero parece prometedor.

Actualización 29 de julio de 2023 : bibliotecas de seguimiento de pilas a partir de julio de 2023:

  • C++23<stacktrace> : se introducirá C++23 <stacktrace>, que algunas implementaciones de bibliotecas estándar ya admiten o admiten parcialmente.
  • boost stacktrace : implementación de referencia <stacktrace>propuesta por los autores. Tiene muchas funciones pero requiere varias configuraciones y dependencias .
  • back-cpp : una biblioteca ampliamente utilizada que proporciona mucha información, incluidos fragmentos de código para cada cuadro. Dependiendo de su sistema, tiene varias configuraciones y dependencias . Es compatible con la mayoría de las plataformas además de mingw.
  • cpptrace : una biblioteca de seguimiento de pila de C++ más nueva que es simple, portátil y autónoma.
Thomas Tempelmann avatar Nov 12 '2014 09:11 Thomas Tempelmann

Depende de qué plataforma.

En GCC es bastante trivial; consulte esta publicación para obtener más detalles.

En MSVC, puede usar la biblioteca StackWalker que maneja todas las llamadas API subyacentes necesarias para Windows.

Tendrás que encontrar la mejor manera de integrar esta funcionalidad en tu aplicación, pero la cantidad de código que necesitas escribir debe ser mínima.

Andrew Grant avatar Mar 27 '2009 22:03 Andrew Grant