如何禁用“Microsoft Visual C ++调试库”异常对话?

时间:2010-08-05 07:22:44

标签: windows exception-handling

如果我运行一个抛出异常的可执行文件(内置调试),我将收到一个错误对话框,说“Debug assertion failed”,然后是一些有关异常的信息。发生这种情况时,程序的执行暂停,直到我选择“中止”,“重试”或“忽略”选项之一。

问题是,我从脚本运行了很多应用程序,如果其中一个引发了异常,它会暂停我的脚本,直到它被处理完毕。

是否有某种方法可以禁用此异常处理机制?

编辑:我记得前一段时间读过一个注册表项,这会禁止出现错误信息。有人知道吗?

3 个答案:

答案 0 :(得分:4)

如果您可以修改应用程序的源代码,请查看_CrtSetReportMode函数,例如:

_CrtSetReportMode(_CRT_ASSERT, 0);

有关详情,请参阅msdn

答案 1 :(得分:3)

如果可以修改源,则需要修改中止行为(由assert调用)以禁止中止/重试/忽略对话框。

在中止时,仍会产生故障转储(默认情况下),因此您不会丢失重要信息。

此外,您可以调整断言行为以仅写入stderr。如果中止行为足以满足您的需要,则不需要这样做。注意:_Crtxxx调用仅在调试版本(/ Zi)中有效。

禁用中止/重试/忽略的最小更改。取消注释_Crt调用并包含crtdbg.h以修改调试模式构建中的断言行为。

#include <stdlib.h>
//#include <crtdbg.h>
int main(int argc,char **argv);
int main(int argc,char **argv)
{
    // ON assert, write to stderr.
    //_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );
    //_CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );

    // Suppress the abort message
    _set_abort_behavior( 0, _WRITE_ABORT_MSG);

    abort();
    return 0;
}

msdn assert mode

答案 2 :(得分:1)

您可以将可执行文件构建为发布吗?如果我记得,那应该可以阻止出现断言错误。