首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何安装DebugBreak处理程序?

如何安装DebugBreak处理程序?
EN

Stack Overflow用户
提问于 2017-05-27 05:51:07
回答 2查看 718关注 0票数 2

我们正在设置Visual解决方案的附录,该解决方案生成一个C++库。我们的一些测试都是愚蠢的、模糊的C++对象,以确保它们不会做一些意想不到的事情。在调试构建下,它会引发断言(在发布版本中,它只是抛出)。

我们使用自定义断言来避免Posix崩溃程序被调试的行为。如下所示。如果assert触发并没有附加调试器,则Appveyor或操作系统似乎会杀死程序:

如果没有调试器,我们希望安装一个DebugBreak处理程序。这应该可以确认是操作系统在杀人。理想情况下,处理程序将从Windows和VS2002及以上版本开始工作(这些是我们支持的Windows组合)。

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

代码语言:javascript
复制
#  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();                                             \
    }                                                             \
}

我们不能真正判断谁在调试器C/C++断言上负责,因为这种行为并没有记录在MSDN上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-27 06:39:23

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

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

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

如果你不能(或者不想)做这两件事,你可以安装一个验尸调试器。要做到这一点,可以在注册表中指定调试器,如论MSDN所述。Windows有一个"Windows错误报告“(WER),它调用指定的验尸调试器。

票数 2
EN

Stack Overflow用户

发布于 2017-05-27 11:09:55

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

您需要使用https://msdn.microsoft.com/en-us/library/swezty51.aspxAddVectoredExceptionHandlerSetUnhandledExceptionFilter安装常用的windows异常处理程序。

当在应用程序中执行int 3指令时(通过调用__debugbreakDebugBreak --以及调试器不存在或不处理此操作),将使用异常代码STATUS_BREAKPOINT调用异常处理程序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44213426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档