Compartilhar via


Exemplos de PoolMon

Este tópico inclui os seguintes exemplos de uso de PoolMon:

Exemplo 1: Exibir e classificar a saída de PoolMon

Exemplo 2: Exibir nomes de driver

Exemplo 3: Detectar perda de memória

Exemplo 4: Examinar um vazamento de memória do pool

Exemplo 5: Monitorar uma sessão de servidor de terminal

Exemplo 1: Exibir e classificar a saída de PoolMon

Este exemplo descreve várias maneiras de configurar a exibição PoolMon. Por padrão, o PoolMon exibe todas as alocações de memória do kernel em ordem alfanumérica por valor de marca. Você pode modificar a ordem de classificação da exibição na linha de comando ou enquanto o PoolMon estiver em execução.

O comando a seguir inicia o PoolMon:

poolmon

O comando a seguir inicia o PoolMon e classifica a exibição por número de operações gratuitas:

poolmon /f

Enquanto o poolmon está em execução, você pode usar os comandos em tempo de execução para alterar a exibição. Por exemplo, para classificar a exibição por número de bytes usados, pressione b. Para classificar por bytes por alocação, pressione m.

O comando a seguir inicia o PoolMon e exibe apenas alocações do pool nãopagado:

poolmon /p

Enquanto o PoolMon estiver em execução, pressione p para alternar entre alocações do pool paginado, do pool nãopagado ou de ambos.

Para iniciar o PoolMon e exibir dados para alocações com uma marca específica, use o parâmetro /i . O comando a seguir exibe alocações com a marca AfdB (a marca usada por afd.sys para buffers de dados).

poolmon /iAfdB

Para excluir alocações com uma marca específica, use o parâmetro /x . O comando a seguir exibe todas as alocações que não têm a marca AfdB ;

poolmon /xAfdB

Você pode usar um asterisco (*) e/ou um ponto de interrogação (?) para especificar um conjunto de marcas com os mesmos caracteres. O comando a seguir exibe alocações que têm marcas de pool começando com Afd, a marca usada por afd.sys;

poolmon /iAfd*

Um comando de inicialização do PoolMon pode incluir vários parâmetros /i e /x . O comando a seguir exibe alocações que têm marcas começando com aud e marcas de quatro caracteres começando com Cc, exceto para alocações com a marca CcBc ;

poolmon /iAud* /iCc?? /xCcBc

Você também pode classificar a exibição PoolMon pela alteração em um valor entre atualizações. O parâmetro /( coloca PoolMon no modo classificar por alteração.

O comando a seguir exibe alocações com marcas começando com Afd e classifica pela alteração nas alocações. Ele usa o parâmetro / a para classificar por número de alocações e o parâmetro /) para classificar pela alteração no número de alocações.

