Как отловить исключения из другой программы (для регистрации)? - PullRequest
3 голосов
/ 20 марта 2010

Я работаю над инструментом, который контролирует ряд приложений и гарантирует, что они всегда работают и находятся в чистом состоянии. Некоторые из этих приложений имеют необработанные исключения, которые возникают периодически и представляют окно «Отправить отчет о сбое». У меня нет исходного кода для этих приложений.

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

Я не пытаюсь сделать что-то сумасшедшее, например catch и обработать это от имени приложения, я просто пытаюсь захватить тип исключения, зарегистрировать его и затем перезапустить приложение.

Ответы [ 3 ]

2 голосов
/ 20 марта 2010

Для перехвата необработанных исключений требуется вызов SetUnhandledExceptionFilter () в процессе. Это будет трудно сделать, если у вас нет исходного кода, хотя технически это возможно, если ввести DLL в процесс. Однако это невозможно сделать с помощью управляемого кода, вы не можете правильно инициализировать CLR.

Обработчик необработанных исключений по умолчанию, устанавливаемый Windows, всегда будет запускать WerFault.exe, средство сообщения об ошибках Windows. Это можно отключить, но это системная настройка. Ожидать, что это сделает пользователь или администратор, нереально. Только после запуска WER отладчик JIT получит на него шанс.

Я рекомендую более простой подход, который также намного более избирателен. Используйте класс Process, чтобы запустить интересующую вас программу. Когда происходит событие Exited, используйте свойство ExitCode, чтобы узнать, как оно завершилось. Любое отрицательное значение является верным признаком того, что процесс умер при необработанном исключении, код завершения соответствует коду исключения. Вы можете использовать класс EventLog, чтобы прочитать сообщение о событии, которое WER записывает в журнал событий Windows. И вы можете перезапустить его так же, как вы его начали.

1 голос
/ 20 марта 2010

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

1 голос
/ 20 марта 2010

Без изменения источника приложения или внедрения DLL в процесс я не верю, что это возможно надежным способом. То, что вы пытаетесь сделать, это проверить информацию о типе через границы процесса. Этого нелегко достичь по ряду причин

  • Получение имени исключения подразумевает выполнение кода в целевом процессе. Имя может быть сгенерировано несколькими способами (.ToString или .GetType (). Name), но все они включают выполнение какого-либо метода
  • Вы хотите сделать это после того, как приложение уже аварийно завершилось и, следовательно, может быть в очень плохом состоянии. Попробуйте попытаться выполнить код, если память была повреждена (возможно, даже искажает определения типа в памяти).
  • Сбой может происходить в собственном коде и не включать никаких управляемых данных
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...