阻止MSVC ++调试错误阻止当前进程?
-
03-07-2019 - |
题
Windows上任何失败的ASSERT语句都会导致出现以下调试消息并冻结应用程序执行。我意识到这是预期的行为,但是它会在无头机器上定期运行,因此可以防止单元测试失败,而是无限期地等待用户输入。
我是否可以使用注册表项或编译器标志来阻止此消息框请求用户输入,同时仍允许测试在ASSERT下失败?
基本上,我想在不修改任何代码的情况下执行此操作,只需更改编译器或Windows选项。
谢谢!
Microsoft Visual C ++ Debug Library 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应该是一个失败的单元测试。
通过使用以下命令抛出report-hook函数来执行此操作: _CrtSetReportHook()