是否可以用调试中断或错误抛出替换所有标准错误对话框?
Is replacing all standard error-dialogs with debug-breaks or error-throws possible?
我想用 throw
或 debug-break
替换任何标准错误对话框(对于标准,我指的是我未明确编写的任何内容) 因为就像在原因部分描述的那样,它会导致 Windows-Service 有时无法调试。
为了做到这一点,我确实尝试定义如下内容:
-D "_HAS_ITERATOR_DEBUGGING=0"
但上面确实只是禁用了错误对话框并且确实不足以追踪问题,所以我希望它 throw-exception
或 debug-break
而不是显示错误对话框.
你还有什么建议我定义或做的吗?
原因:
在开发 Windows-服务时,我费了好大劲才找到导致服务器崩溃的错误:
std::unordered_map
用法中存在 Off-by-one 错误
- 应用程序的 crash-dump 功能被
std::unordered_map
阻止,它试图显示错误消息框(因为在调试模式下编译)
- 但是程序确实在没有给出任何反馈的情况下崩溃了,主要是因为 windows-服务不允许显示任何错误对话框(除了使用“WTSSendMessage(...)” )
- 即使附加了调试器,仍然没有...
- 仅使用
git
历史记录并重新检查所有最近的更改才有可能找到问题
复制:
通过下面的 运行 服务(在调试模式下编译)您可以重现此问题:
#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
的对话(用于多次检查)。
我想用 throw
或 debug-break
替换任何标准错误对话框(对于标准,我指的是我未明确编写的任何内容) 因为就像在原因部分描述的那样,它会导致 Windows-Service 有时无法调试。
为了做到这一点,我确实尝试定义如下内容:
-D "_HAS_ITERATOR_DEBUGGING=0"
但上面确实只是禁用了错误对话框并且确实不足以追踪问题,所以我希望它 throw-exception
或 debug-break
而不是显示错误对话框.
你还有什么建议我定义或做的吗?
原因:
在开发 Windows-服务时,我费了好大劲才找到导致服务器崩溃的错误:
std::unordered_map
用法中存在 Off-by-one 错误- 应用程序的 crash-dump 功能被
std::unordered_map
阻止,它试图显示错误消息框(因为在调试模式下编译) - 但是程序确实在没有给出任何反馈的情况下崩溃了,主要是因为 windows-服务不允许显示任何错误对话框(除了使用“WTSSendMessage(...)” )
- 即使附加了调试器,仍然没有...
- 仅使用
git
历史记录并重新检查所有最近的更改才有可能找到问题
复制:
通过下面的 运行 服务(在调试模式下编译)您可以重现此问题:
#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
的对话(用于多次检查)。