捕获R6025纯虚拟通话

我目前使用SetUnhandledExceptionFilter捕获未处理exception的MiniDump,但有时我得到“R6025:纯虚函数”。

我明白如何纯虚函数调用发生我只是想知道是否有可能捕获它们,所以我可以在那一刻创build一个MiniDump。

Solutions Collecting From Web of "捕获R6025纯虚拟通话"

如果你想捕获所有的崩溃,你必须做的不仅仅是:SetUnhandledExceptionFilter

我也将设置中止处理程序,纯调用处理程序,意外,终止和无效的参数处理程序。

 #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(); } 

在你的主要把这个:

  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 ); 

以上将发送所有崩溃到您的未处理的异常处理程序。

在这里看到这个答案的问题,“纯虚函数调用”崩溃从哪里来的?

为了帮助调试这些类型的问题,您可以在各种版本的MSVC中替换运行时库的purecall处理程序。 你通过提供你自己的功能来完成这个签名:

 int __cdecl _purecall(void) 

并在链接运行时库之前进行链接。 这使您能够控制在检测到纯呼叫时发生的情况。 一旦你有了控制权,你可以做一些比标准处理程序更有用的东西。 我有一个处理程序,可以提供purecall发生的地方的堆栈跟踪; 请参阅http://www.lenholgate.com/archives/000623.html了解更多详情&#x3002;

(注意你也可以调用_set_purecall_handler()来在一些MSVC版本中安装你的处理程序)。

所以,在你的purecall处理程序中,使你的小型转储。

尝试定义违规的纯虚拟。 C ++规则中没有任何内容禁止你定义一个纯虚拟的,你可以使用它的原因有很多,其中最少的就是回调函数。 唯一的caviat是定义必须在声明之外( virtual void bla() = 0 { }无效)。