阻止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()
指定的报告挂钩函数来做到这一点。