如何安装DebugBreak处理程序?

时间:2017-05-27 05:51:08

标签: c++ windows assert debugbreak

我们正在为Visual Studio解决方案设置Appveyor,该解决方案可生成C ++库。我们的一些测试[哑]模糊C ++对象,以确保他们不会做出意想不到的事情。在调试版本下,它会导致一个断言触发(在发布版本中它会抛出)。

我们使用自定义断言来避免Posix崩溃正在调试的程序的行为。如下所示。如果断言触发并且未附加调试器,则Appveyor或操作系统似乎会终止该程序:

enter image description here

如果调试器不存在,我们想安装DebugBreak处理程序。这应该确认其操作系统正在进行查杀。理想情况下,处理程序将从Windows XP开始,VS2002及更高版本(这些是我们支持的Windows组合)。

我们如何在Windows平台上安装DebugBreak处理程序?

#  define MYLIB_ASSERT(exp) {                                     \
    if (!(exp)) {                                                 \
      std::ostringstream oss;                                     \
      oss << "Assertion failed: " << (char*)(__FILE__) << "("     \
          << (int)(__LINE__) << "): " << (char*)(__FUNCTION__)    \
          << std::endl;                                           \
      std::cerr << oss.str();                                     \
      __debugbreak();                                             \
    }                                                             \
}

我们无法确定谁对此负责,因为MSDN上DebugBreak and __debugbreakC/C++ Assertions未记录此行为。

2 个答案:

答案 0 :(得分:2)

有几种不同的方法可以解决这个问题。

从启动可能调用DebugBreak()的进程开始,您可以使用WaitForDebugEvent(或WaitForDebugEventEx)和ContinueDebugEvent来处理来自子进程的调试事件。即,父作为调试器,子作为调试对象,类似于Visual Studio(以及许多其他)调试器的工作方式。

您还可以使用DebugActiveProcess附加到正在运行的流程。在连接之后,大多数调试类似于父调试其子进程。

如果您不能(或不想)执行其中任何一项,您可以安装事后调试器。您可以通过在注册表中指定调试器来完成此操作,如on MSDN所述。 Windows有一个“Windows错误报告”(WER),它调用指定的事后调试器。

答案 1 :(得分:1)

  

如果调试器不存在,我们想安装DebugBreak处理程序。

您需要安装常用的Windows异常处理程序,方法是使用__try / __exceptAddVectoredExceptionHandlerSetUnhandledExceptionFilter

在您的应用中执行int 3指令时(通过调用__debugbreakDebugBreak) - 并且调试器不存在或不处理此问题 - 将使用异常代码{调用异常处理程序{1}}。