Модернизация приложений

Часть 7. Обеспечение стабильности приложений. Механизм Fault Tolerant Heap и утилита Application Verifier

Алексей Федоров

Механизм Fault Tolerant Heap

Наблюдение за механизмом Fault Tolerant Heap

Отключение механизма Fault Tolerant Heap

Сброс списка приложений

Утилита Application Verifier

Группы тестов

Использование Application Verifier из командной строки

Заключение

 

В части 6 нашей статьи мы рассказывали о механизме Windows Error Reporting. В данной части мы продолжим обсуждение темы обеспечения стабильности приложений и поговорим о механизме Fault Tolerant Heap и утилите Application Verifier.

Механизм Fault Tolerant Heap

Устойчивая к сбоям «куча» (Fault Tolerant Heap, FTH) — это новая подсистема в Windows 7, призванная уменьшить число сбоев приложений, связанных с некорректным использованием ресурсов «кучи». Сбои в области «кучи» являются наиболее частой причиной сбоев самих приложений и в большинстве случае обусловлены ошибками в коде приложений.

Индикаторами повреждений «кучи» являются сбои при применении функций RtlAllocateHeap() и RtlFreeHeap(), помимо этого сбои могут возникать при завершении работы и вызове функции RtlFreeHeap().

К основным задачам Fault Tolerant Heap относятся:

  • исправление наиболее частых ошибок за счет применения специальных «заплаток»;
  • динамическое определение необходимости исправления приложения;
  • мониторинг эффективности сделанных исправлений и их отмена в тех случаях, когда не удалось исправить ошибки;
  • отсылка диагностических данных о повреждениях «кучи» в Microsoft и разработчикам приложений.

Механизм Fault Tolerant Heap состоит из двух компонентов — сервера и системных «заплаток». Сервер отвечает за активацию механизма «заплаток» для приложения, мониторинг работы приложений, удаление «заплаток», коммуникацию с Microsoft через механизм Dr.Watson. Системные «заплатки», реализованные в библиотеке AcXtrnal.dll, загружаемой в процесс приложения, исправляют наиболее частые ошибки, связанные с использованием «кучи», и отсылают диагностическую информацию в Microsoft с помощью механизма Windows Error Reporting.

Механизм Fault Tolerant Heap поддерживается в следующих сценариях:

  • полная функциональность FTH доступна только в клиентских версиях операционной системы Windows 7. Это означает, что FTH не выполняет мониторинг и не исправляет приложения, выполняющиеся под управлением серверных версий операционной системы. Тем не менее для серверных приложений можно применить соответствующие системные «заплатки» — для этого следует использовать набор утилит Application Compatibility Toolkit;
  • полная функциональность FTH поддерживается только для интерактивных приложений. Поскольку начиная с Windows Vista и Windows Server 2008 сервисы не могут быть интерактивными, сервисы не включаются в мониторинг, выполняемый FTH. Тем не менее для приложений, которые выполняются как сервисы, можно применить соответствующие системные «заплатки» — для этого следует использовать набор утилит Application Compatibility Toolkit. Отметим, что технически FTH не отличает сервисные процессы от других процессов, но мониторинг и исправление выполняются только для процессов, ассоциированных с токеном интерактивного пользователя;
  • механизм FTH выполняется как часть службы Diagnostic Policy Service. Этот сервис осуществляется в процессе svchost.exe, который, в свою очередь, выполняется в контексте безопасности учетной записи Local Service. Для обеспечения функционирования механизма FTH учетной записи Local Service, как минимум, требуется доступ на чтение к полному имени исполняемого файла для приложения, к которому будут применены соответствующие исправления. Если у учетной записи нет такого доступа, FTH не сможет применить необходимые исправления.

Наблюдение за механизмом Fault Tolerant Heap

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

  1. Вызвать меню Start.
  2. Нажать правую кнопку мыши на команде Computer и выполнить команду Manage.
  3. Вызвать Event Viewer → Applications and Services Logs → Microsoft → Windows → Fault-Tolerant-Heap.
  4. Посмотреть события, связанные с FTH.

 

Рисунок

Информация о FTH в системном журнале

События, связанные со стартом (1001) и завершением (1002) сервиса, не содержат дополнительных данных. События, касающиеся исправлений, содержат идентификатор процесса (PID), название образа на диске и время запуска процесса.

