【问题标题】:How to prevent Windows from presenting dialog with "Debug Error! abort() has been called"?如何防止 Windows 显示“调试错误!中止()已被调用”对话框?
【发布时间】:2019-10-10 09:46:27
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你试过std::quick_exit吗?
  • @FrançoisAndrieux 我不知道该功能存在。这正是我一直在寻找的!我会接受这个答案,或者如果你太忙我可以发布它?

标签: c++ windows error-handling


【解决方案1】:

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

【讨论】:

  • 我相信你的意思是_WRITE_ABORT_MSG,而不是_WRITE_ABORT_MESSAGE,否则这正是我想要的!唯一需要的标头是stdlib.h
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 2015-08-20
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多