1

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

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

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

谢谢!

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

4

3 回答 3

2

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

于 2008-10-03T10:06:42.153 回答
1

从 MSDN 关于 ASSERT 宏:

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

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

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

于 2008-10-02T17:29:35.600 回答
0

在单元测试上下文中,将 ASSERT(实际上是_CrtDbgReport调用)转换为包含一些信息文本的异常通常是好的,通常是 std::exception。这往往会以失败的形式出现在单元测试的输出日志中。这正是你想要的:失败的 ASSERT 应该是失败的单元测试。

通过投入您的报告挂钩函数来做到这一点,如使用指定的那样:_CrtSetReportHook()

于 2010-03-18T11:38:01.827 回答