Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе приведены следующие примеры использования PoolMon:
Пример 1. Отображение и сортировка вывода PoolMon
Пример 2. Отображение имен драйверов
Пример 3. Обнаружение утечки памяти
Пример 4. Проверка утечки памяти пула
Пример 5. Мониторинг сеанса сервера терминала
Пример 1. Отображение и сортировка выходных данных PoolMon
В этом примере описаны различные способы настройки отображения PoolMon. По умолчанию PoolMon отображает все выделения памяти ядра в буквенно-цифровом порядке по значению тега. Вы можете изменить порядок сортировки отображения в командной строке или во время выполнения PoolMon.
Следующая команда запускает PoolMon:
poolmon
Следующая команда запускает PoolMon и сортирует отображение по количеству бесплатных операций:
poolmon /f
Во время выполнения poolmon можно использовать команды для изменения отображения. Например, чтобы отсортировать отображение по количеству использованных байтов, нажмите клавишу B. Чтобы отсортировать по количеству байт на каждое выделение, нажмите M.
Следующая команда запускает PoolMon и отображает только выделения из непагированного пула:
poolmon /p
Во время работы PoolMon нажмите клавишу P, чтобы переключаться между отображением выделений страничного пула, нестраничного пула или обоих.
Чтобы запустить PoolMon и отобразить данные для выделения с определенным тегом, используйте параметр /i . Следующая команда отображает выделения с тегом AfdB (тег, используемый afd.sys для буферов данных).
poolmon /iAfdB
Чтобы исключить выделения с определенным тегом, используйте параметр /x . Следующая команда отображает все аллокирования, которые не имеют тега AfdB;
poolmon /xAfdB
Можно использовать звездочку (*) и /или вопросительный знак (?) для указания набора тегов с одинаковыми символами. Следующая команда отображает выделения с тегами пула, начинающимися с Afd, тег, используемый afd.sys;
poolmon /iAfd*
Команда запуска PoolMon может включать несколько параметров /i и /x . Следующая команда отображает выделения с тегами, начинающимися с Aud и четырехзначными тегами, начиная с Cc, за исключением выделения с тегом CcBc ;
poolmon /iAud* /iCc?? /xCcBc
Вы также можете отсортировать отображение PoolMon по изменению значения между обновлениями. Параметр /( помещает PoolMon в режим сортировки по изменению.
Следующая команда отображает выделения с тегами, начиная с Afd, и сортирует по изменению выделения. Он использует параметр /a для сортировки по количеству выделений и параметру /) для сортировки по изменению количества выделений.
poolmon /iAfd* /( /a
Параметр /( и клавиши круглых скобок — переключатели. Когда PoolMon находится в режиме сортировки по изменению, он интерпретирует все команды сортировки как команды для сортировки по изменению значения. При повторном нажатии клавиши круглых скобок он сортируется по значению.
Пример 2. Отображение имен драйверов
Параметр PoolMon /g можно использовать для отображения имен компонентов Windows и часто используемых драйверов, назначающих каждый тег пула. Если возникает проблема с выделением с определенным тегом, эта функция помогает определить, какой компонент или драйвер является источником проблемы.
Компоненты и драйверы перечислены в столбце Mapped_Driver правой части экрана. Данные для столбца Mapped_Driver поступают из pooltag.txt, файл, установленный с помощью WDK.
Следующая команда отображает память, выделенную тегами, начинающимися с NtF. (Он использует знак вопроса (?) в качестве подстановочного знака.) Параметр /g добавляет столбец Mapped_Driver.
poolmon /iNtF? /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"
Вы также можете скопировать файл pooltag.txt в то же самое расположение, что и poolmon. Это позволяет использовать эту возможность.
poolmon /iNtF? /g
В результате отображается список выделений с тегами, начинающихся с NtF. Самый правый столбец на экране, Mapped_Driver, показывает, что память была выделена драйвером файловой системы NTFS ntfs.sys. В этом случае экран еще более специфичный, так как pooltag.txt включает исходные файлы распределений NTFS.
Memory: 260620K Avail: 65152K PageFlts: 85 InRam Krnl: 2116K P:19560K
Commit: 237688K Limit: 640916K Peak: 260632K Pool N: 8500K P:33024K
System pool information
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
NtFA Nonp 9112 ( 0) 9112 ( 0) 0 0 ( 0) 0 [ntfs.sys - AttrSup.c]
NtFB Paged 3996 ( 0) 3986 ( 0) 10 252088 ( 0) 25208 [ntfs.sys - BitmpSup.c]
NtFC Paged 1579279 ( 0) 1579269 ( 0) 10 640 ( 0) 64 [ntfs.sys - Create.c]
NtFD Nonp 13 ( 0) 13 ( 0) 0 0 ( 0) 0 [ntfs.sys - DevioSup.c]
NtFF Paged 1128 ( 0) 1128 ( 0) 0 0 ( 0) 0 [ntfs.sys - FileInfo.c]
NtFI Nonp 152 ( 0) 152 ( 0) 0 0 ( 0) 0 [ntfs.sys - IndexSup.c]
NtFL Nonp 68398 ( 0) 68390 ( 0) 8 27280 ( 0) 3410 [ntfs.sys - LogSup.c]
NtFS Paged 2915 ( 0) 2614 ( 0) 301 80192 ( 0) 266 [ntfs.sys - SecurSup.c]
NtFa Paged 838 ( 0) 829 ( 0) 9 288 ( 0) 32 [ntfs.sys - AllocSup.c]
NtFd Paged 137696 ( 0) 137688 ( 0) 8 720 ( 0) 90 [ntfs.sys - DirCtrl.c]
NtFf Nonp 2 ( 0) 1 ( 0) 1 40 ( 0) 40 [ntfs.sys - FsCtrl.c]
NtFs Nonp 48825 ( 0) 47226 ( 0) 1599 64536 ( 0) 40 [ntfs.sys - StrucSup.c]
NtFv Paged 551 ( 0) 551 ( 0) 0 0 ( 0) 0 [ntfs.sys - ViewSup.c]
Pooltag.txt является обширным, но это не полный список всех тегов, используемых в Windows. Если тег, отображаемый в дисплее, не включен в pooltag.txt, PoolMon отображает "Неизвестный драйвер" в столбце Mapped_Driver для тега.
В следующих примерах демонстрируется этот метод в 32-разрядной системе.
Следующая команда использует параметр /i для перечисления выделений с тегами, которые заканчиваются на MEM. Параметр /g добавляет имя драйвера в отображение из файла pooltag.txt.
poolmon /i?MEM /g
В результате отображается список выделений с тегами, оканчивающимися на MEM. Тем не менее, так как теги MEM не включены в pooltag.txt, в столбце Mapped_Driver вместо имени драйвера отображается неизвестный драйвер.
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
1MEM Nonp 1 ( 0) 0 ( 0) 1 3344 ( 0) 3344 Unknown Driver
2MEM Nonp 1 ( 0) 0 ( 0) 1 3944 ( 0) 3944 Unknown Driver
3MEM Nonp 3 ( 0) 0 ( 0) 3 248 ( 0) 82 Unknown Driver
Следующая команда запускает PoolMon. Он использует параметр /i для создания списка выделений с тегами, заканчивающимися на MEM.
poolmon /i?MEM
Следующая команда выводит список выделений для тегов, начиная с IP- адреса. Он использует параметр /g , который использует содержимое файла pooltag.txt в столбце Mapped_Driver.
poolmon /iIp* /g
В результирующем отображении столбец Mapped_Driver содержит данные из pooltag.txt файлов.
Memory: 130616K Avail: 23692K PageFlts: 146 InRam Krnl: 2108K P: 9532K
Commit: 187940K Limit: 318628K Peak: 192000K Pool N: 8372K P:13384K
System pool information
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
IpEQ Nonp 1 ( 0) 0 ( 0) 1 1808 ( 0) 1808 [ipsec][ipsec.sys - event queue]
IpFI Nonp 26 ( 0) 0 ( 0) 26 7408 ( 0) 284 [ipsec][ipsec.sys - Filter blocks]
IpHP Nonp 1 ( 0) 1 ( 0) 0 0 ( 0) 0 [ipsec.sys - IP Security]
IpIO Nonp 1 ( 0) 1 ( 0) 0 0 ( 0) 0 [ipsec]
IpLA Nonp 1 ( 0) 0 ( 0) 1 248 ( 0) 248 [ipsec][ipsec.sys - lookaside lists]
IpSH Nonp 1 ( 0) 1 ( 0) 0 0 ( 0) 0 [ipsec.sys - IP Security]
IpSI Nonp 1027 ( 0) 0 ( 0) 1027 53272 ( 0) 51 [ipsec][ipsec.sys - initial allcoations]
IpTI Nonp 3 ( 0) 0 ( 0) 3 5400 ( 0) 1800 [ipsec][ipsec.sys - timers]
Пример 3. Обнаружение утечки памяти
В этом примере предполагается процедура использования PoolMon для обнаружения утечки памяти.
Запустите PoolMon с параметрами /p /p (отображение только выделения из страничного пула) и /b (сортировка по количеству байтов).
poolmon /p /p /bПусть poolMon работает в течение нескольких часов. Так как запуск PoolMon изменяет данные, он должен восстановить устойчивое состояние, прежде чем данные являются надежными.
Сохраните сведения, созданные PoolMon, в виде снимка экрана или скопируйте его из командного окна и вставьте его в Блокнот.
Вернитесь в PoolMon, дважды нажимайте клавишу P , чтобы отобразить только выделения из непагированного пула.
Повторяйте шаги 3 и 4 примерно каждые полчаса в течение не менее двух часов, каждый раз переключаясь между отображениями страничного и нескомпоновочного пула.
После завершения сбора данных проверьте значения Diff (операции выделения минус операции освобождения) и Bytes (число выделенных байтов минус число освобожденных байтов) для каждого тега и обратите внимание на те, которые постоянно увеличиваются.
Затем остановите PoolMon, подождите несколько часов, а затем перезапустите PoolMon.
Изучите выделения, которые увеличивались, и определите, освобождены ли теперь байты. Вероятно, это выделения, которые до сих пор не были освобождены или продолжали увеличиваться в размере.
Пример 4. Изучите утечку памяти пула
В следующем примере показано, как использовать PoolMon для исследования утечки памяти пула предположительно вызванной драйвером принтера. В этом примере PoolMon отображает данные о выделении памяти с тегом Dsrd, собираемые Windows.
Некоторые драйверы принтера назначают тег drsd при выделении объектов графического интерфейса устройства (GDI) и связанной памяти. Если у драйвера принтера происходит утечка объектов, память, выделенная с тегом Drsd, также будет утекать.
Заметка Прежде чем выполнять шаги в этом примере, убедитесь, что используемый принтер не будет прерван до завершения печати. В противном случае результаты могут быть недопустимыми.
В командной строке введите следующую команду:
poolmon /iDrsd
Эта команда вызывает PoolMon, который отображает информацию о выделениях с тегом Drsd. (Теги пула чувствительны к регистру, поэтому обязательно введите команду, как показано.)
Запишите значения в столбцах Diff и Bytes. В следующем примере отображается значение Diff равно 21, а число байтов — 17472.
Memory: 130480K Avail: 91856K PageFlts: 1220 InRam Krnl: 2484K P: 7988K
Commit: 30104K Limit: 248432K Peak: 34028K Pool N: 2224K P: 8004K
Tag Type Allocs Frees Diff Bytes Per Alloc
Drsd Paged 560 ( 177) 539 ( 171) 21 17472 ( 4992) 832
Отправьте задание на принтер, подождите кратко, пока Windows вернется в нормальное состояние, а затем запишите значения для столбцов Diff и Bytes.
Memory: 130480K Avail: 91808K PageFlts: 1240 InRam Krnl: 2488K P: 7996K
Commit: 30152K Limit: 248432K Peak: 34052K Pool N: 2224K P: 8012K
Tag Type Allocs Frees Diff Bytes Per Alloc
Drsd Paged 737 ( 0) 710 ( 0) 27 22464 ( 0) 832
Когда управление памятью драйвера принтера работает правильно, значение Diff должно вернуться к исходному значению 21 после печати. Однако как показано в предыдущих результатах, значение Diff выросло до 27, а число байтов увеличилось до 22464. Разница между начальными и последующими выходными данными означает, что шесть блоков Drsd, общим объемом 4992 байта, утекли во время печати.
Дополнительные сведения
Если вы считаете, что вы определили утечку драйвера, перейдите на веб-сайт поддержки Майкрософт и найдите базу знаний для соответствующих статей или обратитесь к поставщику, если это сторонний драйвер.
Пример 5. Мониторинг сеанса сервера терминала
В этом примере показано несколько способов отображения распределений из пулов сеансов служб удалённых рабочих столов. В нем демонстрируется использование параметра командной строки /s, а также рабочих параметров s, TSSessionID и i.
Следующая команда отображает выделения из всех пулов сеансов служб терминалов. В этом примере локальный компьютер, настроенный как сервер терминала, размещает сеансы, а клиентские компьютеры используют функцию удаленного рабочего стола для подключения к узлу.
poolmon /s
В ответ PoolMon отображает распределения из всех пулов сеансов. Запишите заголовок "Все сведения о пуле сеансов" в заголовке.
Memory: 523572K Avail: 233036K PageFlts: 344 InRam Krnl: 1828K P:18380K
Commit: 193632K Limit:1279764K Peak: 987356K Pool N:14332K P:18644K
All sessions pool information
Tag Type Allocs Frees Diff Bytes Per Alloc
Bmfd Paged 361 ( 0) 336 ( 0) 25 57832 ( 0) 2313
DDfb Paged 34 ( 0) 22 ( 0) 12 720 ( 0) 60
Dddp Paged 8 ( 0) 6 ( 0) 2 272 ( 0) 136
Dh 1 Paged 24 ( 0) 24 ( 0) 0 0 ( 0) 0
Dh 2 Paged 344 ( 0) 344 ( 0) 0 0 ( 0) 0
Dvgr Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0
GDev Paged 108 ( 0) 102 ( 0) 6 20272 ( 0) 3378
GFil Paged 29 ( 0) 27 ( 0) 2 160 ( 0) 80
GPal Paged 11 ( 0) 8 ( 0) 3 816 ( 0) 272
GTmp Paged 88876 ( 1) 88876 ( 1) 0 0 ( 0) 0
GUma Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0
Galp Paged 3250 ( 0) 3250 ( 0) 0 0 ( 0) 0
Gbaf Paged 9829 ( 0) 9801 ( 0) 28 19712 ( 0) 704
Gcac Paged 3761 ( 0) 3706 ( 0) 55 288968 ( 0) 5253
Gcsl Paged 1 ( 0) 0 ( 0) 1 488 ( 0) 488
Gdbr Paged 6277 ( 0) 6271 ( 0) 6 1872 ( 0) 312
...
Чтобы просмотреть выделение из определенного пула сеансов, введите идентификатор сеанса сразу после параметра /s , как показано в следующей команде. Эта команда отображает выделения пула сеансов для сеанса 0 служб терминалов.
poolmon /s0
В ответ PoolMon отображает выделения из пула сеансов для сеанса Службы терминалов 0. Обратите внимание на заголовок "Сведения о пуле сеанса 0" в верхней части страницы.
Memory: 523572K Avail: 233024K PageFlts: 525 InRam Krnl: 1828K P:18384K
Commit: 193760K Limit:1279764K Peak: 987356K Pool N:14340K P:18644K
Session 0 pool information
Tag Type Allocs Frees Diff Bytes Per Alloc
Bmfd Paged 361 ( 0) 336 ( 0) 25 57832 ( 0) 2313
DDfb Paged 34 ( 0) 22 ( 0) 12 720 ( 0) 60
Dddp Paged 8 ( 0) 6 ( 0) 2 272 ( 0) 136
Dh 1 Paged 24 ( 0) 24 ( 0) 0 0 ( 0) 0
Dh 2 Paged 344 ( 0) 344 ( 0) 0 0 ( 0) 0
Dvgr Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0
GDev Paged 108 ( 0) 102 ( 0) 6 20272 ( 0) 3378
GFil Paged 29 ( 0) 27 ( 0) 2 160 ( 0) 80
GPal Paged 11 ( 0) 8 ( 0) 3 816 ( 0) 272
GTmp Paged 89079 ( 99) 89079 ( 99) 0 0 ( 0) 0
GUma Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0
Galp Paged 3250 ( 0) 3250 ( 0) 0 0 ( 0) 0
Gbaf Paged 9830 ( 0) 9802 ( 0) 28 19712 ( 0) 704
Gcac Paged 3762 ( 0) 3707 ( 0) 55 283632 ( 0) 5156
Gcsl Paged 1 ( 0) 0 ( 0) 1 488 ( 0) 488
Gdbr Paged 6280 ( 0) 6274 ( 0) 6 1872 ( 0) 312
...
Чтобы определить, какие драйверы и компоненты распределяют память из пула сеансов, добавьте параметр /g, как показано в следующей команде. Параметр /g добавляет столбец Mapped_Driver с описанием компонентов и драйверов Windows, назначающих каждый тег.
poolmon /s0 /g
Memory: 523572K Avail: 235876K PageFlts: 43 InRam Krnl: 1900K P:18860K
Commit: 185040K Limit:1279764K Peak: 987356K Pool N:14684K P:19124K
Session 0 pool information
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
Bmfd Paged 421 ( 0) 396 ( 0) 25 57832 ( 0) 2313 [Font related stuff]
DDfb Paged 34 ( 0) 22 ( 0) 12 720 ( 0) 60 Unknown Driver
Dddp Paged 11 ( 0) 6 ( 0) 5 392 ( 0) 78 Unknown Driver
Dh 1 Paged 37 ( 0) 35 ( 0) 2 224 ( 0) 112 Unknown Driver
Dh 2 Paged 367 ( 0) 364 ( 0) 3 912 ( 0) 304 Unknown Driver
Dvgr Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0 [vga for risc video driver]
GDev Paged 119 ( 0) 113 ( 0) 6 20272 ( 0) 3378 [Gdi pdev]
GFil Paged 29 ( 0) 27 ( 0) 2 160 ( 0) 80 [Gdi engine descriptor list]
GPal Paged 11 ( 0) 8 ( 0) 3 816 ( 0) 272 [Gdi Objects]
GTmp Paged 98626 ( 1) 98626 ( 1) 0 0 ( 0) 0 [Gdi Objects]
GUma Paged 2 ( 0) 2 ( 0) 0 0 ( 0) 0 [Gdi Objects]
Galp Paged 3250 ( 0) 3250 ( 0) 0 0 ( 0) 0 [Gdi Objects]
Gbaf Paged 10331 ( 0) 10305 ( 0) 26 18304 ( 0) 704 [Gdi Objects]
Gcac Paged 4722 ( 0) 4666 ( 0) 56 305400 ( 0) 5453 [Gdi glyph cache]
Gcsl Paged 1 ( 0) 0 ( 0) 1 488 ( 0) 488 [Gdi string resource script names]
Gdbr Paged 6972 ( 0) 6965 ( 0) 7 2184 ( 0) 312 [Gdi driver brush realization]
Вы также можете настроить отображение пула сеансов служб терминалов во время работы PoolMon. В следующей таблице показан ряд выполняемых команд, в том порядке, в котором они вводятся, и результирующий экран PoolMon.
Серия начинается с команды для запуска PoolMon. Все остальные параметры вводимы во время работы PoolMon.
poolmon
| Ключ | Результат | Описание |
|---|---|---|
s |
Отображает все пулы сеансов. |
|
s |
Отображает системные пулы. |
Параметр s переключает отображение между системным пулами и пулами сеансов служб терминалов. |
0 |
Отображает пул сеанса 0. |
При отображении системных пулов можно ввести идентификатор сеанса. |
7 |
Отображает пул сеанса 7. |
|
а |
Отображает выделения пула для сеанса 7, отсортированные по количеству выделений. |
Все стандартные действующие параметры применимы для пула сеансов. |
0 |
Отображает выделения для сеанса 0, отсортированные по количеству выделений. |
Параметры сеанса и сортировки сохраняются до изменения. |
s |
Отображает системные пулы. |
|
s |
Отображает выделения для сеанса 0, отсортированные по количеству выделений. |
Параметр сеанса сохраняется. |
10ENTER |
Отображает распределения сеанса 1, а затем отображает распределения сеанса 0. |
Без i можно ввести только идентификаторы сеансов от 0 до 9. |
i |
Запрашивает идентификатор сеанса сервера терминала. |
|
10 |
Отображает распределения для сеанса 10. |
|
i |
Запрашивает идентификатор сеанса сервера терминала. |
Чтобы отобразить все пулы сеансов, нажмите I и затем клавишу ВВОД. |
ВВОД |
Отображает все пулы сеансов. |
Только системы, настроенные в качестве сервера терминалов, выделяют память из пула сеансов. Если вы используете PoolMon для отображения пула сеансов на компьютере, который не является сервером терминалов, или если вы вводите идентификатор сеанса, который не существует в Windows, PoolMon не отображает выделения. Вместо этого он отображает только заголовки с общими данными памяти.
Следующая команда отображает выделения из всех пулов сеансов служб терминалов:
poolmon /s
На следующей иллюстрации показан дисплей PoolMon, который получится, если команда /s отправлена на компьютер с Windows XP, который не может быть настроен в качестве сервера терминалов.
Memory: 260620K Avail: 44956K PageFlts: 308 InRam Krnl: 2744K P:20444K
Commit: 185452K Limit: 640872K Peak: 192472K Pool N: 8112K P:20648K
All sessions pool information
Tag Type Allocs Frees Diff Bytes Per Alloc