20

我有一堆以批处理模式运行的单元测试。有时,会因 Visual C++ 库中触发的调试断言而崩溃。这会导致弹出一个对话框,并且单元测试停止运行,直到我单击“确定”关闭对话框。

如何让 C++ 程序在遇到断言时崩溃(就像在 Linux 上一样),而不是弹出烦人的对话框?

注意:我不想禁用断言;只是对话框。

4

3 回答 3

18

查看 _CrtSetReportHook():

http://msdn.microsoft.com/en-us/library/0yysf5e6.aspx

MSDN 将其宣传为应用程序处理 CRT 运行时故障(如断言)的一种稳健方式。大概您可以定义一个转储您的进程的报告挂钩:

崩溃时如何为我的进程创建小型转储?

于 2012-12-19T00:29:44.740 回答
14

此代码将禁用对话框的显示。相反,它将在输出窗口和 stderr 中打印错误。

int main( int argc, char **argv )
{
     if( !IsDebuggerPresent() )
     {
          _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG );
          _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );
     }

     ...
}

_CRT_ERROR如果您Q_ASSERTQt库中使用,则必须申请相同的内容。

于 2015-07-24T12:58:40.480 回答
0

我将合适的钩子的代码(您可以使用 _CrtSetReportHook() 安装)放在:https ://stackoverflow.com/a/28852798/2345997

于 2015-03-16T14:10:22.953 回答