如何在子进程中禁用断言错误对话框

时间:2012-10-16 14:05:57

标签: c++ visual-studio debugging winapi assert

我正在使用MSVC ++ 2010中的CreateProcess函数创建子进程,之前使用SetErrorMode设置错误级别(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);

任务是运行控制台程序并隐藏任何恼人的消息,如着名的“不发送”对话框,防止程序在发生严重错误后正常完成。

所以,如果我创建包含一些错误的子进程(例如除以0)它工作正常,但是当我创建带有向量索引溢出的子进程时,它会导致不可避免的断言错误消息(当然在调试模式下)。以下是该计划的代码:

#include <stdlib.h>
#include <vector>

int main(int argc, char *argv[])
{
    int index = atoi(argv[1]);
    switch(index)
    {
    case 0:
    {
        int k = 3, j = 3;
        j -= k;
        k = k/j;//division by zero
    }
    case 1:
    {
        std::vector<int> k(2);
        int i = k.at(2);//index is out of bounds and it causes assert failure
    }
    }
}

在Release配置中,它工作正常,但在Debug中 - 它会导致断言错误对话框。当然,我可以将_set_abort_behavior添加到子程序代码中,但它不适合我。

对于在Debug配置中编译的程序,有没有办法超越这个断言错误对话框?

1 个答案:

答案 0 :(得分:0)

一般的方法是将该过程作为debugee启动,或者创建一个总是忽略未处理异常的简单调试器。甚至可能有一个已经存在的调试器,我只是不知道它。

关于这种方法的好事:

  1. 包含所有这些行为很容易;它对调用者没有太大的影响
  2. 它让您有机会自己记录未处理的异常信息,例如自动和静默地保存小型转储。
  3. 我相信这些断言对话框窗口仅在未调试应用程序时出现。这意味着调试器方法也是您处理这些方法的一种方式。我相信如果你只是恢复了debugee,它可能会弹出对话框。我不确定你是怎么处理的;这只是正常的程序延续。也许你可以在调试中断时使用寄存器来绕过它。
  4. 当您需要为整个子流程树执行此操作时,或者如果您想使任何应用程序“无声”而没有消息框或用户输入,这将变得更加棘手。

    请注意,这些调试断言对话框窗口通常仅在调试版本上启用。对于生产,他们根本不应该出现。