Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Рихтер Дж., Назар К. - Windows via C C++. Программирование на языке Visual C++ - 2009

.pdf
Скачиваний:
6639
Добавлен:
13.08.2013
Размер:
31.38 Mб
Скачать

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.

Соседние файлы в предмете Программирование на C++