Compartilhar via


Exemplos do PoolMon

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

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

Exemplo 2: Exibir nomes de driver

Exemplo 3: detectar vazamento 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 do 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 de cada alocação, pressione m.

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

poolmon /p

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

Para iniciar o PoolMon e exibir dados de alocações com uma marca específica, utilize 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 um tag específico, 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 tags começando com Aud e tags de quatro caracteres começando com Cc, exceto para alocações com a tag 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 o PoolMon no modo de classificação 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 de parênteses funcionam como interruptores de alternância. Quando o PoolMon está no modo sort-by-change, 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 etiqueta específica, esse recurso ajudará você a identificar o componente ou driver problemático.

Os componentes e drivers são listados na coluna Mapped_Driver, localizada na parte mais à direita da exibição. Os dados da coluna Mapped_Driver são provenientes 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 no NtF. A coluna mais à direita na exibição, Mapped_Driver, mostra que a memória foi alocada por ntfs.sys, o driver do 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 um tag que aparece na tela não está incluído no pooltag.txt, o PoolMon exibe "Driver desconhecido" na coluna Mapped_Driver para o tag.

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 em 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 no MEM.

poolmon /i?MEM 

O comando a seguir lista as alocações para tags 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 vazamento de memória

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

  1. Inicie o PoolMon com os parâmetros /p /p (exibir somente alocações do pool paginado) e /b (ordenar por 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ão paginado.

  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 de liberação) e Bytes (número de bytes alocados menos o número de bytes liberados) para cada tag e observe qualquer um que aumente continuamente.

  7. Em seguida, pare o 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 o uso do PoolMon para investigar um vazamento de memória de pool de um driver de impressora suspeito. Neste exemplo, o PoolMon exibe dados coletados pelo Windows 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 seja 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 orienta o PoolMon a exibir informações para alocações com o tag Drsd. (As tags de pool são sensíveis a maiúsculas e 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 seu 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 que está vazando, 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, 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. Este comando exibe as alocações do pool de sessões para a sessão 0 dos Serviços de Terminal.

poolmon /s0

Em resposta, o PoolMon exibe alocações do pool de sessão para a sessão 0 dos Serviços de Terminais. 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 são inseridos, e a exibição resultante no PoolMon.

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

poolmon
Chave Resultado 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.

um

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 do pool de sessões.

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 das Sessões 1 e 0.

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

i

Solicita uma ID de sessão do Terminal Server.

10

Exibe alocações da Sessão 10.

i

Solicita uma ID de sessão do Terminal Server.

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

ENTRAR

Exibe todos os pools de sessão.

Somente os sistemas configurados como um Servidor de Terminal alocam memória do pool de sessões. Se você usar o PoolMon para exibir o pool de sessões em um computador que não seja um Servidor de Terminal ou se 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 cabeçalhos 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 de 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