捕获R6025纯虚拟呼叫

JPr*_*mer 15 c++ windows minidump dbghelp

我目前使用未处理的异常捕获MiniDumps,__CODE__但有时我得到"R6025:纯虚函数".

我理解一个纯虚函数调用是如何发生的我只是想知道是否有可能捕获它们所以我可以在那时创建一个MiniDump.

Bri*_*ndy 16

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

我还将设置中止处理程序,purecall处理程序,意外,终止和无效参数处理程序.

#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();
} 
Run Code Online (Sandbox Code Playgroud)

在你的主要内容中:

 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 );
Run Code Online (Sandbox Code Playgroud)

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


180*_*ION 12

在这里看到这个答案的问题"纯虚函数调用"崩溃来自何处?.

为了帮助调试这些类型的问题,您可以在各种版本的MSVC中替换运行时库的purecall处理程序.您可以通过使用此签名提供自己的功能来执行此操作:

int __cdecl _purecall(void)
Run Code Online (Sandbox Code Playgroud)

并在链接运行时库之前链接它.这使您可以控制检测到纯调用时发生的情况.一旦掌握了控制权,就可以做一些比标准处理程序更有用的事情.我有一个处理程序,可以提供purecall发生位置的堆栈跟踪; 请参阅:http: //www.lenholgate.com/archives/000623.html 了解更多详情.

(注意,您也可以调用 _set_purecall_handler()在某些版本的MSVC中安装处理程序).

所以,在你的purecall处理程序中,制作你的minidump.