Поделиться через


Примеры PoolMon

В этом разделе приведены следующие примеры использования 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.sys, драйвером для файловой системы NTFS. В этом случае отображение еще более специфично, так как 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.

  1. Запустите PoolMon с параметрами /p /p (отображение только выделений из постраничного пула) и /b (сортировка по количеству байтов).

    poolmon /p /p /b
    
  2. Пусть PoolMon будет работать в течение нескольких часов. Так как при запуске PoolMon данные изменяются, необходимо восстановить устойчивое состояние, прежде чем данные получите надежность.

  3. Сохраните сведения, созданные PoolMon, в виде снимка экрана или путем копирования из командного окна и вставки в Блокнот.

  4. Вернувшись в PoolMon, дважды нажмите клавишу p , чтобы отобразить только выделения из пула без пачки.

  5. Повторяйте шаги 3 и 4 примерно каждые полчаса в течение по крайней мере двух часов, при этом каждый раз отображается переключение между перегружаемого и непагружаемого пула.

  6. После завершения сбора данных проверьте значения Diff (операции выделения минус свободные операции) и Bytes (количество выделенных байтов минус количество освобожденных байтов) для каждого тега и обратите внимание на то, что они постоянно увеличиваются.

  7. Затем остановите PoolMon, подождите несколько часов, а затем перезапустите PoolMon.

  8. Изучите увеличивающиеся выделения и определите, освобождены ли байты. Вероятной причиной являются выделения, которые до сих пор не были освобождены или продолжают увеличиваться в размере.

Пример 4. Изучение утечки памяти пула

В следующем примере показано использование PoolMon для исследования утечки памяти пула из предполагаемого драйвера принтера. В этом примере PoolMon отображает данные, собираемые Windows о выделении памяти с помощью тега Dsrd.

Некоторые драйверы принтера назначают тег 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.

a

Отображает выделения пула для сеанса 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