0

我在 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
    }
    }
}

在发布配置中它工作正常,但在调试中 - 它会导致断言错误对话框。当然,我可以将_set_abort_behavior添加到子程序代码中,但这不是我的选择。

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

4

1 回答 1

0

一种通用的方法是将进程作为被调试者启动,或者创建一个始终忽略未处理异常的简单调试器。甚至可能已经有一个现有的调试器可以做到这一点,我只是不知道有一个。

关于这种方法的几个好处:

  1. 包含所有这些行为很容易;它不会对调用者施加太多影响
  2. 它使您有机会自己记录未处理的异常信息,例如自动和静默保存小型转储。
  3. 我相信这些断言对话框窗口只在应用程序没有被调试时出现。这意味着调试器方法也是专门处理这些问题的一种方法。我相信如果你只是恢复被调试者,它可能会弹出对话框。我不确定你会如何处理它;这只是正常的程序继续。也许您可以在调试中断时调整寄存器以绕过它。

但是,当您需要为整个子流程树执行此操作时,或者如果您想让任何应用程序“静默”且没有消息框或用户输入时,它会变得更加棘手。

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

于 2012-10-16T15:27:56.617 回答