1

我有一个处理异常的过程很好。它调用:

_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 调用中)。

现在我有点卡住了,因为我无法获得诊断转储和调用堆栈并确切地看到发生了什么。所以....

为什么异常没有通过上述处理程序路由,而是显示给用户?

有没有办法隐藏该对话框(因为此时没有造成伤害)?

有没有办法追踪根本错误?

感谢您的任何想法。

4

3 回答 3

2

他们运行的是什么操作系统?

我假设您正在使用类似的东西设置错误模式

::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

以确保 windows 不会跳入自己的错误处理?

于 2009-11-26T15:20:19.067 回答
1

这听起来像是 CRT 在某些代码周围放置了一个 SEH try/catch 块(无法正确编写,Markdown 启动),并且正在捕获异常以显示消息,因此您永远不会最终调用未处理的异常代码路径。您可能需要进行一些 CRT 黑客攻击才能弄清楚发生了什么。

于 2009-11-25T17:02:24.483 回答
1

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

我已经在 VS2008 的 STL 中看到了这一点。有一些 STL 锁定对象是在启动期间通过文件级静态创建的。

您是否在错误处理函数中使用 STL?可能是其中之一在程序关闭后期关闭并导致问题。

于 2009-11-25T21:03:27.067 回答