捕获R6025纯虚拟呼叫
Capturing R6025 pure virtual call
我目前使用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 { }
无效)。
相关文章:
- 虚拟决赛作为安全
- 呼叫运营商<<临时
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 如何在C++中获得"静态纯虚拟"功能?
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 大小虚拟继承中的派生类
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 使用 C++ 和 i2c 工具从虚拟 i2c 写入和读取
- 我是否错过了什么,或者虚拟呼叫的性能并不像人们所说的那样糟糕
- 确定LLVM中的虚拟呼叫站点
- 线程中的虚拟呼叫忽略派生类
- 删除虚拟呼叫
- 当我知道类型时,如何避免虚拟呼叫
- std::使用虚拟呼叫操作员转换抛出"global functions do not have 'this' pointers"
- 需要澄清C++虚拟呼叫的实施
- 捕获R6025纯虚拟呼叫