我们正在设置Visual解决方案的附录,该解决方案生成一个C++库。我们的一些测试都是愚蠢的、模糊的C++对象,以确保它们不会做一些意想不到的事情。在调试构建下,它会引发断言(在发布版本中,它只是抛出)。
我们使用自定义断言来避免Posix崩溃程序被调试的行为。如下所示。如果assert触发并没有附加调试器,则Appveyor或操作系统似乎会杀死程序:

如果没有调试器,我们希望安装一个DebugBreak处理程序。这应该可以确认是操作系统在杀人。理想情况下,处理程序将从Windows和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(); \
} \
}发布于 2017-05-27 06:39:23
有几种不同的方法来处理这个问题。
从启动可能调用DebugBreak()的进程中,您可以使用WaitForDebugEvent (或WaitForDebugEventEx)和ContinueDebugEvent来处理来自子级的调试事件。例如,父调试器充当调试器,子调试器充当调试器,类似于Visual (以及其他许多调试器)的工作方式。
您还可以使用DebugActiveProcess附加到正在运行的进程。附加之后,大多数调试都类似于父进程调试其子进程。
如果你不能(或者不想)做这两件事,你可以安装一个验尸调试器。要做到这一点,可以在注册表中指定调试器,如论MSDN所述。Windows有一个"Windows错误报告“(WER),它调用指定的验尸调试器。
发布于 2017-05-27 11:09:55
如果没有调试器,我们希望安装一个DebugBreak处理程序。
您需要使用https://msdn.microsoft.com/en-us/library/swezty51.aspx、AddVectoredExceptionHandler或SetUnhandledExceptionFilter安装常用的windows异常处理程序。
当在应用程序中执行int 3指令时(通过调用__debugbreak或DebugBreak --以及调试器不存在或不处理此操作),将使用异常代码STATUS_BREAKPOINT调用异常处理程序。
https://stackoverflow.com/questions/44213426
复制相似问题