2008-10-22 9 views
14

Actualmente capturo MiniDumps de excepciones no controladas usando SetUnhandledExceptionFilter, pero a veces obtengo "R6025: función virtual pura".Captura de llamada virtual pura R6025

Entiendo cómo ocurre una llamada de función virtual pura Me pregunto si es posible capturarlos para poder crear una MiniDump en ese momento.

Respuesta

15

Si se desea capturar todos los accidentes que tienen que hacer algo más que: SetUnhandledExceptionFilter

También me gustaría establecer el manejador de interrupción, el manejador purecall, inesperada, terminar, y el manejador de parámetros no válido.

#include <signal.h> 

inline void signal_handler(int) 
{ 
    terminator(); 
} 

inline void terminator() 
{ 
    int*z = 0; *z=13; 
} 

inline void __cdecl invalid_parameter_handler(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t) 
{ 
    terminator(); 
} 

Y en su puesto principal de esto:

signal(SIGABRT, signal_handler); 
_set_abort_behavior(0, _WRITE_ABORT_MSG|_CALL_REPORTFAULT); 

set_terminate(&terminator); 
set_unexpected(&terminator); 
_set_purecall_handler(&terminator); 
_set_invalid_parameter_handler(&invalid_parameter_handler); 

Lo anterior le enviará todos los accidentes a su manejador de excepción no controlada.

11

Consulte this answer here a la pregunta where do “pure virtual function call” crashes come from?.

para facilitar la depuración de este tipo de problemas puede , en varias versiones de MSVC, reemplace manejador purecall de la biblioteca de tiempo de ejecución. Para ello, proporcionar su propia función con este firma:

int __cdecl _purecall(void) 

y vinculándolo antes de vincular el tiempo de ejecución biblioteca. Esto le da a usted el control de lo que sucede cuando se detecta una llamada pura . Una vez que tenga el control, puede hacer algo más útil que el controlador estándar . Tengo un controlador que puede proporcionar un seguimiento de pila de donde ocurrió el llamado puro; vea aquí: http://www.lenholgate.com/archives/000623.html para más detalles.

(Tenga en cuenta que también puede llamar al _set_purecall_handler() para instalar su controlador en algunas versiones de MSVC).

Por lo tanto, en su controlador purecall, haga su minivolcado.

-1

Intente definir el virtual puro ofensivo. No hay nada en las reglas de C++ que le prohíba definir una virtual pura, y puede usar esto por varias razones, la menor de las cuales es obtener una traza inversa en la llamada. El único caviat es la definición debe estar fuera de la declaración (virtual void bla() = 0 { } no es válido).

Cuestiones relacionadas