我想用 throw
或 debug-break
替换任何标准错误对话框(对于标准,我指的是任何未明确说明的内容由我编写)因为就像在原因部分描述的那样,它有时会导致无法调试 Windows 服务。
为了实现这一点,我确实尝试定义如下内容:
-D "_HAS_ITERATOR_DEBUGGING=0"
但上面确实只是禁用了错误对话框并且确实不足以追踪问题,所以我希望它能够 throw-exception
或 debug-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/