我有一个过程,处理异常巨大。它调用:

_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中的错误处理程序的功能呢?这可能是其中之一是在程序关闭后期会关闭,造成问题的原因。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top