Я создаю дочерние процессы с помощью функции CreateProcess в MSVC ++ 2010, а до этого устанавливаю уровень ошибки с помощью 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 к коду дочерней программы, но это не вариант для меня.
Есть ли способ превзойти это диалоговое окно ошибки утверждения для программ, скомпилированных в конфигурации отладки?
Общий способ — запустить процесс как отладчик или создать простой отладчик, который всегда игнорирует необработанные исключения. Может даже существующий отладчик, который уже делает это, я просто не знаю ни одного.
Пара приятных вещей об этом подходе:
Было бы сложнее, если бы вам нужно было сделать это для всего дерева подпроцесса, или если вы хотите сделать любое приложение «тихим» без окон сообщений или ввода данных пользователем.
Обратите внимание, что эти диалоговые окна подтверждения отладки обычно включены только в отладочных сборках. Для производства они не должны появляться вообще.
Других решений пока нет …