Application verifier что это за программа

Отлаживаем ошибки доступа к памяти с помощью Application Verifier

Хабраюзер burdakovd задал в Q&A задачку про C++, vector и запись в чужую память. Задачка, кроме всего прочего, хороша тем, что на ней можно удобно продемонстрировать, как пользоваться инструментом Application Verifier и находить, кто же портит память.

Application Verifier — очень мощный инструмент, кроме диагностики работы с хипом он умеет уйму всего другого, например определять неправильную работу с хендлами, ошибки реализации многопоточности, эмулировать нехватку ресурсов, чтобы проверить корректную работу программы в таких условиях, но об этом как-нибудь в другой раз.

Инструменты

Кроме Application Verifier нам понадобится WinDBG — бесплатный отладчик, входящий в Microsoft Debugging Tools for Windows. Debugging Tools раньше можно было скачать отдельно, а сейчас почему-то только в составе Windows SDK или Windows Driver Kit. Но всё ещё можно скачать отдельно Previous Version, которая для наших задач отлично подойдёт. Ну или вот я выложил свежие версии (6.12.2.633), чтобы не качать весь SDK: dbg_x86.msi, dbg_amd64.msi.

Ещё понадобится Visual C++ (любой версии, новее, пожалуй, VS2003, можно Express) либо компилятор C++ из Windows SDK. Нужен именно компилятор от Microsoft, а не MinGW, потому что нам понадобится отладочная информация в формате PDB, которую понимает WinDBG.

Собираем пример

Исходник берем в упомянутой выше задачке (копия на pastie). Собираем обязательно с отладочной информацией (ключи /Zi или /ZI для компилятора и /DEBUG для компоновщика) и отключенной оптимизацией. Командная строка для сборки из консоли будет выглядеть примерно так:
cl /D_DEBUG /Zi /Od /EHsc /DEBUG /MDd vector_misuse.cpp

Настраиваем Application Verifier

Настраиваем отладчик

Находим причину падения

После того, как мы запустим программу, она упадёт с Access Violation.

Смотрим стек — View Call Stack (или Alt+6 или kp в приглашении) и видим, что упало в функции f, на втором уровне вложенности. Чтобы в окошке Call Stack было видны аргументы функций жмём кнопку Source args. Чтобы было видно ссылки на строки кода жмём кнопку Source. Команда kp выведет эту информацию в окошко Command отладчика. Также должно открыться окошко с исходным текстом и в нём подсветиться текущая строка.

Отладчик вывалит нам простыню текста, из которой нам интересны следующие вещи:
DEFAULT_BUCKET_ID: INVALID_POINTER_READ — попытка прочитать по невалидному указателю
READ_ADDRESS: 060a0ff4 — собственно сам адрес, по которому мы пытались прочитать.

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

Это всё конечно очень интересно, но хотелось бы узнать, а почему эту память нельзя читать? Благодаря настройкам, которые мы сделали в AppVerifier, система при каждом выделении и освобождении памяти собирала коллстеки и бережно сохраняла, чтобы потом по нашей просьбе любезно предоставить.

Итого

С написанием красивых заключений и подытоживаний у меня всегда были проблемы, поэтмоу их не будет. Люди умные, сами сделают себе нужные выводы 🙂

Источник

Application Verifier для программиста: тестирование Windows-приложений

Возможно в Вашем проекте и не пишут try < /* code */ >catch (. ) < >для того чтобы избежать исключений при работе с памятью, умеют закрывать хендлы и знают о виртуализации Windows Vista, а программы никогда не падают по непонятным и редко повторяемым причинам.

Тогда Вам повезло, можете переходить к следующему топику.

Но иногда происходят, казалось бы, странные вещи. Программа «падает» на ровном месте, память куда-то утекает, а еще один раз вам звонили с жалобой на странное поведение программы, работающей на сервере 24/7, но вы конечно «завернули» их проблему, убедив, что она аппаратно-зависимая, и ладно. Всё-таки разработка программ под Windows дело нередко хитрое, и от ошибок по невнимательности или из-за незнания архитектуры никто не застрахован. Я не буду учить, как этих ошибок не допускать — сам не знаю. Но вот одно средство для эффективной отладки могу посоветовать.

