阻止MSVC ++调试错误阻止当前进程?

时间:2020-03-06 15:02:17  来源:igfitidea点击:

Windows上任何失败的ASSERT语句都会导致显示以下调试消息,并冻结应用程序的执行。我意识到这是预期的行为,但是它在无头计算机上定期运行,因此可以防止单元测试失败,而可以无限期地等待用户输入。

是否可以使用注册表项或者编译器标志阻止此消息框请求用户输入,同时仍允许在ASSERT下测试失败?

基本上,我想做到这一点而无需修改任何代码,而只是更改编译器或者Windows选项。

谢谢!

Microsoft Visual C ++调试库ASSERT http://img519.imageshack.us/img519/853/snapshotbu1.png

解决方案

从MSDN关于ASSERT宏:

在MFC ISAPI应用程序中,在调试模式下的断言将弹出一个模式对话框(默认情况下,ASSERT对话框现在是模式对话框)。这将中断或者挂起执行。若要取消模式断言对话框,请在项目源文件(projectname.cpp)中添加以下几行:

// For custom assert and trace handling with WebDbg
#ifdef _DEBUG
CDebugReportHook g_ReportHook;
#endif

完成此操作后,可以使用WebDbg工具(WebDbg.exe)查看声明。

我认为这是_CrtDbgReport显示的用于_CRT_ASSERT类型报告的对话框。使用_CrtSetReportHook,可以为整个应用程序定制该行为。 (即要求进行一次本地更改)尤其是,我们可以在断言失败后继续执行,因此可以忽略它。

在单元测试的上下文中,将ASSERT(实际上是_CrtDbgReport调用)转换为某些异常(通常是std :: exception,其中包含一些信息文本)通常是很好的。
这往往会失败,从而无法进入单元测试的输出日志。
这就是我们想要的:失败的ASSERT应该是失败的单元测试。

通过使用_CrtSetReportHook()指定的报告挂钩函数来做到这一点。