Подтвердить что ты не робот

Как справиться с сбоем в процессе, запущенном через System.Diagnostics.Process?

Я запускаю внешний процесс с помощью System.Diagnostics.Process. Это часть пакетного задания, поэтому, если один из процессов завершится с ошибкой, я бы хотел обработать его и оставить остальные.

В настоящее время Windows вызывает диалоговое окно, в котором сообщается, что программа потерпела крах, и только один раз, когда я отклонил это вручную, процесс завершился.

В соответствии с этим вопросом свойство Process.Responding доступно только для программ с пользовательскими интерфейсами (процесс, который я запускаю, представляет собой консольное приложение).

Я также рассмотрел различные события, которые предоставляет процесс, но ни один из них не запускается при сбое.

Любые идеи?

4b9b3361

Ответ 1

Попробуйте установить для реестра значение реестра для значения DWORD 2:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode = 2

Это повлияет на каждый процесс на машине.

Ссылка: Как избавиться от всплывающих сообщений системы и приложений

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

Если у вас нет источника, используйте функцию SetErrorMode в родительском элементе для подавления всплывающих окон. Режим ошибки наследуется подпроцессами. Вы должны установить UseShellExecute в false для этого:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;


namespace SubProcessPopupError
{

    class Program
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern int SetErrorMode(int wMode);

        static void Main(string[] args)
        {
            int oldMode = SetErrorMode(3);
            Process p;
            ProcessStartInfo ps = new ProcessStartInfo("crash.exe");
            ps.UseShellExecute = false;
            p = Process.Start(ps);
            SetErrorMode(oldMode);
            p.WaitForExit();
        }
    }
}

Если вы получаете диалог "Вы хотите отлаживать использование выбранного отладчика?", вы можете отключить его, установив для этого значения реестра значение 0.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Auto = 0

Однако я не думаю, что это произойдет, если вы установили режим ошибки на 3, как описано выше.

Ответ 2

Другой вариант - запустить исполняемый файл в cdb, а затем выполнить поиск слова "исключение", используя следующую командную строку:

cdb.exe -G -g -c "Q" <your executable>