C++ 捕获R6025纯虚拟呼叫

C++ 捕获R6025纯虚拟呼叫,c++,windows,minidump,dbghelp,C++,Windows,Minidump,Dbghelp,目前,我使用SetUnhandledExceptionFilter捕获未处理异常的小转储,但有时我会得到“R6025:纯虚拟函数” 我了解纯虚拟函数调用是如何发生的,我只是想知道是否有可能捕获它们,这样我就可以在那时创建一个小型转储。看看这个问题 帮助调试这些类型的 您可以在不同版本中解决问题 替换运行库的 pureCallHandler。你是靠我来做这件事的 提供您自己的功能 签名: 及 在链接运行时之前先链接它 图书馆。这使您可以控制 当purecall被调用时会发生什么 检测。一旦你控制了

目前,我使用SetUnhandledExceptionFilter捕获未处理异常的小转储,但有时我会得到“R6025:纯虚拟函数”

我了解纯虚拟函数调用是如何发生的,我只是想知道是否有可能捕获它们,这样我就可以在那时创建一个小型转储。

看看这个问题

帮助调试这些类型的 您可以在不同版本中解决问题 替换运行库的 pureCallHandler。你是靠我来做这件事的 提供您自己的功能 签名:

及 在链接运行时之前先链接它 图书馆。这使您可以控制 当purecall被调用时会发生什么 检测。一旦你控制了你 可以做一些比 标准处理程序。我有一个训练员 它可以提供一个堆栈跟踪 purecall发生的地方;请看这里: 更多细节

(注意,您也可以致电
\u set\u purecall\u handler()
在某些版本的中安装处理程序 MSVC)


因此,在purecall处理程序中,进行小型转储。

如果您想捕获所有崩溃,您需要做的不仅仅是: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();
} 

上述操作会将所有崩溃发送到未经处理的异常处理程序

尝试定义有问题的纯虚拟。C++规则中没有任何东西禁止你定义纯虚的,你可以使用这个原因有很多,其中至少一个是在调用中得到回溯。唯一需要说明的是定义必须在声明之外(
virtualvoidbla()=0{}
无效)

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