c++ windows minidump dbghelp

c++ - Captura de llamada virtual pura R6025



windows minidump (3)

Consulte esta respuesta aquí a la pregunta ¿de dónde provienen los bloqueos de "llamadas a funciones virtuales puras"? .

Para ayudar con la depuración de este tipo de problemas, puede, en diversas versiones de MSVC, reemplazar el controlador purecall de la biblioteca de tiempo de ejecución. Usted hace esto al proporcionar su propia función con esta firma:

int __cdecl _purecall(void)

y vincularlo antes de vincular la biblioteca de tiempo de ejecución. Esto le da a USTED 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 rastro de pila de donde ocurrió el llamado puro; mira aquí: http://www.lenholgate.com/archives/000623.html para más detalles.

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

Entonces, en su controlador purecall, haga su minivolcado.

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

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


Intenta 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 error es que la definición debe estar fuera de la declaración ( virtual void bla() = 0 { } no es válido).


Si quieres atrapar todos los bloqueos, tienes que hacer algo más que simplemente: SetUnhandledExceptionFilter

También establecería el controlador de interrupción, el manejador purecall, el manejador de parámetros inesperado, terminan y 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 tu principal pon 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 enviará todos los bloqueos a su controlador de excepción no controlada.