捕获R6025纯虚拟呼叫

时间:2008-10-22 01:29:54

标签: c++ windows minidump dbghelp

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

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

3 个答案:

答案 0 :(得分: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();
} 

在你的主要内容中:

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

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

答案 1 :(得分:12)

请参阅问题this answer herewhere do “pure virtual function call” crashes come from?

  

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

int __cdecl _purecall(void)
  

和   在链接运行时之前链接它   图书馆。这让你可以控制   当一个纯粹的电话是什么时会发生什么   检测。一旦你控制了你   可以做一些比这更有用的事情   标准处理程序我有一个处理程序   可以提供堆栈跟踪   纯粹的呼唤发生在哪里;看这里:   http://www.lenholgate.com/archives/000623.html   了解更多详情。

     

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

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

答案 2 :(得分:-2)

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