Речь пойдет о Microsoft Application Verifier. Но это не отладчик. Напротив, без отладчика, сама по себе, штука относительно бесполезная. А вот в совокупности с ним позволяет детектировать ряд важных платформо-зависимых проблем. Кроме того, не удастся получить сертификат «Сompatible with windows 7» без прохождения тестирования с использованием AppVerifier (собственно для “Vista Certified” так же, но об этом, видимо, говорить не принято). А этот сертификат — для пользователя некоторая гарантия, что получившая его программа, может лучше и не сделает, но хотя бы не навредит. Ладно, «вода» закончилась, приступим к делу.

Способ применения

Скачать и установить AppVerifier для Хаброчеловека, уверен, не сложность. Запустим (из под real-администратора, под Vista+ по-другому и не выйдет) его графическую оболочку:

Application verifier что это за программа. Смотреть фото Application verifier что это за программа. Смотреть картинку Application verifier что это за программа. Картинка про Application verifier что это за программа. Фото Application verifier что это за программа

Слева список приложений для тестирования; справа – список секций на проверку для выбранного приложения. В MSDN утверждается, что AppVerifier предназначен для тестирования программ на C++, но в целом применим для любого native кода.

Графическая оболочка не производит никаких тестов, только дает возможность выбора нужных пунктов. Сами проверки реализуются благодаря так называемым «слоям», динамически подключаемым библиотекам vfbasics, vfcompat, vfLuaPriv, vfprint (на них можно полюбоваться в папке system32 ). При запуске тестируемого приложения они подключаются к нему и перехватывают вызов системных функций, таких как HeapAlloc, GetTickCount, CloseHandle и многих других. Перехватчик производит ряд дополнительных проверок, затем вызывает оригинальную функцию, и поэтому, за исключением нескольких рассматриваемых далее случаев, это не скажется на работе тестируемого приложения. Разве что будет заметна некоторая потеря производительности. Субъективно в худшем случае программа «замедлится» в пять раз, а нужны ли какие-нибудь конкретные цифры или нет – оставлю на ваше усмотрение.

Здесь есть важная особенность: несмотря на то, что мы при добавлении выбираем файл тестируемого приложения, проверки привязываются только к его имени без пути. С одной стороны, можно не беспокоиться в какой конфигурации (и в какую папку) собирать проект (обычно папки для Debug и Release разные), но с другой – можно забыть об установленных проверках, и запуская программу с рабочего стола, удивляться, что она «не работает».

Про смысл тест-пунктов поговорим чуть позже, а сейчас добавим, к примеру notepad.exe и установим все галки. Запустим блокнот, добавим пару строчек, попробуем сохранить. О-па, неудача:

Application verifier что это за программа. Смотреть фото Application verifier что это за программа. Смотреть картинку Application verifier что это за программа. Картинка про Application verifier что это за программа. Фото Application verifier что это за программа

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

Application verifier что это за программа. Смотреть фото Application verifier что это за программа. Смотреть картинку Application verifier что это за программа. Картинка про Application verifier что это за программа. Фото Application verifier что это за программа

Физически эти лог файлы находятся в папке AppVerifierLogs в корне пользовательского профайла. Прочитать их голыми руками будет трудно (бинарный формат), поэтому тыкаем кнопочку “View” для соответствующего лога. Произойдет его дамп в xml и открытие дефолтной программы просмотра для xml:

Application verifier что это за программа. Смотреть фото Application verifier что это за программа. Смотреть картинку Application verifier что это за программа. Картинка про Application verifier что это за программа. Фото Application verifier что это за программа

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

Тут и краткое описание проблемы, и stack trace. И от меня подсказка, как искать ошибки, а не предупреждения. Кстати сказать, если ошибки присутствуют, то программа не получает сертификации на совместимость с Vista/Win7. Постойте, но это же блокнот?! Ну да, только тссс.

Лечение больного