Отключение механизма Fault Tolerant Heap

Для полного отключения механизма Fault Tolerant Heap на уровне системы необходимо в реестре присвоить переменной HKLM\Software\Microsoft\FTH\Enabled значение 0. После этого следует перезагрузить операционную систему.

Сброс списка приложений

Как уже было отмечено, механизм Fault Tolerant Heap является самоуправляемым и автоматически отменяет применение системных «заплаток» в тех случаях, когда они не эффективны для того или иного приложения. Тем не менее если есть необходимость в обнулении списка приложений, исправленных средствами FTH, например при тестировании, когда необходимо воспроизвести сбой в приложении, то нужно выполнить следующую команду:

Rundll32.exe fthsvc.dll,FthSysprepSpecialize

Обратите внимание на то, что это может приводить к ошибкам в выполнении ряда приложений — до тех пор, пока механизм FTH снова не применит к ним системные «заплатки».

Утилита Application Verifier

Утилита Application Verifier (%windir%\system32\appverif.exe) — это средство для проверки Windows-приложений, написанных на неуправляемом коде (С/С++), в реальном времени с использованием групп тестов. Цель применения данной утилиты — обнаружение ошибок, которые довольно сложно «отловить» традиционными средствами тестирования, так как данная утилита позволяет отслеживать взаимодействие приложений с операционной системой, использует профилирование на базе объектов ядра системы, реестра, файловой системы и вызовов функций Windows API («куча», ссылки, блокировки и т.п.). В зависимости от задачи разработчики и тестировщики выбирают те или иные тесты, проводят тестирование приложения и анализируют результаты в протоколах, которые по умолчанию сохраняются в каталоге %USERPROFILE%\AppVerifierLogs. Утилита Application Verifier может применяться из графического интерфейса, командной строки или через набор программных интерфейсов (см. заголовочный файл vrfauto.h). Две последние возможности позволяют использовать Application Verifier для автоматизации тестирования. Помимо этого возможно применение Application Verifier как расширения отладчика через команду !avfr.

Утилита Application Verifier поддерживается для операционных систем Windows XP, Windows Vista, Windows 7, Windows Server 2003 и Windows Server 2008 для платформ x86, x64 и IA64. Самую новую версию утилиты Application Verifier можно загрузить с сайта Microsoft, если в разделе Download Center в строке поиска задать название утилиты.

В общем случае процесс проверки приложения заключается в запуске утилиты Application Verifier, выборе тестируемого приложения и необходимых тестов, запуске приложения, выполнении определенного сценария работы приложения и анализе результатов тестирования. Наиболее оптимальных результатов можно достичь, используя Application Verifier совместно с отладчиком и отладочными символами для ядра операционной системы. При применении Application Verifier совместно с отладчиком при обнаружении какой­либо ошибки возникает переключение в точку останова в отладчике (Debugger Break).

Группы тестов

Как мы уже отметили, утилита Application Verifier включает несколько групп тестов: базовые тесты — Basics Verification Layer; тесты, связанные с использованием технологий, объединяемых названием Limited User Account (более распространенное название — User Account Control), — Limited User Account Predictor Verification Layer; различные дополнительные тесты — Miscellaneous Verification Layer; тесты, эмулирующие нехватку системных ресурсов, — Low Resource Simulation Verification Layer; тес­ты, позволяющие проверить совместимость приложений, — Compatibility Verification Layer.

Рассмотрим некоторые из перечисленных тес­тов более подробно. Начнем с базовых тес­тов (Basics Verification Layer). В эту группу входят следующие тесты:

  • Exceptions — проверяет корректную работу приложения в области структурированной обработки исключений — в первую очередь в обработке ошибок, связанных с доступом к объектам и ресурсам (access violation);
  • Handles — проверяет корректную работу приложений со ссылками (handles);
  • Heaps — проверяет корректную работу с памятью в «куче»;
  • Input/Output — отслеживает операции асинхронного ввода­вывода и выполняет ряд проверок этих операций;
  • Leak — обнаруживает утечки ресурсов, выделяемых в динамически загружаемых библиотеках и не освобождаемых после выгрузки библиотек;
  • Locks — проверяет корректное использование блокировок и критических секций;
  • Memory — проверяет корректную работу с программными интерфейсами работы с виртуальной памятью (VirtualAlloc(), MapViewOfFile() и т.п.);
  • TLS — проверяет корректную работу с программными интерфейсами работы с Thread Local Storage;
  • Threadpool — проверяет корректную работу с программными интерфейсами работы с пулом потоков (threadpool).

