Рихтер Дж., Назар К. - Windows via C C++. Программирование на языке Visual C++ - 2009
.pdf
830 Часть V. Структурная обработка исключений
Примечание. Важно помнить, что уведомления первого шанса сами по себе не означают, что в код системы или приложений вкралась серьезная ошибка. На самом деле, эти уведомления могут направляться только во время отладки процесса. С их помощью система просто сообщает отладчику о возникновении исключения. Если отладчик не открывает никаких окон, он позволит фильтру обработать исключение и продолжить исполнение, как ни в чем не бывало. А вот уведомление последнего шанса действительно свидетельствует о сбое или «жучке», который необходимо устранить.
В завершение главы хочу обратить ваше внимание на один момент, касающийся окна Exceptions. Это окно полностью поддерживает и те исключения, которые вы определили самостоятельно. Чтобы добавить свое исключение в список, достаточно щелкнуть кнопку Add — откроется окно New Exception. В нем следует выбрать тип исключения (Win32 Exceptions) и ввести имя вашего исключения, затем число, которое станет его кодом, и щелкнуть ОК — исключение появится в списке. На рисунке ниже показано добавленное мной программное исключение:
Оглавление |
|
Г Л А В А 2 6 Отчеты об ошибках и восстановление приложений ................................ |
831 |
Консоль Windows Error Reporting.......................................................................................... |
831 |
Программная генерация отчетов об ошибках в Windows................................................. |
834 |
Отключение генерации и отправки отчетов.............................................................. |
836 |
Настройка генерируемых для процесса отчетов о сбоях..................................... |
837 |
Создание и настройка отчетов о сбоях ...................................................................... |
838 |
Программа-пример Customized WER........................................................................... |
847 |
Автоматический перезапуск и восстановление приложений.......................................... |
855 |
Автоматический перезапуск приложения.................................................................. |
855 |
Поддержка восстановления приложений .................................................................. |
856 |
Г Л А В А 2 6
Отчеты об ошибках и восстановление приложений
В предыдущей главе мы обсудили, как механизмы 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).
Если пользователь отказался от отправки отчета в Майкрософт, сгенерированный отчет сохраняется на машине пользователя. С помощью консоли
832 Часть V. Структурная обработка исключений
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)
Глава 26. Отчеты об ошибках и восстановление приложений.docx 833
Заметьте, что в столбце 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. С его помощью можно попытаться отладить программу в вашем любимом отладчике даже после ее краха. При этом отладчик может найти ту самую команду, исполнение которой вызвало исключение!
834 Часть V. Структурная обработка исключений
Примечание. В будущих версиях 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. Отчеты об ошибках и восстановление приложений.docx 835
Табл. 26-2. Параметры WerSetFlags
Параметр WER_FAULT_REPORTING_* |
Описание |
FLAG NOHEAP = 1 |
Запрещает включать в отчет содержимое кучи, |
|
это удобно, если требуется ограничить размер |
|
отчета |
FLAG_DISABLE_THREAD_ |
По умолчанию WER приостанавливает все пото- |
SUSPENSION = 4 |
ки процесса, взаимодействующего с пользовате- |
|
лем, чтобы они не усугубили повреждения дан- |
|
ных. Данный флаг запрещает 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.
836 Часть V. Структурная обработка исключений
Внимание! Если не вызвать 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.
Глава 26. Отчеты об ошибках и восстановление приложений.docx 837
Настройка генерируемых для процесса отчетов о сбоях
Иногда требуется, чтобы приложения генерировали нестандартные отчеты о сбоях путем вызова различных 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 |
В файле могут содержаться конфиденциаль- |
|
ные пользовательские данные. По умолчанию |
|
этот файл не отправляется в Майкрософт, но |
|
в дальнейшем планируется открыть разработ- |
|
чикам доступ к этим файлам через сайт Win- |
|
dows Quality |
WerRegFileTypeOther = 2 |
Любой другой файл |
Параметр dwFlags — результат поразрядного сложения значений, описанных в табл. 26-4.
