1

Windows上任何失败的ASSERT语句都会导致出现下面的调试消息并冻结应用程序执行。我意识到这是预期的行为,但它在无头机器上定期运行,以防单元测试失败,而无限期地等待用户输入。停止MSVC++调试错误以阻止当前进程?

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

基本上,我想在不修改任何代码的情况下执行此操作,只需更改编译器或Windows选项即可。

谢谢!

Microsoft Visual C++ Debug Library ASSERT http://img519.imageshack.us/img519/853/snapshotbu1.png

回答

1

从MSDN有关断言宏:

在MFC ISAPI应用程序,在调试模式下断言会弹出一个模式对话框(ASSERT对话框现在默认模态);这会中断或挂起执行。为了抑制模态对话框断言,以下行添加到您的项目源文件(projectname.cpp):

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

一旦你做到了这一点,你可以使用WebDbg工具(WebDbg.exe)看断言。

2

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

0

在单元测试环境中,通常很好的做法是将ASSERT(实际上是_CrtDbgReport调用)转换为一些异常,通常是一个std :: exception,它包含一些信息文本。 这往往会导致单元测试的输出日志失败。 这正是你想要的:一个失败的ASSERT应该是一个失败的单元测试。

通过投掷您的举报挂钩功能,如使用:_CrtSetReportHook()