c++ - 如何防止Windows显示 "Debug Error! abort() has been called"对话框?

标签 c++ windows error-handling

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

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

Error Dialog

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

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

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

最佳答案

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

关于c++ - 如何防止Windows显示 "Debug Error! abort() has been called"对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56281643/

相关文章:

windows - 通过指定目录删除文件

python-3.x - 如何使用子进程管道进行错误处理

c++ - 在 Eclipse C++ 中无法识别 protected 成员

c++ - 在 C++ 中将未命名的临时变量括起来

c++ - 计算存在的 shared_ptr 数

python - 使用 cx_Freeze 卡住的 Python 应用程序启动速度非常慢

c++ - 具有引用类成员的赋值运算符

c++ - boost::thread 导致小事件句柄泄漏?

javascript - 我应该如何测试可观察对象抛出错误?

r - 使用 tryCatch 在 R 中加载数据文件