Теперь запускаем отладчик. Пусть это будет отладчик, встроенный в студию, или бесплатный WinDbg из состава Debugging Tools for Windows (он конечно более навороченный, но сейчас это не имеет значения).

А вот и наш больной:

int _tmain( int argc, _TCHAR* argv[])
<
int *p = new int ();
delete p;
*p = 0; // p = 0 will be OK, but *p = 0 is error!
>

Потенциальную опасность этого фрагмента легко оценить, если бы строки с delete и перезаписью памяти были растянуты по времени. Но ни в дебажной, ни в релизной сборке такая проблема не детектируется (Visual Studio, конфигурация по умолчанию).

Теперь добавляем программу на тестирование группы Basics в Application Verifier. И запускаем её из под отладчика (из студии по F5, например). AppVerifier заговорил с нами голосом студии:

Application verifier что это за программа. Смотреть фото Application verifier что это за программа. Смотреть картинку Application verifier что это за программа. Картинка про Application verifier что это за программа. Фото Application verifier что это за программа

А в Debug Output показывается соответствующее структурное исключение:

=======================================
VERIFIER STOP 00000013: pid 0xB54: First chance access violation for current stack trace.

02B59FF8 : Invalid address causing the exception.
0082142F : Code address executing the invalid access.
0013F670 : Exception record.
0013F68C : Context record.

Оно рассказывает, что за исключение (00000013), с каким адресом памяти (02B59FF8) и по какому адресу кода (0082142F) произошло. Счастливчикам, скачавшим Windows Debug Symbols покажут и место в исходном коде, где произошла проблема и Stack Trace, который привел к исключению.

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

Детектируемые проблемы

Давайте теперь разберемся, какие проблемы позволит выявить нам AppVerifier. Все опции тестирования разделены на группы. Исключая группу «Low Resource Simulation» и тестов «TimeRollOver» и «HighVersionLie» проверки не меняют поведения приложения (в случае, если не будет обнаружено ошибок).

1. Искажающие проверки
1.1. Low Resource Simulation

Вот она причина падения блокнота. Тесты этой группы позволяют смоделировать поведение системы при нехвате ресурсов. Приложению запросто могут отказать (по датчику случайных чисел) в выделении памяти, создании файла, Event’а, окна, записи в реестр. Обычно есть некоторое «спокойное» время около 2-5 секунд, когда приложению разрешается пользоваться ресурсами в полную силу; сделано это, чтобы приложение вообще смогло запуститься (это придумали не так давно, раньше было грустнее). Нормальным поведением программы является стабильность; показ предупреждающих диалогов, но не «падения». Так что в коде нужно бы предусматривать данные ситуации.

1.2. TimeRollOver в группе Misc

DWORD time_end = GetTickCount() + 1000; // 1s timelimit
do < action(); >while (GetTickCount()

И это не единственный случай, что Вы скажете про следующий фрагмент?

Для диагностики подобных проблем проверка TimeRollOver «прогоняет» значение функции GetTickCount() быстрее. Полный цикл до обнуления значения проходит за 5 минут.

1.3. HighVersionLie в группе Compatibility

OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof (OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx(&osvi);

BOOL bIsWindowsXP_or_Later = (osvi.dwMajorVersion >= 5) && (osvi.dwMinorVersion >= 1);
if (!bIsWindowsXP_or_Later)
printf( «Windows XP or later required.\n» );

В данном фрагменте допущена явная ошибка; с целью отсечь Windows 2000 (5.0) вводится дополнительная проверка на minor версию XP (5.1), но код также отбрасывает и Windows Vista (6.0). На Windows 7 (6.1) работать будет. Неужели это и есть причина плохой совместимости с Windows Vista? Microsoft утверждает, что 70% несовместимых с Vista программ не работают в том числе и из-за этой проблемы.

Но диагностика такой ситуации на компьютере разработчика затруднительна — у него одна, фиксированная версия ОС. Можно воспользоваться виртуальной машиной с другой версией ОС, а можно просто ткнуть галку HighVersionLie. Тогда значение GetVersionEx будет модифицировано (обычно по правилу dwMajorVersion += 3; dwMinorVersion = 0 ).

2. Немодифицирующие проверки
2.1. Memory в группе Basics

Проверка корректности вызовов HeapAlloc, GlobalAlloc и других API Windows Heap Manager. За утечками памяти не следит, но это можно решить другими способами.

2.2. TLS в группе Basics

Следит за корректностью вызовов Thread Local Storage API.

2.3. Exceptions в группе Basics

Следит за уместностью перехвата исключений, в частности попытки «заглушить» исключения Access Violation, «демаскирует» исключения в заглушках вида try < >catch (. ) < >.

2.4. Handles в группе Basics

Следит за допустимостью операций над хендлами, корректностью хендлов и их временем жизни. Чуть подробнее на английском.

2.5. Locks в группе Basics

Проверяет корректность использования критических секций, не допускает сброс критической секции из другого потока относительно установки критической секции.

2.6. DirtyStacks в группе Misc

Периодически заполняет неиспользуемую часть стека паттерном 0xCD, что позволяет обнаруживать неинициализированные переменные или параметры функций.

2.7. DangerousAPIs в группе Misc
2.8. LuaPriv

Limited-user-account privileges test. Проверяет, нужны ли программе административные привилегии, не выполняет ли программа действий, которые допустимы только для real-администратора.

Состоит из двух частей: предсказывающей (перечисляет все действия программы, которые может выполнить только администратор) и диагностической (отказывает программе в административных действиях с ошибкой ACCESS_DENIED ). Таким образом, программисту не обязательно тестировать программу отдельно логинясь гостем. Также проверяет ряд особенностей связанных с виртуализацией под Windows Vista и старше.

Заключение

AppVerifier — интересный инструмент, позволяющий выявить и решить ряд «плавающих» и «скрытых» (а иногда и специально спрятанных) проблем. Пользоваться им в целом не сложно, при определнных навыках — удобно. А если вы хотите получить сертификат «Windows compatible», то знакомства с ним не избежать. Лично мне помог уже на двух проектах, надеюсь будет полезен и Вам.

Источник

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

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

Механизм Fault Tolerant Heap

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

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

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

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

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

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

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

Application verifier что это за программа. Смотреть фото Application verifier что это за программа. Смотреть картинку Application verifier что это за программа. Картинка про Application verifier что это за программа. Фото Application verifier что это за программа

Информация о 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). В эту группу входят следующие тесты:

В группу различных дополнительных тестов (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 Heaps Locks –for notepad.exe

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

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

где 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.

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

Источник

Application Verifier (Windows 7 and Windows Server 2008 R2 Application Quality Cookbook)

Affected Platforms

Description

Promote and enforce Application Verifier as a quality gate for all development. It includes several improvements:

These changes should have no negative impact on users who do not enable the Thread Checks; those who do should receive additional support in discovery and diagnosis of existing thread-pool usage problems. Whether or not you enable Thread Checks, you will benefit from the other improvements and bug fixes in this service.

While there is a slight performance penalty when using this service, the performance levels should remain acceptable because it does not typically run in retail environments.

Usage

General Information

To deliver reliable Windows applications:

Thread-pool checks are enabled by default under the «Basics» check heading. As this is included in the default setting, users need only to run Application Verifier on their code with the default settings to leverage the new checks.

Details

At a minimum, you should run Application Verifier with the Basics setting selected. This is required for WinLogo and WinQual. The Basics setting checks for the following:

If your application is migrating from a «Pre-Vista» application, you will want to leverage the «LuaPriv» (also known as UAC checks). The Limited User Account Privilege Predictor (LuaPriv) has two primary goals:

LuaPriv identifies the following types of problems:

Potential IssueDescription
Restricted NamespacesCreating a named synchronization object (Event, Semaphore, Mutex, etc) without a namespace may complicate running without privilege on some operating systems because the operating system may choose to place the object in a restricted namespace. Creating such an object in a restricted namespace (such as the Global namespace) requires SeCreateGlobalPrivilege, which is granted only to administrators.
LuaPriv flags both these issues if it detects them.
Hard Administrator ChecksSome applications interrogate the user’s security token to find out how much privilege he/she has. In those cases, the application may change its behavior depending on how much power it thinks the user has.
LuaPriv flags API calls that return this information.
Requesting PrivilegesAn application may attempt to enable a security-relevant privilege (such as SeTcbPrivilege or SeSecurityPrivilege) prior to performing an operation that requires it.
LuaPriv flags attempts to enable security-relevant privileges.
Missing PrivilegesIf an application attempts to enable a privilege that the user does not have, it probably signals that the application expects the privilege, which can cause behavior differences.
LuaPriv flags failed privilege requests.
INI-File OperationsAttempts to write to mapped INI files (WritePrivateProfileSection and similar APIs) can fail as a non-administrator user.
LuaPriv flags such operations.
Access DeniedIf the application attempts to access an object (File, registry key, etc) but the attempt fails due to insufficient access, then the application probably expects to be running with more privilege than it has.
LuaPriv flags object-open attempts that fail with ACCESS_DENIED and similar errors.
Deny ACEsIf an object has Deny ACEs in its DACL, then it explicitly denies access to specific entities.
This is uncommon, and makes prediction difficult, so LuaPriv flags Deny ACEs when it finds them.
Access RestrictedIf an application attempts to open an object for rights that are not granted to normal users (for example, trying to write to a file that is only writeable by administrators), then the application probably will not work the same when run as a normal user.
LuaPriv flags such operations.
MAXIMUM_ALLOWEDIf an application opens an object for MAXIMUM_ALLOWED, then the actual access check on the object will occur elsewhere. Most code that does this does not work correctly, and will almost certainly work differently when run without privilege.
LuaPriv thus flags all incidents of MAXIMUM_ALLOWED.

Commonly overlooked issues are captured in the nebulous Misc Checks:

We have added a new Print Verifier. This layer helps find and troubleshoot issues that may result when an application calls the print subsystem. Print Verifier targets the two layers of the print subsystem, the PrintAPI layer and the PrintDriver layer.

Print Verifier tests the interface between a program and Winspool.drv and prntvpt.dll and tests the interfaces of those DLLs. You can review the rules for calling functions in this interface in the MSDN help section for APIs exported by winspool.drv and prntvpt.dll.

Print Driver Layer

Print Verifier also tests the interface between a core print driver such as UNIDRV.DLL, UNIDRUI.DLL, PSCRIPT5.DLL, PS5UI.DLL, or MXDWDRV.DLL, and the print driver plug-ins. You can find information about this interface in the MSDN and the WDK.

Note that some of these checks are for Windows 7 only, and others will simply perform better under Windows 7.

Typically, only debug versions run the Application Verifier, so performance is not generally an issue. If performance issues arise from the use of this, or any other Application Verifier check, run one check at a time until you have performed all needed checks.

Nearly 10% of application crashes on Windows systems are due to heap corruption. These crashes are nearly impossible to debug after the fact. The best way to avoid these issues is to test with the Page Heap features found in Application Verifier. There are two flavors of Page Heap: «Full» and «Light.» Full is the default; it will force a debugger stop instantly upon detecting corruption. This feature MUST be run while under the debugger. However, it is also the most resource demanding. If a user is having timing issues and has already run a scenario under «Full» Page Heap, setting it to «Light» will likely address these issues. Additionally, Light Page Heap does not crash until the process exits. It does provide a stack trace to the allocation, but can take considerably longer to diagnose than leveraging its Full counterpart.

Monitor the reliability status of the applications via the Winqual web portal. This portal shows the error reports collected via Windows Error Reporting, so it is easy to identify the most frequent failures. Learn about this at Windows Error Reporting: Getting Started. Microsoft does not charge for this service.

To take advantage of WinQual, you must:

One further note: Application Verifier is only as good as the code paths you run it against. The value of combining this tool with a code coverage tool cannot be overstated.

Links to Other Resources

Debugging Tools for Windows:

Application Verifier:

Note: the Application Verifier version that ships in Visual Studio is quite dated. If possible, use the standalone package instead. For this reason, future versions of Visual Studio will no longer have embedded Application Verifier.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *