我们有一些已知会不时崩溃的代码,使资源处于无效状态。我正在编写测试,旨在确保我们拥有的清理代码能够可靠地确定资源是否无效,如果是,则重置它们。据我所知,没有办法在不实际使程序崩溃的情况下模拟这些资源的状态,因为我们无法控制的类的析构函数会关闭它们。
因此,我的测试生成一个子进程,该进程获取资源并调用 std::abort
。这一切似乎都运行良好,并且测试正在 Linux 和 macOS 上通过。但是,Windows 上不断弹出以下对话框:
我可以通过在 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/