Отчеты об ошибках и восстановление приложений

Оглавление


ГЛАВА 26

Отчеты об ошибках и восстановление приложений
В предыдущей главе мы обсудили, как механизмы VEH, SEH и служба Windows Error Reporting (WER) взаимодействуют для получения и регистрации информации о сбоях в приложениях. В этой главе мы ближе познакомимся с отчетами об ошибках и подробно разберем использование WER-функций в собственных приложениях. С помощью WER API вам будет легче разобраться в причинах сбоев, возникающих в приложениях, отлов «жучков» также станет проще, да и пользователям будет удобнее работать с вантами программами.

^ Консоль Windows Error Reporting


Когда процесс завершается из-за необработанного исключения, WER генерирует отчет об этом исключении и контексте исполнения, в котором оно возникло.
С разрешения пользователя этот отчет по защищенному каналу передается на серверы Майкрософт, где содержимое отчета сравнивается с базой известных сбоев. Если в базе есть метод устранения данного сбоя, пользователь получит инструкции о том, что нужно предпринять, чтобы продолжить работу.
Поставщики оборудования и программ также могут использовать эту технологию для получения отчетов о сбоях, возникающих в их продукции. Поскольку сбои и зависания драйверов режима ядра обрабатываются так же, их разработчикам доступен широкий спектр решений (см. веб-страницу http://www.microsoft.com/whdc/maintain/StartWER.mspx и сайт Windows Quality Online Services по адресу https://winqual.microsoft.com).
Если пользователь отказался от отправки отчета в Майкрософт, сгенерированный отчет сохраняется на машине пользователя. С помощью консолиWER пользователь может просматривать и анализировать сведения о сбоях, возникших на его компьютере.
На рис. 26-1 показан аплет Problem Reports And Solutions, доступный на Панели управления (%SystemRoot%\system32\wercon.exe).

Рис. 26-1.

Консоль WER доступна через Control Panel
Щелчок ссылки View Problem History слева выводит в окне консоли WER список всех крахов и зависаний процессов (рис. 26-2), а также других сбоев, включая ненайденные драйверы и крахи системы.

Рис. 26-2.

Список крахов приложений в консоли WER (упорядоченный по категории Product)
Заметьте, что в столбце Status показано, по каким сбоям отчеты в Майкрософт уже отправлены. Сбои, отчеты по которым еще не отправлены, выделены полужирным шрифтом. Если щелкнуть запись о сбое правой кнопкой, можно проверить наличие решения для этой проблемы, удалить отчет либо вывести подробное описание сбоя. Команда View Problem Details (либо двойной щелчок записи о сбое) открывает окно, показанное на рис. 26-3.

Рис. 26-3.

Отчет о сбое в окне консоли WER
В окне итогов отображается сводная информация о сбое, взятая, главным образом, из поля ExceptionInformation структуры EXCEPTION_RECORD, передаваемой функции UnhandledExceptionFilter как Exception Code (код нарушения доступа — с0000005, см. рис. 26-3). Смысл этой информации для пользователей неясен, интерпретировать ее смогут только разработчики. Однако и этих сведений недостаточно, чтобы понять, что же все-таки случилось с программой. Но не беспокойтесь: ссылка View A Temporary Copy Of These Files открывает доступ к файлам, сгенерированным WER при вызове UnhandledExcepionFilter (см. табл. 26-1). По умолчанию эти файлы доступны, пока отчет о сбое не будет отправлен в Майкрософт. Ниже я покажу, как заставить WER сохранять эти файлы и после отправки отчета.
Самая интересная часть отчета — файл Memory.hdmp. С его помощью можно попытаться отладить программу в вашем любимом отладчике даже после ее краха. При этом отладчик может найти ту самую команду, исполнение которой вызвало исключение!

Примечание.

В будущих версиях Windows имя файла дампа может измениться. Так, в него может быть добавлено имя сбойного приложения, расширение же, скорее всего, останется прежним — .hdmp или .mdmp. Например, вместо Memory.hdmp и MiniDump.mdmp будут генерироваться файлы MyApp.exe.hdmp и MyApp.exe.mdmp. Все, что нужно знать о мини-дампах, вы найдете в книге «Отладка приложений для Microsoft.NET and Microsoft Windows» (Джон Роббинс, Русская Редакция, 2004) «Debugging Applications for Microsoft .NET and Microsoft Windows» (John Robbins, Microsoft Press, 2003).

Табл. 26-1. Файлы, генерируемые WER


Имя


Описание


AppCompat.txt
Список (в формате XML) модулей, загруженных сбойным процессом
Memory.hdmp
Дамп пользовательского режима для сбойного процесса, содержит его стеки, кучи и таблицу описателей. Вот флаги, которые используются для генерации этого дампа:

^ MiniDumpWithDataSegs |


MiniDumpWithProcessThreadData |


MiniDumpWithHandleData |


MiniDumpWithPrivateReadWriteMemory |


MiniDumpWithUnloadedModules |


MiniDumpWithFullMemorylnfo


MiniDump.mdmp
Мини-дамп пользовательского режима для сбойного процесса. Вот флаги, которые используются для генерации этого дампа:

^ MiniDumpWithDataSegs |


MiniDumpWithUnloadedModules |


MiniDumpWithProcessThreadData


Version.txt
Описание экземпляра Windows

Windows NT Version 6.0 Build: 6000


Product (0x6): Windows Vista (TM) Business Edition: Business


BuildString: 6000.16386.x86fre.vista_rtm.061101-2205


Flavor: Multiprocessor Free


Architecture: X86


LCID: 1033


Программная генерация отчетов
об ошибках в Windows


Следующая функционирования, экспортированная kernel32.dll и объявленная в werapi.h, позволяет настраивать некоторые параметры вашего процесса (см. табл. 26-2).

^ HREZULT WerSetFlags (DWORD dwFlags)


Табл. 26-2. Параметры WerSetFlags


Параметр WER_FAULT_REPORTING_*


Описание


^ FLAG NOHEAP = 1
Запрещает включать в отчет содержимое кучи, это удобно, если требуется ограничить размер отчета
FLAG_DISABLE_THREAD_
^ SUSPENSION = 4
По умолчанию WER приостанавливает все потоки процесса, взаимодействующего с пользователем, чтобы они не усугубили повреждения данных. Данный флаг запрещает WER делать это, и потому является потенциально опасным
^ FLAG_QUEUE = 2
Отчет о сбое не отправляется в Майкрософт, а добавляется в очередь на локальном компьютере
FLAG_QUEUE_UPLOAD = 8
Отчет о сбое отправляется в Майкрософт и добавляется в очередь на локальном компьютере
Действие последних двух флагов, WER_FAULT_REPORTING_FLAG_QUEUE и WER_FAULT_REPORTING_FLAG_QUEUE_UPLOAD, зависит от текущего значения параметра Consent (см. рис. 25-5). Если этому параметру назначено значение, отличное от значения по умолчанию (оно заставляет искать решение проблемы на сервере Майкрософт), WER генерирует отчеты в обоих случаях. Однако подтверждение отправки запрашивается, только если задан флаг WER_FAULT_REPORTING_FLAG_QUEUE_UPLOAD. Если же задан флаг WER_FAULT_REPORTING_FLAG_QUEUE, отчет не отправляется. Приложение не может заставить систему отправить отчет без разрешения пользователя (или администратора) компьютера, поскольку приоритет этих параметров выше, чем у функций WER.

Примечание.

Сгенерированный отчет добавляется в очередь на локальном компьютере. Если параметр Consent разрешает, отчет затем отправляется в Майкрософт, но сведения о нем сохраняются, поэтому запись о сбое отображается консолью WER. Если же значение Consent запрещает автоматическую отправку отчетов и поиск способа устранения сбоя, WER спрашивает у пользователя, что делать дальше. Если пользователь запретит отправку отчета, его данные сохраняются в локальной очереди и отображаются в консоли WER.
Узнать текущие параметры процесса позволяет следующая функция:

^ HRESULT WerGetFlags(HANDLE hProcess, PDWORD pdwFlags);


Первый параметр, hProcess, — это описатель интересующего вас процесса (с правом доступа PROCESS_VM_READ). Получить этот описатель можно вызовом GetCurrentProcess.

Внимание!

Если не вызвать WerSetFlags перед функцией WerGetFlags, последняя вернет WERE_NOT_FOUND.

Отключение генерации и отправки отчетов


Приложение может запретить службе WER генерировать и отправлять отчеты в случае сбоев. Это, безусловно, очень удобно при разработке и тестировании приложений. Чтобы отключить создание и отправку отчетов, вызовите следующую функцию:

^ HRESULT WerAddExcludedApplication(PCWSTR pwzExeName, BOOL bAllUsers);


Параметр pwzExeName задает имя вашего .ехе-файла (или полный путь к нему), включая расширение. Параметр bAllUser определяет, следует ли отключить создание отчетов при сбоях этой программы для всех пользователей компьютера либо только для пользователя, зарегистрированного в системе в данный момент. Если в этом параметре передается TRUE, приложение должно быть запущено под учетной записью администратора с соответствующими привилегиями, иначе функция вернет E_ACCESSDENIED (см. раздел «Работа администратора с пользовательскими полномочиями»). При возникновении необработанного исключения в программе, для которой отключена генерация отчетов, WER не генерирует отчет, но все равно запускает WerFault.exe, чтобы дать пользователю выбрать между отладкой и завершением приложения (рис 26-4).

Рис. 26-4.

Возможности, которые остаются у пользователя после отключения генерации отчетов
Чтобы вновь включить генерацию отчетов для некоторого приложения, вызовите функцию WerRemoveExcludedApplication:

HRESULT WerRemoveExcludedApplication(PCWSTR pwzExeName, BOOL bAHUsers);


Примечание.

Обе эти функции экспортированы wer.dll и объявлены в werapi.h.

^ Настройка генерируемых для процесса отчетов о сбоях


Иногда требуется, чтобы приложения генерировали нестандартные отчеты о сбоях путем вызова различных WER-функций. Это удобно:

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

^ HRESULT WerRegisterMemoryBlock(PVOID pvAddress, DWORD dwSize);


Адрес нужного блока передается в параметре pvAddress, а его размер — в параметре dwSize. Теперь при генерации отчета заданный блок будет сохранен в мини-дампе, благодаря чему его можно будет изучить при «посмертной» отладке процесса. Заметьте, что функцию WerRegisterMemoryBlock можно вызывать несколько раз, чтобы сохранить в мини-дампе несколько блоков данных.
Чтобы добавить к отчету произвольный файл, вызовите следующую функцию:

^ HRESULT WerRegisterFile(
PCWSTR pwzFilename,
WER_REGISTER_FILE_TYPE regFileType,
DWORD dwFlags);


Путь к файлу передается в параметре pwzFilename. Если вместо пути передано только имя файла, WER будет искать файл в рабочем каталоге. Параметр принимает одно из значений, перечисленных в таблице 26-3.

^ Табл. 26-3. Типы файлов, добавляемых к отчету о сбое


Значение regFileType


Добавляемый файл


WerRegFileTypeUserDocument = 1
В файле могут содержаться конфиденциальные пользовательские данные. По умолчанию этот файл не отправляется в Майкрософт, но в дальнейшем планируется открыть разработчикам доступ к этим файлам через сайт Windows Quality
WerRegFileTypeOther = 2
Любой другой файл
Параметр dwFlags — результат поразрядного сложения значений, описанных в табл. 26-4.

^ Табл. 26-4. Флаги, связанные с добавляемыми файлами


Флаг


Описание


^ DELETE_WHEN_DONE = 1
После отправки отчета файл следует удалить
ANONYMOUS_DATA = 2
Файл не содержит персональной информации, по которой можно определить пользователя. Если этот флаг не задан, при первом запросе сервера Майкрософт на передачу этого файла система спрашивает разрешение у пользователя. Если пользователь соглашается, параметру Consent в системном реестре присевается значение 3. После этого все файлы, помеченные этим флагом, будут отправляться без запроса подтверждения у пользователя
Зарегистрированные таким образом файлы будут сохранены в отчете. Заметьте, что функцию WerRegisterFile можно вызывать многократно, чтобы добавить к отчету несколько файлов.

Примечание.

Число элементов отчета WER, регистрируемых вызовами WerRegisterMemoryBlock и WerRegisterFile, не может быть больше, чем задано параметром WER_MAX_REGISTERED_ENTRIES (в настоящее время — 512). Возвращаемое в случае этой ошибки значение HRESULT можно сопоставить с кодом ошибки Win32 следующим образом: if ( HRESULT_ CODE(hr) == ERROR_INSUFFICIENT_BUFFER).
В завершение замечу, что для удаления из отчетов блоков данных и файлов служат следующие функции:

HRESULT WerUnregisterMemoryBlock(PVOID pvAddress);



23-nacionalnie-osobennosti-gendernogo-vizualnogo-kommunikativnogo-povedeniya.html
23-nadzor-i-kontrol-nad-soblyudeniem-zakonodatelstva-ob-ohrane-truda-uchebn-o-metodicheskoeposobie-izdatelstvo-tpu-tomsk-2003.html
23-nalogovie-voprosi-v-byudzhete-velikobritanii-na-20052006-finansovij-god.html
23-napravlennie-mikrofoni-i-lazernie-akusticheskie-sistemi-razvedki-uchebno-metodicheskij-kompleks-po-discipline.html
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат
Реферат