1

我有一个处理异常很好的进程。它调用:Win32/C++的关闭异常处理

_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”处的内存。内存不能被“读取”。单击确定以终止......”

x000000004的内存引用看起来像它可能是一个空指针,而且看那个地址出现是一个全球性的STL对象的析构函数(可能在CRT的initterm调用其中的全局被清理)。

现在我有点卡住,虽然,因为我不能得到诊断转储和调用堆栈,看看到底是怎么回事。所以....

为什么ISN” t异常是通过上述处理程序发送的,而不是向用户显示?

有什么方法可以隐藏该对话框(因为此时没有损害)?

有没有一种方法来追踪根错误?

感谢您的任何想法。

回答

2

他们运行什么操作系统?

我假设你设置使用类似

::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

,以确保Windows不与自己的错误处理跳跃在错误模式?

+0

这正是我所追求的:) – DougN 2009-11-27 14:04:18

+0

这实际上工作吗?他上面描述的对话框听起来像是一个CRT对话框,但您正在使用Win32 API调用 – 2009-11-28 02:13:38

1

这听起来像CRT已经把一段SEH try/catch块(不能正确写入,Markdown踢)围绕某段代码,并捕获异常来显示消息,所以你永远不会结束调用未处理的异常代码路径。你可能需要做一些CRT黑客来弄清楚发生了什么。

1

这可能是STL代码在程序关闭时全局变量被破坏期间执行的,也许(取决于您使用的STL版本)它需要的一些全局变量已经被销毁。

我已经看到这与VS2008的STL。有些STL锁对象是在启动时通过文件级静态创建的。

你在错误处理函数中使用STL吗?这可能是其中的一个在程序关闭后期关闭并导致问题。

+0

有趣的想法。我在启动时遇到了STL对象的一些问题,所以关机很有意义... – DougN 2009-11-27 14:04:53