Обнаружение утечек памяти
Утечки памяти являются самой жестокой патологией программных кодов. Драйверы, которые получили для себя пространство в одном из пулов памяти, а затем забыли его освободить, могут привести к серьезной деградации системы и, через некоторое время, к ее фатальному сбою. Использование тегового механизма выделения памяти может оказать существенную помощь в обнаружении утечек. Как это работает?
Легкий способ повсеместной замены вызовов 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. Эта программа непрерывно выводит на экран обновляемые данные о страничных тегах.