2017-05-27 43 views
2

我们正在为我们的Visual Studio解决方案设置Appveyor,该解决方案生成一个C++库。我们的一些测试[愚蠢]模糊C++对象,以确保它们不会做出意想不到的事情。在调试版本下,它会导致触发一个断言(并且在发布版本中它只是抛出)。如何安装DebugBreak处理程序?

我们使用自定义断言来避免正在调试的程序崩溃的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记录。

+0

'DebugBreak处理程序' - 存在一般异常处理程序,您必须安装它。没有特殊的'DebugBreak处理程序' – RbMm

回答

2

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

从一个启动可能调用DebugBreak()的一个过程中,你可以使用WaitForDebugEvent(或WaitForDebugEventEx)和ContinueDebugEvent处理从孩子调试事件。也就是说,父级充当调试器,而子级充当调试对象,类似于Visual Studio(在其他许多调试器中)的工作方式。

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

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

+0

谢谢杰里。它需要几天的时间来尝试并完全测试它。我将把John Robbin的调试书中的灰尘甩掉...... – jww

+0

我认为* [父调试器通常可以分开](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679301 (v = vs.85).aspx)通过调用DebugActiveProcessStop。但我不确定可能存在什么警告。 –

+0

调试器可以分离。这是100% – RbMm

相关问题