Программирование драйверов Windows

       

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


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

  • Необходимо заменить вызовы ExAllocatePool на вызовы ExAllocatePoolWithTag. Дополнительный аргумент, представляющий собой четырехбайтную величину (4 символа), используется для того, чтобы пометить вновь выделенный блок этим значением (тегом).
  • Необходимо запустить драйвер под отладочной версией (checked build) Windows. Поддержка трассировки страниц пула является дорогостоящим "удовольствием", поэтому доступно оно только в отладочных версиях Windows.
  • Когда выполняется анализ crash dump файла или в ситуации, когда достигну та точка прерывания при отладке "живого" драйвера, следует воспользоваться командами !poolused или !poolfind для того, чтобы ознакомиться с состоянием пулов памяти. Эти команды сортируют области пулов по значению тегов и высвечивают различные статистические данные об использовании памяти. Следует помнить, что в отсутствии файлов отладочных символов указанные команды 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. Эта программа непрерывно выводит на экран обновляемые данные о страничных тегах.



    Содержание раздела