как отслеживать, если данный процесс выдает исключение, используя службу Windows в C # - PullRequest
5 голосов
/ 03 февраля 2010

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

как я могу отслеживать состояние моего процесса с помощью службы Windows.

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

Ответы [ 6 ]

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

Это невозможно, исключения в первую очередь локальны для потока, локальны для вторичного процесса, если он не обработан.Необработанное исключение завершит процесс.Единственный осколок, который вы можете извлечь из такого мертвого процесса, - это код завершения процесса.Который должен быть установлен в 0xe0434f4e, код исключения для неуправляемого исключения.Никакой другой релевантной информации нет, если в процессе, который регистрирует состояние, нет необработанного обработчика исключений.Это состояние очень ненадежное, процесс перенес серьезный сердечный приступ.

Поддерживать синхронизацию и правильное выполнение нескольких процессов, когда они могут умереть от исключений, чрезвычайно сложно.Только смерть может быть надежно обнаружена, избегайте большего.

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

Редактировать: Таким образом, проблема заключалась не в том, что процесс умирал, а в том, что процесс застрял в диалоговом окне обработчика исключений, ожидая, пока пользователь нажмет отладку или отмена.Решение проблемы состояло в том, чтобы отключить диалог отладки .net JIT, инструкции здесь http://weblogs.asp.net/fmarguerie/archive/2004/08/27/how-to-turn-off-disable-the-net-jit-debugging-dialog.aspx

Мое оригинальное предлагаемое решение ниже


Не оконная служба, но этодовольно простая .NET программа для написания.

используйте System.Diagnostics.Process , чтобы получить объект Process для процесса, который вы хотите проверить.Вы можете использовать GetProcessByName, если хотите открыть существующий процесс.Если вы создадите процесс из C #, то у вас уже будет объект процесса.

Тогда вы можете WaitForExit либо с таймаутом, либо без него на объекте Process.или протестируйте свойство HasExited, или зарегистрируйте обратный вызов Exited.После завершения процесса вы можете проверить свойство ExitCode, чтобы узнать, вернул ли процесс значение ошибки.

1 голос
/ 03 февраля 2010

Сделайте так, чтобы ваш процесс записывал события и исключения в системный журнал приложений, и ваш монитор периодически проверял наличие записей, чтобы найти события, относящиеся к вашему процессу, и вы можете проверять системные события на события запуска и остановки службы.

Если сам процесс является службой Windows, вы можете проверить его состояние с помощью `System.ServiceProcess.ServiceController '.

0 голосов
/ 03 февраля 2010

В случае DllNotFoundException и других ситуаций, возникающих при запуске, приложение может указать, когда оно завершит запуск. Например, запишите метку времени в файл. Ваш монитор может сравнить время запуска приложения с временем в файле.

0 голосов
/ 03 февраля 2010
0 голосов
/ 03 февраля 2010

Одна вещь, которую вы можете сделать, это отслеживать использование процессором процессора. Я предполагаю, что ваш процесс уходит, когда выдается исключение. Следовательно, загрузка ЦП процесса должна быть равна 0, поскольку он больше не доступен. Следовательно, если загрузка ЦП в течение определенного периода времени остается нулевой, можно смело предположить, что процесс вызвал исключение. Этот метод не является надежным доказательством, так как вы основываете свое решение на использовании процессора, и законный процесс может иметь нулевое использование процессора в течение определенного периода времени. Вы можете включить эту проверку в службу мониторинга или написать простой VB-скрипт для внешней проверки использования процессора.

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