poolmon /iAfd* /( /a

O parâmetro /( e as teclas parênteses são opções de alternância. Quando o PoolMon está no modo classificar por alteração, ele interpreta todos os comandos de classificação como comandos para classificar pela alteração no valor. Se você pressionar uma tecla parêntese novamente, ela será classificada pelo valor .

Exemplo 2: Exibir nomes de driver

Você pode usar o parâmetro PoolMon /g para exibir os nomes dos componentes do Windows e drivers comumente usados que atribuem cada marca de pool. Se você encontrar um problema em alocações com uma marca específica, esse recurso ajudará você a identificar o componente ou driver ofensivo.

Os componentes e drivers são listados na coluna Mapped_Driver, a coluna mais à direita na exibição. Os dados da coluna Mapped_Driver vêm de pooltag.txt, um arquivo instalado com o WDK.

O comando a seguir exibe a memória alocada com marcas que começam com NtF. (Ele usa o caractere de ponto de interrogação (?) como curinga.) O parâmetro /g adiciona a coluna Mapped_Driver.

poolmon /iNtF? /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"

Você também pode copiar o arquivo pooltag.txt para o mesmo local que o poolmon. Isso permite esse uso.

poolmon /iNtF? /g

A exibição resultante lista alocações com marcas que começam em NtF. A coluna mais à direita na exibição, Mapped_Driver, mostra que a memória foi alocada por ntfs.sys, o driver para o sistema de arquivos NTFS. Nesse caso, a exibição é ainda mais específica, pois pooltag.txt inclui os arquivos de origem para alocações 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 é abrangente, mas não é uma lista completa de todas as marcas usadas no Windows. Quando uma marca que aparece na exibição não está incluída no pooltag.txt, PoolMon exibe "Driver desconhecido" na coluna Mapped_Driver da marca.

Os exemplos a seguir demonstram esse método em um sistema de 32 bits.

O comando a seguir usa o parâmetro /i para listar alocações com marcas que terminam no MEM. O parâmetro /g adiciona o nome do driver à exibição do arquivo pooltag.txt.

poolmon /i?MEM /g

A exibição resultante lista as alocações com marcas que terminam em MEM. No entanto, como as marcas MEM não estão incluídas no pooltag.txt, "Driver Desconhecido" aparece na coluna Mapped_Driver no lugar do nome do 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

O comando a seguir inicia o PoolMon. Ele usa o parâmetro /i para listar alocações com marcas que terminam em MEM.

poolmon /i?MEM 

O comando a seguir lista as alocações para marcas que começam com Ip. Ele usa o parâmetro /g , que usa o conteúdo do arquivo pooltag.txt na coluna Mapped_Driver.

poolmon /iIp* /g

Na exibição resultante, a coluna Mapped_Driver contém dados dos arquivos 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]

Exemplo 3: Detectar perda de memória

Este exemplo sugere um procedimento para usar o PoolMon para detectar uma perda de memória.

  1. Inicie o PoolMon com os parâmetros /p /p (exibir apenas alocações do pool paginado) e /b (classificar pelo número de bytes).

    poolmon /p /p /b
    
  2. Deixe o PoolMon ser executado por algumas horas. Como iniciar o PoolMon altera os dados, ele deve recuperar um estado estável antes que os dados sejam confiáveis.

  3. Salve as informações geradas pelo PoolMon, como uma captura de tela ou copiando-as da janela de comando e colando-as no Bloco de Notas.

  4. Retornando ao PoolMon, pressione a tecla p duas vezes para exibir apenas as alocações do pool nãopagado.

  5. Repita as etapas 3 e 4 aproximadamente a cada meia hora por pelo menos duas horas, alternando entre as exibições de pool paginado e não paginado a cada vez.

  6. Quando a coleta de dados for concluída, examine os valores Diff (operações de alocação menos operações livres) e Bytes (número de bytes alocados menos o número de bytes liberados) para cada marca e observe qualquer um que aumente continuamente.

  7. Em seguida, pare PoolMon, aguarde algumas horas e reinicie o PoolMon.

  8. Examine as alocações que estavam aumentando e determine se os bytes agora estão liberados. A causa provável são alocações que ainda não foram liberadas ou continuaram a aumentar de tamanho.

Exemplo 4: Examinar um vazamento de memória do pool

O exemplo a seguir demonstra como usar o PoolMon para investigar um vazamento de memória do pool de um driver de impressora suspeito. Neste exemplo, o PoolMon exibe dados que o Windows coleta sobre alocações de memória com a marca Dsrd.

Alguns drivers de impressora atribuem a marca Drsd quando alocam objetos de GDI (Interface Gráfica de Dispositivo) e memória associada. Se um driver de impressora tiver um vazamento de objeto, a memória alocada com a marca Drsd também vazará.

Nota Antes de executar as etapas neste exemplo, verifique se a impressora que você está usando não será interrompida até que você termine. Caso contrário, os resultados podem ser inválidos.

Na linha de comando, digite o seguinte:

poolmon /iDrsd

Esse comando direciona PoolMon para exibir informações para alocações com a marca Drsd. (As marcas de pool diferenciam maiúsculas de minúsculas, portanto, digite o comando exatamente como mostrado.)

Registre os valores nas colunas Diff e Bytes. Na exibição de exemplo a seguir, o valor de Diff é 21 e o número de Bytes é 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 

Envie um trabalho para a impressora, aguarde brevemente que o Windows retorne ao normal e registre os valores das colunas Diff e 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  

Quando o gerenciamento de memória do driver de impressora estiver funcionando corretamente, o valor de Diff deverá retornar ao valor original de 21 após a impressão. No entanto, como ilustra a saída anterior, o valor de Diff subiu para 27 e o número de Bytes subiu para 22464. A diferença entre a saída inicial e subsequente significa que seis blocos Drsd, com um total de 4992 bytes, vazaram durante a impressão.

Para obter mais informações

Se você acredita ter identificado um driver de vazamento, acesse o site de suporte da Microsoft e pesquise artigos relevantes na Base de Dados de Conhecimento ou entre em contato com o fornecedor se esse for um driver de terceiros.

Exemplo 5: Monitorar uma sessão de servidor de terminal

Este exemplo mostra várias maneiras de exibir alocações dos pools de sessão dos Serviços de Terminal. Ele demonstra o uso do parâmetro de linha de comando /s e os parâmetros s, TSSessionID e i em execução.

O comando a seguir exibe alocações de todos os pools de sessão dos Serviços de Terminal. Neste exemplo, o computador local, que é configurado como um Servidor de Terminal, está hospedando as sessões e os computadores cliente estão usando o recurso área de trabalho remota para se conectar ao host.

poolmon /s

Em resposta, o PoolMon exibe alocações de todos os pools de sessão. Observe o título "Todas as informações do pool de sessões" no cabeçalho.

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
 ...

Para ver as alocações de um pool de sessão específico, digite a ID da sessão imediatamente após o parâmetro /s , conforme mostrado no comando a seguir. Esse comando exibe alocações de pool de sessão para a sessão 0 dos Serviços de Terminal.

poolmon /s0

Em resposta, PoolMon exibe alocações do pool de sessão para a sessão 0 dos Serviços de Terminal. Observe o título "Informações do pool da Sessão 0" no cabeçalho.

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
 ...

Para ajudar a determinar quais drivers e componentes estão alocando memória do pool de sessão, adicione o parâmetro /g , conforme mostrado no comando a seguir. O parâmetro /g adiciona uma coluna Mapped_Driver listando os componentes e drivers do Windows que atribuem cada marca.

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]

