Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ДП.docx
Скачиваний:
11
Добавлен:
23.09.2019
Размер:
4.64 Mб
Скачать

3.2.4.5 Обнаружение утечек памяти

Утечки памяти являются одной из самых распространенных патологий программных кодов. Драйверы, которые получили для себя пространство в одном из пулов памяти, а за­тем забыли его освободить, могут привести к серьезной деградации системы и, че­рез некоторое время, к ее фатальному сбою. Использование тегового механизма выделения памяти может оказать существенную помощь в обнаружении утечек. Рассмотрим как это работает [3.5]:

  • Необходимо заменить вызовы ExAllocatePool на вызовы ExAllocatePoolWithTag. Дополнительный аргумент, представляющий собой четырехбайт­ную величину (4 символа), используется для того, чтобы пометить вновь вы­деленный блок этим значением (тегом).

  • Необходимо запустить драйвер под отладочной версией Win­dows. Поддержка трассировки страниц пула является дорогостоящим «удовольствием», поэтому доступно оно только в отладочных версиях Windows.

  • Когда выполняется анализ crash dump файла или в ситуации, когда достигну­та точка прерывания при отладке «живого» драйвера, следует воспользовать­ся командами Ipoolused или Ipoolfind для того, чтобы ознакомиться с состоя­нием пулов памяти. Эти команды сортируют области пулов по значению те­гов и высвечивают различные статистические данные об использовании памяти. Следует помнить, что в отсутствии файлов отладочных символов указанные команды WinDbg не работают.

Легкий способ повсеместной замены вызовов ExAllocatePool на вызовы ExAllocatePoolEx состоит в том, чтобы изначально использовать фрагменты условной компиляции, например:

#if DBG==1

#define ALLOCATE_POOL(type,size) \ .

ExAllocatePoolWithTag((type), (size), '1234' )

#else

#define ALLOCATE_POOL(type,size) ExAllocatePool((type), (size))

#endif

Аргумент тега в вызове ExAllocatePoolWithTag состоит из четырех букв (в верх­нем регистре), которые на экране отладчика предстанут в обратном порядке, то есть '4321'.

В данном примере для всех операций выделения памяти при помощи ExAllocatePoolWithTag использован один и тот же тег. В некоторых ситуациях может оказаться целесообразным использование разных значений тега для выделения па­мяти под структуры данных разного типа, или для выделения памяти в разных фрагментах драйвера. Эти приемы помогут эффективнее идентифицировать утеч­ку памяти. Поставляемая в составе DDK утилита PoolTag позволяет наблюдать теговое выделение памяти и без привлечения отладчика WinDbg. Эта программа непрерывно выводит на экран обновляемые данные о страничных тегах.

3.2.5 Замечания по отладке драйверов

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

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

Интерактивная отладка всегда более привлекательна, однако, оснащение для этого требуется существенное, включая возможные затраты по подписке на допол­нительную информацию от Microsoft.

К счастью, операционная система Windows (версии 2000, ХР и выше) отличается богатым набором инструментальных средств, благодаря которым разработчик быстро и эф­фективно может локализовать ошибку, особенно, если она является в большей сте­пени программной (в отличие от аппаратных ошибок обслуживаемого устройст­ва).