В группу различных дополнительных тестов (Miscellaneous Verification Layer) входят тесты, контролирующие использование некоторых функций Windows API (Dangerous APIs): TerminateThread(), вызов LoadLibrary() в DllMain(), вызов FreeLibrary() в DllMain() и т.п.; проверяющие использование стека (Dirty Stacks) и корректное применение функций GetTickCount() и TimeGetTime().

В состав Application Verifier также включены тесты, позволяющие проверить совмес-тимость приложений с User Account Control (тест LUAPriv) и рядом других технологий и рекомендаций по написанию совместимых приложений (группа тестов Compatibility). Тес-ты LUAPriv решают две задачи: проверяют работоспособность приложений, запущенных под стандартной учетной записью, и диагнос­тируют потенциальные проблемы, которые могут возникнуть при запуске приложений под стандартной учетной записью. Группа тестов Compatibility включает проверки корректного использования программных интерфейсов для доступа к файловой системе, проверки номера версии операционной системы, использования интерактивных сервисов и установки драйверов уровня ядра операционной системы.

Помимо этого в состав Application Verifier входят тесты Low Resource Simulation, эмулирующие нехватку основных системных ресурсов, например малый объем доступной памяти.

Использование Application Verifier из командной строки

Рассмотрим несколько примеров использования утилиты Application Verifier из командной строки. Следующие команды включают проверку корректной работы со ссылками, «кучей», блокировками, исключениями, TLS и памятью:

appverif /verify TARGET [/faults [PROBABILITY [TIMEOUT [DLL …]]]]

appverif /verify notepad

appverif -enable LAYER … -for TARGET ... [-with [LAYER].PROPERTY=[VALUE] …]

appverif -disable LAYER ... -for TARGET ...

appverif -query LAYER ... -for TARGET ...

appverif –configure STOP ... -for TARGET ... [-with STOPPROPERTY=[VALUE] …]

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

appverif –enable Heaps Locks –for notepad.exe

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

appverif -disable * -for notepad.exe

или

appverif -delete settings -for notepad.exe

В целом синтаксис командной строки для утилиты Application Verifier выглядит следующим образом:

appverif -enable LAYER ... -for TARGET ... [-with [LAYER].PROPERTY=[VALUE] …]

appverif -disable LAYER ... -for TARGET ...

appverif -query LAYER ... -for TARGET ...

appverif –configure STOP ... -for TARGET ... [-with STOPPROPERTY=[VALUE] …]

где LAYER — стандартное название группы тес­тов: Heap, Locks, Handles и т.п.; TARGET — имя исполняемого файла или идентификатор процесса; PROPERTY — название свойства одного из тестов; VALUE — значение свойства; STOP — конфигурируемое значение точки остановки для отладчика; STOPPROPERTY — название точки остановки для отладчика — ErrorReport, Severity, Flavor и т.п.

Завершая этот краткий обзор утилиты Application Verifier, отметим, что она активно используется в различных средствах обеспечения совместимости приложений, входящих в состав Microsoft Application Compatibility Toolkit (ACT), и утилитах сертификации приложения для получения логотипа Compatible with Window 7 — Windows Software Logo Kit (WSLK).

Заключение

В предыдущей и настоящей частях данной статьи мы привели ряд рекомендаций по улучшению стабильности приложений. Мы ознакомились с техникой, позволяющей избежать утечек памяти, предотвратить зависание приложений, а также обсудили применение механизмов Application Restart and Recovery и Windows Error Reporting, позволяющего собирать данные о сбоях, которые происходят в приложениях, механизма Fault Tolerant Heap, автоматически исправляющего ряд наиболее характерных ошибок в приложениях, которые приводят к сбоям при работе с «кучей», и кратко ознакомились с возможностями утилиты Application Verifier.

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

 

В начало В начало

КомпьютерПресс 08'2011

Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует