2

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

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

在此处输入图像描述

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

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


#  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 和 __debugbreakC/C++ Assertions没有记录该行为。

4

2 回答 2

2

有几种不同的方法来处理这个问题。

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

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

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

于 2017-05-27T06:39:23.017 回答
1

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

您需要使用__try / __except或 byAddVectoredExceptionHandler或 by安装常用的 Windows 异常处理程序SetUnhandledExceptionFilter

int 3在您的应用程序中执行指令时(通过调用__debugbreakor DebugBreak)-并且调试器不存在或不处理此-您的异常处理程序将使用异常代码调用STATUS_BREAKPOINT

于 2017-05-27T11:09:55.570 回答