【发布时间】:2012-12-06 06:58:19
【问题描述】:
我有一堆以批处理模式运行的单元测试。有时,会因 Visual C++ 库中触发的调试断言而崩溃。这会导致弹出一个对话框,并且单元测试停止运行,直到我单击“确定”关闭对话框。
如何让 C++ 程序在遇到断言时直接崩溃(就像在 Linux 上一样),而不是弹出烦人的对话框?
注意:我不想禁用断言;只是对话框。
【问题讨论】:
标签: c++ visual-studio winapi
我有一堆以批处理模式运行的单元测试。有时,会因 Visual C++ 库中触发的调试断言而崩溃。这会导致弹出一个对话框,并且单元测试停止运行,直到我单击“确定”关闭对话框。
如何让 C++ 程序在遇到断言时直接崩溃(就像在 Linux 上一样),而不是弹出烦人的对话框?
注意:我不想禁用断言;只是对话框。
【问题讨论】:
标签: c++ visual-studio winapi
查看 _CrtSetReportHook():
http://msdn.microsoft.com/en-us/library/0yysf5e6.aspx
MSDN 宣称这是应用程序处理 CRT 运行时故障(如断言)的一种稳健方式。大概您可以定义一个转储您的进程的报告挂钩:
【讨论】:
此代码将禁用对话框的显示。相反,它会在输出窗口和标准错误中打印一个错误。
int main( int argc, char **argv )
{
if( !IsDebuggerPresent() )
{
_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG );
_CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );
}
...
}
如果您使用来自Qt 库的Q_ASSERT,则必须为_CRT_ERROR 应用同样的方法。
【讨论】:
我把一个合适的钩子的代码(你可以用 _CrtSetReportHook() 安装)放在:https://stackoverflow.com/a/28852798/2345997
【讨论】: