我正在使用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配置中编译的程序,有没有办法超越这个断言错误对话框?
答案 0 :(得分:0)
一般的方法是将该过程作为debugee启动,或者创建一个总是忽略未处理异常的简单调试器。甚至可能有一个已经存在的调试器,我只是不知道它。
关于这种方法的好事:
当您需要为整个子流程树执行此操作时,或者如果您想使任何应用程序“无声”而没有消息框或用户输入,这将变得更加棘手。
请注意,这些调试断言对话框窗口通常仅在调试版本上启用。对于生产,他们根本不应该出现。