首页 > 解决方案 > 如何防止 Windows 显示“调试错误!中止()已被调用”对话框?

问题描述

我们有一些已知会不时崩溃的代码,使资源处于无效状态。我正在编写测试,旨在确保我们拥有的清理代码能够可靠地确定资源是否无效,如果是,则重置它们。据我所知,没有办法模拟这些资源的状态而不实际使程序崩溃,因为我们控制之外的类的析构函数会关闭它们。

因此,我的测试产生了一个子进程,它获取资源并调用std::abort. 这一切似乎都运行良好,并且测试正在 Linux 和 macOS 上通过。但是,以下对话框在 Windows 上不断弹出:

错误对话框

我可以通过在发布模式下运行测试来避免这种情况,但如果出现问题,我希望能够调试它们。因为我正在生成多个子进程并且时间非常重要,所以对话框会主动妨碍调试。以下是我尝试过的。在调试模式下,如何让中止调用不导致对话框出现?

#include "Windows.h"
#include "errhandlingapi.h"
#include <cstdlib>

int main()
{
  SetErrorMode(SEM_FAILCRITICALERRORS |
               SEM_NOGPFAULTERRORBOX |
               SEM_NOALIGNMENTFAULTEXCEPT);
  std::abort();
}

标签: c++windowserror-handling

解决方案


您可以在程序启动时调用_set_abort_behavior参数_set_abort_behavior(0, _WRITE_ABORT_MESSAGE | _CALL_REPORTFAULT)来抑制“abort() 已被调用”消息(在调试中,包括调试/重试/忽略按钮)和 Watson 故障转储生成。第一个参数清除两个标志,第二个参数是要设置标志位的掩码。


推荐阅读