Как отключить диалог подтверждения ошибки в дочернем процессе

Я создаю дочерние процессы с помощью функции 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 к коду дочерней программы, но это не вариант для меня.

Есть ли способ превзойти это диалоговое окно ошибки утверждения для программ, скомпилированных в конфигурации отладки?

0

Решение

Общий способ — запустить процесс как отладчик или создать простой отладчик, который всегда игнорирует необработанные исключения. Может даже существующий отладчик, который уже делает это, я просто не знаю ни одного.

Пара приятных вещей об этом подходе:

  1. Легко сдержать все это поведение; это не сильно навязывает абоненту
  2. Это дает вам возможность самостоятельно регистрировать необработанную информацию об исключениях, например, автоматически сохраняя мини-дампы.
  3. Я считаю, что эти диалоговые окна утверждения появляются только тогда, когда приложение не отлаживается. Это означает, что подход отладчика также является специфическим способом для вас справиться с этим. Я полагаю, что если вы просто возобновите работу с дебютантом, тогда может появиться диалоговое окно. Я не уверен, как ты справишься с этим; это просто нормальное продолжение программы. Может быть, вы можете отключить регистры на этапе отладки, чтобы обойти его.

Было бы сложнее, если бы вам нужно было сделать это для всего дерева подпроцесса, или если вы хотите сделать любое приложение «тихим» без окон сообщений или ввода данных пользователем.

Обратите внимание, что эти диалоговые окна подтверждения отладки обычно включены только в отладочных сборках. Для производства они не должны появляться вообще.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector