【发布时间】:2010-09-18 11:00:39
【问题描述】:
我目前使用 SetUnhandledExceptionFilter 捕获未处理异常的 MiniDump,但有时我会收到“R6025:纯虚函数”。
我了解纯虚函数调用是如何发生的,我只是想知道是否可以捕获它们,以便我可以在那时创建一个 MiniDump。
【问题讨论】:
标签: c++ windows minidump dbghelp
我目前使用 SetUnhandledExceptionFilter 捕获未处理异常的 MiniDump,但有时我会收到“R6025:纯虚函数”。
我了解纯虚函数调用是如何发生的,我只是想知道是否可以捕获它们,以便我可以在那时创建一个 MiniDump。
【问题讨论】:
标签: c++ windows minidump dbghelp
请参阅this answer here 问题where do “pure virtual function call” crashes come from?。
帮助调试这些类型的 您可以解决的问题,在各种版本中 MSVC,替换运行时库的 纯调用处理程序。你这样做 用这个提供你自己的功能 签名:
int __cdecl _purecall(void)
和 在链接运行时之前链接它 图书馆。这使您可以控制 纯调用时会发生什么 检测到。一旦你控制了你 可以做一些比 标准处理程序。我有一个处理程序 可以提供堆栈跟踪 purecall 发生在哪里;看这里: http://www.lenholgate.com/archives/000623.html 了解更多详情。
(注意你也可以调用
_set_purecall_handler()在某些版本中安装您的处理程序 MSVC)。
所以,在您的 purecall 处理程序中,创建您的 minidump。
【讨论】:
如果您想捕获所有崩溃,您必须做的不仅仅是: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 );
以上内容会将所有崩溃发送到您的未处理异常处理程序。
【讨论】:
尝试定义有问题的纯虚拟。 C++ 规则中没有任何内容禁止您定义纯虚拟,您可以出于多种原因使用它,其中最少的原因是在调用中获得回溯。唯一需要注意的是定义必须在声明之外(virtual void bla() = 0 { } 无效)。
【讨论】: