2012-05-15 21 views
15

acabo de comenzar usando C++ excepciones y quieren hacer las cosas bien. Lo que tengo en mente es generar algún tipo de información de rastreo cuando se detectan excepciones. Inicialmente tuve ideas similares a Call-stack for exceptions in C++, pero eventualmente descubrí que eso no es muy bueno.¿Se puede usar gdb para rastrear cuando se detectan excepciones?

también han leído How to generate a stacktrace when my gcc C++ app crashes pero no quieren añadir más complejidad a mi proyecto actual. Como, solo necesito el backtracing cuando estoy en modo de depuración, esperaba poder usar gdb para ese fin.

Mi estrategia ha sido insertar un punto de interrupción en el bloque catch y luego ir a través de la pila de llamadas para identificar exactamente por qué se produjo la excepción en primer lugar (¿o qué lo causó)? Desafortunadamente, parece que no puedo hacer esto, ya que cuando gdb llega al punto de interrupción, borra la pila de llamadas y solo puedo ver main (es ahí donde atrapo). ¿Se supone que esto va a pasar o estoy haciendo algo mal aquí?

Editar: que al igual que para resumir los métodos aquí para otras personas:

primera Método (por paulsm4). Establecer un Catchpoint través catch throw para la captura con el tiro o catch catch para la captura de captura! A continuación, llame backtrace

segundo método (por aschepler) Establecer un punto de interrupción en __cxa_throw y luego backtrace

tercera Método (en Qt Creator - si quieres pasar a utilizar), podrá ajustar fácilmente un punto de ruptura con el tiro o coger!

Edit_2: Usando depurador de Qt Creator, parece que el establecimiento de un punto de interrupción en __cxa_begin_catch es también un equivalente a catch catch :)

+0

Trate de ver las respuestas de esta pregunta: http://stackoverflow.com/questions/2443135/how -do-i-find-where-an-exception-was-thrown-in-c – MCKapur

+0

Una prueba rápida para g ++/Linux muestra que podría ser útil establecer un punto de interrupción en la función interna '__cxa_throw'. – aschepler

+2

... y ahora que leí la respuesta de @paulsm4, parece que el comando gdb 'catch throw' hace esencialmente eso. (Si hago tanto 'break' como' catch', gdb notas para mí que ambos usan la misma dirección de PC.) – aschepler

Respuesta

14

Esta esto:

http://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html

Se puede utilizar catchpoints para hacer que el depurador de parada para ciertos tipo de eventos de programas, tales como excepciones de C++ o la carga de un biblioteca compartida. Use el comando catch para establecer un punto de referencia.

Entonces la respuesta debería ser "sí", y debería evitar los problemas con los dos enlaces que citó.

Por favor, después de vuelta si ayudó! Personalmente, nunca he intentado esto BGF cuentan a mí mismo :)

+2

SÍ: D Parece que está funcionando. ahora mismo puedo insertar un punto de encuentro usando 'catch throw'. Una vez que se lanza la excepción, puedo usar 'backtrace' para obtener la pila completa de llamadas: D: D. Muchas gracias – GradGuy

0

Resumen de las respuestas de los comentarios:

primera Método (por paulsm4). Establecer un Catchpoint través catch throw para la captura con el tiro o catch catch para la captura de captura! A continuación, llame backtrace

segundo método (por aschepler) Establecer un punto de interrupción en __cxa_throw y luego backtrace

tercera Método (en Qt Creator - si quieres pasar a utilizar), podrá ajustar fácilmente un punto de ruptura con el tiro o coger!

Usando depurador de Qt Creator, parece que el establecimiento de un punto de interrupción en __cxa_begin_catch es también un equivalente a catch catch

Cuestiones relacionadas