c++ - 如何安装 DebugBreak 处理程序?

标签 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 .

最佳答案

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

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

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

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

关于c++ - 如何安装 DebugBreak 处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44213426/

相关文章:

c++ - 运行时错误 : addition of unsigned offset to 0x129000a0 overflowed to 0x12900088

c++ - QMediaPlayer 在 sleep 前不播放

C++ : How to pass a normal c function as hash functor for unordered_map

c++ - 在正则表达式中捕获重复组

windows - 从用户 session 进程打开在服务中创建的 JobObject

c++ - C++ 构建器 XE4 上的 AssertErrorProc

.net - 应用程序在我的机器上运行,并在其他机器上出现奇怪的错误

Java - 在 rt.exec 调用 WinXP 32 位的 C++ 程序后,应用程序随机挂起

python - 属性(property)似乎没有以正确的方式运作

exception-handling - 为什么使用断言而不是异常抛出?