【问题标题】:Prevent Modal Dialog on win32 process crash在win32进程崩溃时防止模态对话框
【发布时间】:2009-12-07 17:27:51
【问题描述】:

我们有一个用于夜间构建的遗留构建基础架构(在 Perl 中实现)来编译、链接和单元测试我们的应用程序/插件。在 Windows 上,如果单元测试过程崩溃,则会弹出一个“锁定”我们的构建农场的模式对话框。

有没有办法(win32 API 调用、系统配置、环境变量等)禁用此行为,让子进程在崩溃时立即终止,而没有模态对话框和非零退出状态?

谢谢,--DD

PS:我们在 Windows 上使用 SEC(结构化异常处理)进行编译,以便能够使用 catch (...) “捕获”崩溃,因此大多数时候都避免了这个问题,但有时这还不够,因为当然有些崩溃是不可恢复的(例如,如果它们破坏了堆栈)。

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    根据谁发出对话,您可能需要结合多种方法。

    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);

    ...将关闭一组对话框。

    【讨论】:

    • 你可以这样组合它们:SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
    • 不仅可以合并,还需要合并;标志不会堆叠,当您设置第二个时,您将失去第一个
    【解决方案2】:

    您需要添加一个“未处理的异常处理程序”来捕获所有异常:在初始化代码中调用 SetUnhandledExceptionFilter(handler),它将调用处理程序例程。真的很简单。

    我使用旧文章中的示例代码,包含一个名为 minidumper 的文件,调用公开的函数,就完成了。

    Here's some more example code,这会弹出一个不同的对话框,但您可以将其更改为简单地将消息写入日志文件或类似文件。

    如果您正在编写纯 .NET 应用程序,那么您会对 this article 更感兴趣。

    【讨论】:

    • Segfaults 不会被异常处理程序捕获。
    • @IanThompson 你是什么意思? Windows 上的段错误?你的意思是那些 0xc000005 '拒绝访问' 错误之一?
    • 是的,任何发出信号而不是抛出异常的东西。例如。类 A { public: int b;} ; A* nu_a = NULL; nu_a->b = 5;会给你:访问冲突写入位置0x00000000。这不是异常,不会被任何异常处理程序捕获。
    • @IanThompson, int* p = NULL; *p = 1; 是普通的段错误。普通 C 中的 signal.h 和 SIGSEGV 信号挂起器会捕捉到这一点,而不会崩溃。 SetUnhandledExceptionFilter() 是 Windows 内核功能,可以捕获所有类型的异常,包括段错误!自己试试吧。
    • 问题不是关于捕获异常或错误,而是关于防止模态对话框。
    【解决方案3】:
    1. 不要使用“catch(...)”语句,因为那样你可能会错过进行单元测试的要点。
    2. 您需要的是一个非模态对话框,因为模态对话框用于阻止用户进行任何进一步的操作,并且程序执行(在您的情况下是单元测试运行)会挂起,直到用户做出他/她的选择。现在无法避免崩溃对话框,但您需要了解您的单元测试框架如何处理这些情况。我会说你错过了单元测试框架的一些内容,因为如果我的应用程序崩溃了,我只会从 Boost.Test 存根中收到一条关于该问题的日志消息。

    如果您将单元测试作为子进程运行,它不应该阻止您的构建机器人,但是:如果单元测试用例失败,我认为您不应该继续构建过程。

    【讨论】:

      【解决方案4】:

      您可以使用WSH 为您的窗口“编写脚本”。

      有了它,你可以“模拟”有人点击了模态窗口的“接受”按钮,或者发送 ESC 键来关闭它。

      问候。

      【讨论】:

        【解决方案5】:

        我仍然使用一个名为RTVReco 的旧程序。它只是一个按钮推送应用程序,非常易于使用。好久没更新了,不过还是我见过最简单的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-30
          • 1970-01-01
          • 1970-01-01
          • 2013-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多