Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.
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 /bDeixe 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ão paginado.
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 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.
Em seguida, pare o 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 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