15

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

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

4

3 回答 3

18

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

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

于 2008-10-22T01:38:42.537 回答
12

请参阅此处对“纯虚函数调用”崩溃从何而来的问题的答案?.

为了帮助调试这些类型的问题,您可以在各种版本的 MSVC 中替换运行时库的 purecall 处理程序。您可以通过使用此签名提供您自己的函数来做到这一点:

int __cdecl _purecall(void)

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

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

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

于 2008-10-22T01:38:41.337 回答
-2

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

于 2008-10-22T01:40:16.933 回答