c++ - 是否可以用调试中断或错误抛出替换所有标准错误对话框?

标签 c++ visual-c++ error-handling dump

我想用 throwdebug-break 替换任何标准错误对话框(对于标准,我指的是任何未明确说明的内容由我编写)因为就像在原因部分描述的那样,它有时会导致无法调试 Windows 服务。

为了实现这一点,我确实尝试定义如下内容:

-D "_HAS_ITERATOR_DEBUGGING=0"

但上面确实只是禁用了错误对话框并且确实不足以追踪问题,所以我希望它能够 throw-exceptiondebug-break 而不是显示错误对话框。

还有什么你会建议我定义或做的吗?

原因:

在开发 Windows 服务时,我很难找到导致服务器崩溃的错误:

  • 有一个 Off-by-one std::unordered_map 用法错误
  • 应用程序的 crash-dump std::unordered_map 阻止了此功能,它试图显示一个错误消息框(因为在 Debug模式下编译)
  • 但程序在没有给出任何反馈的情况下确实崩溃了,主要是因为 Windows 服务不允许显示任何错误对话框(除非使用“WTSSendMessage (...)”)
  • 即使附加了调试器,仍然没有...
  • 仅使用 git 历史记录并重新检查所有最近的更改才有可能找到问题

复制:

通过在服务中运行(在 Debug模式下编译),您可以重现此问题:

#include <unordered_map>

// will cause crash by trying to increment iterator pointing to end
inline static void simulateCrash() {
    typedef std::unordered_map<quint32, quint32> Hash;
    Hash list;
    list[0xC001] = 0xDEAD;
    Hash::iterator it = list.begin();
    it = list.erase(it);
    ++it; // should crash here
}

最佳答案

您可能想使用 _set_invalid_parameter_handler覆盖终止程序并显示运行时错误消息的默认处理程序。

_CrtSetReportMode也可用于避免来自 _CrtDbgReport 的对话框(用于多项检查)。

关于c++ - 是否可以用调试中断或错误抛出替换所有标准错误对话框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54903105/

相关文章:

C++无法根据STL容器类型进行流控

c++ - 虚类成员函数的多态/继承问题

c++ - 在巨大的棋盘上解决骑士的巡回赛问题?

c++ - decltype 可以声明一个右值吗?

c++ - 面向组件的系统中的灵活数据消息传递

javascript - 我应该在 GraphQL Scalar 中抛出一般错误吗?

c++ - 使用 clang v3.4 在 ubuntu_x86-64 上为 arm 编译一个 c/c++ 源文件

C++ 错误 : Incompatible types in assignment of ‘char*’ to ‘char [2]

php - 如何覆盖CodeIgniter中未找到的页面?

c++ - 在构造函数只需要前向声明的模板基类中的虚函数中使用前向声明的类?