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.
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
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.
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.
Retornando ao PoolMon, pressione a tecla p duas vezes para exibir apenas as alocações do pool nãopagado.
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.
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.
Em seguida, pare PoolMon, aguarde algumas horas e reinicie o PoolMon.
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