Как отловить абсолютно все исключения / ошибки - PullRequest
5 голосов
/ 07 мая 2011

У меня есть приложение-служба Windows, работающее под WinXPe, которое иногда завершается ошибкой и отображает окно сообщения для пользователя:

«Инструкция в« » ссылка на память в «0x00000000». память не может быть «прочитана». Нажмите OK выйти из программы

Если пользователь нажимает «ОК», служба перезапускается.

Я пытался перехватить все необработанные исключения при регистрации обработчика событий на AppDomain.CurrentDomain.UnhandledException в обработчике я регистрирую детали исключения и выхожу из приложения. Но ошибка, о которой я упоминал выше, НЕ обрабатывается из "UnhandledException".

Приложение является многопоточным, с использованием System.Threading.Timer и System.Threading.Thread. И он использует сторонние библиотеки, один из этих библиотек использует встроенное взаимодействие, у меня нет исходного кода для библиотеки.

Я пытался указать на ошибку с подключенным отладчиком, но ошибка не появляется;) Приложение должно запускаться за несколько дней до появления ошибки.

Мне нужен способ справиться с такой ошибкой.

Спасибо

Ответы [ 2 ]

3 голосов
/ 07 мая 2011

См. Векторная обработка исключений

Это часть windows SEH ( Структурная обработка исключений ) и IIRC, здесь очень мало ошибок, о которых вы, по крайней мере, не могли быть уведомлены в таком случае.

Вы , вероятно, захотите написать любой код обработки непосредственно в собственный API-интерфейс WIN32 (в небезопасном / неуправляемом коде) и использовать только предварительно выделенные (статические?) Буферы, поскольку многие вещи ненадежны в тот момент времени.

Остерегайтесь / избегайте потоков, блокировки примитивов, выделения памяти, дискового ввода-вывода; предпочтительно использовать API по умолчанию для Windows, например, перезапустите процесс или создайте мини-дамп и тому подобное

3 голосов
/ 07 мая 2011

Эта ошибка не является управляемым исключением.Это нарушение доступа к памяти более низкого уровня.По сути, это доступ по нулевому указателю в нативном коде.

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

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