Обнаружение сбоя процесса в .NET - PullRequest
6 голосов
/ 22 февраля 2010

Есть ли способ определить, что процесс, запущенный моей программой, завершился сбоем? В настоящее время решение, которое я нашел, состоит в том, чтобы посмотреть на Process.ExitCode и проверить значение:

        this.STProcess = Process.Start(this.CreateProcessStartInfo());
        this.STProcess.WaitForExit();
        if (STProcess.ExitCode != 0)
        {
            //raise error event...
        }

Я хотел знать, есть ли более элегантный (и точный) способ сделать это?

Я бы предпочел ответы на C #, и P / Invoke тоже подойдет.

P.S. - Мне нужно работать на Windows XP / Vista / 7

Ответы [ 3 ]

5 голосов
/ 22 февраля 2010

номер

Если вы не можете каким-либо образом повлиять на процесс (запись ошибок в журнал событий? Файл), насколько я знаю, у вас нет внешнего способа узнать, что процесс произошел сбой. Для вас это просто процесс, который ушел. Даже Windows не собирается хранить эту информацию везде, где я знаю. Его больше не существует, и если процесс каким-то образом не сохранил детали, они исчезли.

2 голосов
/ 29 августа 2012

Когда происходит сбой процесса, Windows сначала проверяет, настроен ли в вашей системе отладчик Just-In-Time. Если это так, вы можете подключить этот отладчик к процессу непосредственно перед его сбоем. Обычно вы используете эту функцию для создания дампа памяти при сбое процесса. Какой бы отладчик вы ни подключили, он узнает PID и имя процесса сбоя. Вы можете использовать функции существующих инструментов отладки, таких как ADPlus, или написать свою собственную программу и сказать Windows, что это ваш отладчик Just-In-Time и должен запускаться при сбое процесса. Я считаю, что вы можете настроить JIT-отладчик специально для любого имени процесса.

См. http://msdn.microsoft.com/en-us/library/5hs4b7a6(v=VS.80).aspx

Я думаю, что если вы установите для параметра реестра HKLM \ Software \ Microsoft \ Windows NT \ Current Version \ AeDebug \ Debugger значение «DirectoryOfYourProgram \ YourProgram.exe» -p% ld, где YourProgram.exe ожидает, что переданный PID передан в с флагом -p ваша программа будет вызываться и получать правильный PID при сбое процесса.

2 голосов
/ 22 февраля 2010

Для Windows 7 существует Перезапуск приложения и API восстановления . Для .NET вы можете использовать Windows API Code Pack .

Как правило, вы можете периодически искать существование процесса (сторожевое приложение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...