关闭异常处理为Win32 / C ++
-
22-09-2019 - |
题
我有一个过程,处理异常巨大。它调用:
_set_se_translator(exception_trans_func);
SetUnhandledExceptionFilter(UnhandledExceptionFilterHandler);
_set_purecall_handler(purecallHandler);
set_terminate(terminateHandler);
set_unexpected(unexpectedHandler);
_set_invalid_parameter_handler(InvalidParameterHandler);
atexit(exitHandler); //ignored during an expected exit
_onexit(onexitHandler); //ignored during an expected exit
任何时间发生异常,则处理程序中的一个被称为这对于我创建故障转储。寿命是好的。
除了在一个客户站点。当他们关闭过程中,有没有通过这些调用由于某种原因路由异常,他们得到了错误:
在“0x101ba9df”指令在“0x00000004”引用的内存。该内存不能为“read”。单击确定以终止......“
的x000000004看起来它的内存引用可能是一个空指针。而综观该地址的出现的是一个全球性的STL对象的析构函数(可能在CRT的initterm调用其中的全局变量清理)。
现在我有点卡住,虽然,因为我不能得到诊断转储和调用堆栈,看看到底是怎么回事。所以....
为什么没有异常正在通过上述处理程序进行路由,并且不是被显示给用户?
有没有什么办法来隐藏对话框(因为没有任何的损害,在这一点上正在做)?
和是否有办法来跟踪根错误?
感谢您的任何观点。
解决方案
是什么操作系统,他们运行?
我假设你设置使用类似的错误模式
::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
要确保Windows不与自己的错误处理跳做什么呢?
其他提示
这听起来像CRT把一个SEH try / catch块(不能写入它正确,降价踢)周围的一些一段代码,并捕捉异常显示该消息,所以你永远最终调用在未处理异常代码路径。您可能需要做一些CRT黑客弄清楚发生了什么。
这可能是全局变量在程序停机时间和可能的破坏时正在执行STL代码(取决于STL,你正在使用的版本),它需要已经被摧毁了一些全局变量。
我和VS2008的STL看到了这一点。有迹象表明,经由文件级静态创建了一些STL锁定对象期间启动。
您使用STL中的错误处理程序的功能呢?这可能是其中之一是在程序关闭后期会关闭,造成问题的原因。