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

问题描述 投票:1回答:1

我想用throwdebug-break替换任何标准的错误对话框(标准我指的是我没有明确写的任何内容)因为在描述的原因部分中,它会导致Windows服务的调试有时是不可能的。

要做到这一点,我确实尝试定义类似的东西:

-D "_HAS_ITERATOR_DEBUGGING=0"

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

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

原因:

在开发Windows服务时,我遇到了一些导致服务器崩溃的错误:

  • Off-by-one使用中有一个std::unordered_map错误
  • 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
}
c++ visual-c++ error-handling dump
1个回答
2
投票

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

_CrtSetReportMode也有助于避免_CrtDbgReport的对话(用于几个检查)。

© www.soinside.com 2019 - 2024. All rights reserved.