2011-07-06 8 views
6

Normalmente lo dejaría sin manejar y el depurador (gdb, Eclipse CDT) me mostraría la pila de llamadas. Lamentablemente, el código está siendo invocado por una biblioteca de terceros que absorbe todas las excepciones. Puedo detectar la excepción antes de la biblioteca de terceros, pero no puedo ver la pila de llamadas (¿desenrollar la pila?).Encontrar donde std :: out_of_range es arrojado por std :: vector.at()

¿Cómo puedo saber dónde se produjo la excepción?

Respuesta

5

¿Lo ayudaría catchpoints? Puede romper cada vez que se lanza una excepción ingresando el comando catch throw en gdb. En Eclipse, puede hacerlo a través de la consola de gdb. Ver this question.

+0

Votación máxima y gracias! Sí, en este caso particular ayudaron :) Pero para el futuro: ¿puedo filtrar de acuerdo con el tipo de excepción? La biblioteca de terceros usa excepciones al control de flujo ... por lo que recibiría demasiadas notificaciones sobre excepciones lanzadas. – Ali

+0

@ Ali: Lo siento, lo que sé está en el enlace. No tengo ninguna experiencia real con esto. No veo una forma de especificar el tipo de excepción. –

+1

Me gustaría aceptar su respuesta pero, por favor, agregue más información para el público general sobre qué hacer (escriba catch throw en la consola de gdb) y este enlace: http://stackoverflow.com/q/1109922/341970 – Ali

4

Puede poner un punto de interrupción en el constructor para el objeto de excepción. Como esto ocurre antes de que se produzca la excepción, obtiene una gran visibilidad del código de llamada.

+0

¡Voto ascendente y gracias! No puedo filtrar las excepciones con la solución de captura de gdb, sin embargo, poner un punto de interrupción donde se arroja out_of_range resuelve bastante el problema. – Ali

Cuestiones relacionadas