Что происходит на уровне ОС, когда программа .NET выходит из-за неперехваченного исключения?

Фактический вопрос (вопросы):

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

Существует ли функция dll, которую я могу сцепить, для входа некоторой основной информации о катастрофическом отказе?

Контекст:

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

10
задан Rich 1 June 2010 в 11:43
поделиться

2 ответа

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

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

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

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

5
ответ дан 4 December 2019 в 02:49
поделиться

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

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

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

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

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

2
ответ дан 4 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: