捕获R6025纯虚拟呼叫

Capturing R6025 pure virtual call

本文关键字:呼叫 虚拟 R6025 捕获      更新时间:2023-10-16

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

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

如果你想捕捉所有崩溃,你必须做的不仅仅是: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();
} 

在你的主要内容中:

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

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

关于"纯虚拟函数调用"崩溃从何而来的问题,请参阅此处的答案?。

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

int __cdecl _purecall(void)

以及在链接运行库之前进行链接图书馆这让您可以控制当一个purecall检测到。一旦你控制住了你可以做一些比标准处理程序。我有个搬运工可以提供的堆栈跟踪purecall发生在哪里;请参见此处:http://www.lenholgate.com/archives/000623.html了解更多详细信息。

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

因此,在您的purecall处理程序中,制作您的小型转储。

尝试定义有问题的纯虚拟。C++规则中没有任何内容禁止您定义纯虚拟,您可以出于多种原因使用它,其中最不重要的是在调用中获得回溯。唯一的问题是定义必须在声明之外(virtual void bla() = 0 { }无效)。