2009-12-12 14 views
6

La situación es la siguiente: El subproceso A capta una excepción, guarda los datos de la excepción en algún lugar de la memoria (usando GetExceptionInformation en el filtro de excepción) y los posteriores el subproceso B obtiene esa información de excepción y desea volver a lanzarla. Pero la cuestión es que cuando el hilo B vuelve a lanzar la excepción detectada, me falta la pila de llamadas original que condujo a la excepción.
¿Cómo puedo volver a lanzar la excepción sin perder la pila de llamadas original? (tenga en cuenta que esta pregunta es sobre C++).¿Cómo volver a lanzar una excepción sin perder la pila de llamadas original?

+0

Solo quería asegurarme de que no obtuve las respuestas que son específicas para C#, por ejemplo :) –

+1

Algunas de las soluciones son definitivamente específicas del lenguaje/plataforma. Las excepciones de C++ y C# difieren, y las excepciones de C++ se implementan de manera diferente en diferentes plataformas. –

+0

Se describe una buena solución en este [subproceso de desbordamiento de pila] (http://stackoverflow.com/questions/23820633/gdb-prevent-losing-backtrace-in-a-catch-rethrow-situation) –

Respuesta

2

Puede desenrollar la pila en el bloque catch y guardarla como parte de la excepción que está volviendo a lanzar. El desenrollado de la pila en C++ es un poco complicado, pero se puede echar un vistazo al código del colector crashdump que viene con WxWidgets para ver un ejemplo.

+0

marcado como respuesta, aunque no del todo práctico en mi caso –

0

La pregunta es por qué necesitarías pasar la pila al hilo "recibir".

Supongo que necesita la pila para básicamente informarla a algún registro de errores. Puede caminar la pila en el hilo de captura, o producir un mini volcado, o cualquier información de error que desee recopilar, y luego simplemente pasar una copia de la excepción (si es posible, tenga cuidado con cortar) al hilo de recepción.

+0

la excepción que atrapé dentro de una especie de rutina de tenedor-unión. así que si se lanza una excepción en algún hilo de trabajo, me gustaría pasarlo al hilo principal y volver a lanzarlo ahí (+ no quiero perder el montón original) –

Cuestiones relacionadas