Что происходит на уровне ОС, когда программа .net закрывается из-за необработанного исключения? - PullRequest
10 голосов
/ 01 июня 2010

Актуальный вопрос (ы):

Что происходит "в Windows", когда происходит сбой программы из необработанного исключения?

Есть ли функция dll, которую я могу подключить, чтобы записать некоторую основную информацию о сбое?

Контекст:

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

Ответы [ 2 ]

5 голосов
/ 01 июня 2010

Управляемые исключения реализуются с использованием обычных механизмов структурированной обработки исключений Windows. Код исключения - 0xe0434f4d. Windows ищет обработчик исключений, который готов обработать исключение. Если в коде нет активного блока try в стеке или блок захвата не хочет перехватить управляемое исключение, то последним вздохом в управляемом коде является событие AppDomain.UnhandledException.

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

К тому времени, когда оно вышло за пределы AppDomain.UnhandledException, вся информация об управляемом исключении теряется. Нет трассировки стека, нет сообщения об исключении. Только код исключения, который вы уже знаете, и адрес исключения, для которого вы не будете использовать, потому что код динамически генерируется компилятором JIT.

Обязательно перехватите исключение на последнем этапе вздоха, напишите обработчик события для AppDomain.UnhandledException. Зарегистрируйте значение e.ExcdeptionObject.ToString () и закройте программу с помощью Environment.Exit (). Также остерегайтесь события Application.ThreadException в коде Windows Forms и события Dispatcher.UnhandledException в коде WPF. Они являются задним ходом для исключений, которые возникают при обработке событий в потоке пользовательского интерфейса.

2 голосов
/ 01 июня 2010

Для собственных приложений вы можете использовать следующие функции:

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

Указатель функции, который вы передаете в SetUnhandledExceptionFilter, получает структуру в качестве входного аргумента, содержащую всю информацию об исключении (причина, регистры, ...).

В моем приложении я использую SetUnhandledExceptionFilter для создания дампа приложения (используя функцию MiniDumpWriteDump из dll DBGHELP.DLL) в случае сбоя приложения. Будьте осторожны, не делая слишком много в этой функции. Поскольку ваше приложение уже аварийно завершает работу, не гарантируется, что любая дальнейшая логика будет работать (например, доступ к вашим собственным структурам данных, которые могут быть правильными, может вызвать дальнейшие сбои).

Подумайте о покупке книги Джона Роббинса " Отладка приложений Microsoft NET 2.0 ". Я многому научился из этой книги, включая этот трюк.

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