【问题标题】:Shutdown exception handling for Win32/C++Win32/C++的关机异常处理
【发布时间】:2009-11-25 16:43:50
【问题描述】:

我有一个可以很好地处理异常的进程。它调用:

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

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

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

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

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

感谢您的任何想法。

【问题讨论】:

    标签: debugging winapi exception-handling crash application-shutdown


    【解决方案1】:

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

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

    ::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

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

    【讨论】:

    • 这正是我所追求的 :)
    • 这真的有效吗?他在上面描述的对话框听起来像 CRT 对话框,但您使用的是 Win32 API 调用
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 有趣的想法。我在启动时遇到了一些关于 STL 对象的问题,所以关闭是有道理的......
      猜你喜欢
      • 2011-01-29
      • 2011-03-12
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 2019-11-01
      • 1970-01-01
      相关资源
      最近更新 更多