#windows #memory-leaks #driver
#Windows #утечки памяти #драйвер
Вопрос:
Я использую poolmon
пакет SDK для анализа утечек памяти из Win 10, я запускаю его сразу после выгрузки драйвера. Моя командная строка
poolmon.exe -s -e -g -r -n poolmondump.txt
Определение аргумента из poolmon /?
-s Display session pool
-n [Logfile] Take a pool snapshot
Logfile maybe specified, default is poolsnap.log
-g [PoolTagFile] Display driver information using PoolTagFile
If PoolTagFile is not specified
use 'pooltag.txt' from current directory
-e Display totals
-r Print memory summary information
Часть выходных данных равна
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
SIFP Paged 245366784 2359304 243007480 -1 17 [MyDriver.sys]
SIFP Nonp 7 7 0 -1 -1 [MyDriver.sys]
Иногда возникает отрицательный Diff
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
NweN Paged 529879 4784171 -4254292 -1 1 [MyDriver.sys]
PBDN Paged 43 66 -23 1 0 [MyDriver.sys]
Как это понимать? Как с этим бороться?
Я пытаюсь переименовывать теги, но каждый день появляется что-то новое.
Это происходит только на одной из виртуальных машин, используемых в тестовой установке.
Комментарии:
1. Есть ли что-нибудь особенное в этой виртуальной машине? Кроме того, вы уверены, что перед тестированием вашего драйвера необходимо перезагрузить компьютер?
2. Если посмотреть на цифры, это означает только то, что ваш драйвер освободил больше памяти, чем выделил между вашими двумя точками измерения. Allocs составляет 500 КБ, а Frees — 4,7 М. В предположении, что вы выделяете разумное распределение буферов одинакового размера, это приведет к отрицательной разнице.
Ответ №1:
В Windows существует драйвер PoolMan, он:
отображает данные, которые операционная система собирает о выделениях памяти из системных пулов ядра с выгружаемой и невыгружаемой памятью, а также пулов памяти, используемых для сеансов служб терминалов. Данные группируются по тегу распределения пула.
Разработчики драйверов и тестировщики часто используют PoolMon для обнаружения утечек памяти при создании нового драйвера, изменении кода драйвера или перенапряжении драйвера. Вы также можете использовать PoolMon на каждом этапе тестирования для просмотра шаблонов выделения и свободных операций драйвера, а также для определения объема памяти пула, используемой драйвером в любой момент времени.
Вот команды:
poolmon [/iTag] [/xTag] [/c [LocalTagFile]] [/g [PoolTagFile]] [/s[TSSessionID]] [ /p | /p /p ] [/e] [/( | /)] [/t | /a| /f| /d | /b| /m] [/l] [/n [File]] [/? | /h]
Объяснение:
Параметры
/i Отображает только распределения с указанным тегом пула. В команде PoolMon может быть несколько параметров /i. Не вводите пробел между /i и аргументом тега.
/x исключает выделения с указанным тегом из отображения. В команде PoolMon может быть несколько параметров /x. Не вводите пробел между /x и аргументом тега.
Тег Задает тег пула или шаблон тега пула. Теги пула чувствительны к регистру. Аргумент тега может включать звездочку () для представления нуля или более экземпляров любого символа или вопросительный знак (? *) для представления одного экземпляра любого символа. Не начинайте тег со звездочки.
/ c Добавляет на дисплей столбец (Mapped_Driver) со списком драйверов на локальном компьютере, которые используют каждый тег пула. Эта функция поддерживается только в 32-разрядных версиях Windows.
LocalTagFile Указывает путь и имя файла локального файла тегов, форматированного текстового файла, который содержит список драйверов на локальном компьютере, и значения тегов, которые они присваивают. Этот файл является источником данных для столбца Mapped_Driver, который появляется при использовании параметра /c. По умолчанию localtag.txt .
Если вы используете параметр /c, но не указываете значение для LocalTagFile, и PoolMon не находит localtag.txt файл в текущем каталоге, PoolMon генерирует localtag.txt файл путем сканирования драйверов на локальном компьютере (%SystemRoot% System32Drivers*.sys) .
/g Добавляет столбец на дисплей (Mapped_Driver), в котором перечислены компоненты Windows и часто используемые драйверы, которые присваивают каждому тегу.
PoolTagFile Указывает путь и имя файла форматированного текстового файла, в котором перечислены имена компонентов Windows и часто используемых драйверов, а также значения тегов, которые они присваивают. Этот файл является источником данных для столбца Mapped_Driver, который появляется при использовании параметра /g.
По умолчанию pooltag.txt файл, предоставленный корпорацией Майкрософт. Pooltag.txt включен в подкаталог Tools Other комплекта драйверов Windows (WDK).
/s Отображает распределения из пулов сеансов служб терминалов.
TSSessionID отображает только распределения из указанного пула сеансов. Не вводите пробел между параметром /s и аргументом TSSessionID.
/p Отображает только распределения из невыгружаемого пула.
/p / p Отображает только распределения из выгружаемого пула.
/ e Отображает итоговые значения пула. Итоговые значения отображаются в нижней части дисплея.
/(или /) Включает режим сортировки по изменению. С помощью /(или /) PoolMon выполняет сортировку по изменению значения (выделение, свободные операции и байты), а не по значению. Изменение каждого значения отображается в круглых скобках после значения.
Используйте с /a, /f, /b или /m. Например, poolmon /a сортирует отображение по количеству выделений, в то время как poolmon /( /a сортирует отображение по изменению количества выделений.
Символы левой и правой круглых скобок имеют одинаковый эффект и могут использоваться взаимозаменяемо.
/t Сортирует в алфавитном порядке по имени тега. Это значение по умолчанию.
/a Сортирует теги по количеству выделений.
/f Сортирует теги по количеству свободных операций.
/d Сортирует теги по разнице между выделенными байтами и освобожденными байтами.
/b Сортирует теги по используемым байтам.
/m Сортирует теги по байтам на распределение.
/l Отключает подсветку. По умолчанию PoolMon выделяет значения, которые изменились с момента последнего обновления.
/n Сохраняет снимок выходных данных PoolMon в файл, вместо отображения его в окне командной строки. Вы можете включить другие параметры командной строки для настройки вывода.
Поскольку данные моментального снимка статичны, столбцы, которые показывают изменение значений на дисплее PoolMon, не отображаются в файле моментального снимка.
File Указывает имя и расположение файла моментального снимка. По умолчанию используется poolsnap.log.
/? или /h Отображает синтаксис командной строки. Параметры /? и /h имеют одинаковый эффект и могут использоваться взаимозаменяемо.