c++ - test - gdb ubuntu
¿Se puede usar gdb para realizar un seguimiento cuando se detectan excepciones? (2)
Acabo de empezar a usar las excepciones de c ++ y quiero hacerlo bien. Lo que tengo en mente es generar algún tipo de información de retroceso cuando se detectan excepciones. Inicialmente tuve ideas similares a Call-stack para excepciones en C ++, pero finalmente descubrí que eso no es del todo bueno.
También he leído Cómo generar un seguimiento de pila cuando mi aplicación gcc C ++ falla, pero no quiero agregar más complejidad a mi proyecto actual. Dado que, solo necesito el backtracing cuando estoy en modo de depuración, esperaba poder usar gdb para ese propósito.
Mi estrategia ha sido insertar un punto de interrupción en el bloque catch
y luego subir a través de la pila de llamadas para identificar exactamente por qué se lanzó la excepción en primer lugar (o qué lo causó). Desafortunadamente, parece que no puedo hacer esto, ya que cuando gdb alcanza el punto de interrupción, borra la pila de llamadas y solo puedo ver principal (ahí es donde detecto). ¿Se supone que esto suceda o estoy haciendo algo mal aquí?
Edición: me gusta resumir los métodos aquí para otras personas:
1er Método (por paulsm4). ¡Establezca un punto de catch throw
través de un catch throw
de captura para atrapar un tiro o una catch catch
para atrapar una captura! Entonces llama al backtrace
Segundo método (por aschepler) Establezca un punto de interrupción en __cxa_throw
y luego backtrace
Tercer método (en Qt Creator, si lo usas) ¡Puedes establecer fácilmente un punto de interrupción al lanzar o atrapar!
Edit_2: Usando el depurador Qt Creator, parece que establecer un punto de interrupción en __cxa_begin_catch
también es un equivalente a la catch catch
:)
Esto esto:
http://sourceware.org/gdb/onlinedocs/gdb/Set-Catchpoints.html
Puede usar los puntos de captura para hacer que el depurador se detenga para ciertos tipos de eventos del programa, como las excepciones de C ++ o la carga de una biblioteca compartida. Utilice el comando de captura para establecer un punto de captura.
Por lo tanto, la respuesta debería ser "sí", y debería evitar los problemas con los dos enlaces que citó.
Por favor, vuelva a escribir si ayudó! Personalmente, nunca he probado esta característica GDB yo mismo :)
Resumen de las respuestas de los comentarios:
1er Método (por paulsm4). ¡Establezca un punto de catch throw
través de un catch throw
de captura para atrapar un tiro o una catch catch
para atrapar una captura! Entonces llama al backtrace
Segundo método (por aschepler) Establezca un punto de interrupción en __cxa_throw
y luego backtrace
Tercer método (en Qt Creator, si lo usas) ¡Puedes establecer fácilmente un punto de interrupción al lanzar o atrapar!
Al usar el depurador Qt Creator, parece que establecer un punto de interrupción en __cxa_begin_catch
también es un equivalente a la catch catch