【问题标题】:How to install a DebugBreak handler?如何安装 DebugBreak 处理程序?
【发布时间】:2017-05-27 05:51:07
【问题描述】:

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

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

如果调试器不存在,我们想安装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 记录。

【问题讨论】:

  • DebugBreak handler - 存在您必须安装的通用异常处理程序。没有特别的DebugBreak handler

标签: c++ windows assert debugbreak


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢杰瑞。我需要几天的时间来尝试并全面测试它。我会把约翰·罗宾的调试书上的灰尘敲掉......
  • 我通过调用 DebugActiveProcessStop 认为 parent debugger can usually detach。但我不确定可能有什么警告。
  • 调试器可以分离。这是 100%
  • @RbMm: 是的——我想这对我来说是正确的,取决于记忆。
【解决方案2】:

如果没有调试器,我们想安装一个 DebugBreak 处理程序。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多