c++ - 如何防止 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();
}
解决方案
您可以在程序启动时调用_set_abort_behavior
参数_set_abort_behavior(0, _WRITE_ABORT_MESSAGE | _CALL_REPORTFAULT)
来抑制“abort() 已被调用”消息(在调试中,包括调试/重试/忽略按钮)和 Watson 故障转储生成。第一个参数清除两个标志,第二个参数是要设置标志位的掩码。
推荐阅读
- linux - 如何使用 netcat 更改监听规则?
- ios - 错误:无法将类型 '(Data?, URLResponse?, Error?) -> Void' 的值转换为预期的参数类型 '(Data?, URLResponse?, Error?) -> Void'
- android - 使用 onActivityResult() 时应用程序崩溃;之前没有出现这个问题
- r - 编写 R 循环以克服 API 限制
- python - 从以前的 Spyder 控制台恢复输出
- java - 将多个坐标从 Firebase 添加到 ArrayList 并创建折线
- vue.js - 将非空变量分配给 v-model 时复选框自动选中所有
- c++ - 如何在两个 boost::intrusive::slist 对象之间传输节点
- php - 使用 Ajax 方法通过 Kartik FileInput Yii2 小部件成功上传后更新图像时图像为空
- android - 如何在不触发 onTabSelectedListener 的情况下设置 tablayout 位置?