Você também pode configurar a exibição do pool de sessões dos Serviços de Terminal enquanto o PoolMon está em execução. A tabela a seguir mostra uma série de comandos em execução, na ordem em que eles são digitado e a exibição poolMon resultante.

A série começa com um comando para iniciar o PoolMon. Todos os outros parâmetros são digitado enquanto PoolMon está em execução.

poolmon
Chave Result Descrição

s

Exibe todos os pools de sessão.

s

Exibe os pools do sistema.

O parâmetro s alterna a exibição entre os pools do sistema e os pools de sessão dos Serviços de Terminal.

0

Exibe o pool da sessão 0.

Você pode digitar uma ID de sessão ao exibir os pools do sistema.

7

Exibe o pool da sessão 7.

a

Exibe alocações de pool para a sessão 7, classificadas por número de alocações.

Todos os parâmetros de execução padrão são válidos para exibições de pool de sessão.

0

Exibe alocações para a sessão 0, classificadas por número de alocações.

As opções de sessão e classificação são mantidas até serem alteradas.

s

Exibe os pools do sistema.

s

Exibe alocações para a sessão 0, classificadas por número de alocações.

A opção de sessão é mantida.

10ENTER

Exibe as alocações da Sessão 1 e exibe as alocações da Sessão 0.

Sem i, você pode inserir apenas IDs de sessão de 0 a 9.

i

Solicita uma ID de sessão do Servidor de Terminal.

10

Exibe alocações da Sessão 10.

i

Solicita uma ID de sessão do Servidor de Terminal.

Para exibir todos os pools de sessão, pressione i e pressione ENTER.

ENTER

Exibe todos os pools de sessão.

Somente os sistemas configurados como um Servidor de Terminal alocam memória do pool de sessão. Se você usar PoolMon para exibir o pool de sessão em um computador que não seja um Servidor de Terminal ou se você digitar uma ID de sessão que não existe no Windows, o PoolMon não exibirá nenhuma alocação. Em vez disso, ele exibe apenas os títulos com dados gerais de memória.

O comando a seguir exibe alocações de todos os pools de sessão dos Serviços de Terminal:

poolmon /s

A figura a seguir mostra a exibição PoolMon que resultaria se o comando /s fosse enviado para um computador executando o Windows XP que não pôde ser configurado como um Servidor terminal:

 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