Usar PoolMon para encontrar um vazamento de memória no modo kernel
Se você suspeitar que há um vazamento de memória no modo kernel, poderá usar a ferramenta PoolMon para determinar qual marca de pool está associada ao vazamento.
O PoolMon (Poolmon.exe) monitora o uso de memória do pool por nome da marca do pool. Essa ferramenta está incluída no WDK (Kit de Driver do Windows). Para obter mais informações, consulte PoolMon.
Configurações do pool de GFlags
Algumas configurações de GFlags, como Pool Especial, afetarão a forma como os pools de memória são usados. Para obter mais informações, consulte GFlags e Configurando o pool especial.
Usar PoolMon
O cabeçalho PoolMon exibe o total de bytes de pool paginado e não paginado. As colunas mostram o uso do pool para cada marca de pool. A exibição é atualizada automaticamente a cada poucos segundos. Por exemplo:
Memory: 16224K Avail: 4564K PageFlts: 31 InRam Krnl: 684K P: 680K
Commit: 24140K Limit: 24952K Peak: 24932K Pool N: 744K P: 2180K
## Tag Type Allocs Frees Diff Bytes Per Alloc
CM Paged 1283 ( 0) 1002 ( 0) 281 1377312 ( 0) 4901
Strg Paged 10385 ( 10) 6658 ( 4) 3727 317952 ( 512) 85
Fat Paged 6662 ( 8) 4971 ( 6) 1691 174560 ( 128) 103
MmSt Paged 614 ( 0) 441 ( 0) 173 83456 ( 0) 482
PoolMon tem chaves de comando que classificam a saída de acordo com vários critérios. Selecione a letra associada a cada comando para recorrer aos dados. Leva alguns segundos para cada comando funcionar.
Os comandos de classificação incluem:
Chave de comando | Operação |
---|---|
P | Limita as marcas mostradas a bytes de pool não paginado, bytes de pool paginado ou ambos. Pressionar P repetidamente percorre cada uma dessas opções, nessa ordem. |
B | Classifica as marcas pelo uso máximo de bytes. |
M | Classifica as marcas por alocações máximas de bytes. |
T | Classifica marcas em ordem alfabética pelo nome da marca. |
E | Faz com que a exibição inclua os totais paginado e não paginado na parte inferior. |
A | Classifica marcas por tamanho de alocação. |
F | Classifica marcas por operações gratuitas. |
S | Classifica marcas pela diferença entre alocações e liberações. |
Q | Encerra o PoolMon. |
Exibir nomes de driver no PoolMon
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 mostra o uso do parâmetro /g para adicionar a coluna Mapped_Driver.
poolmon /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"
Exibir pools específicos
Use o parâmetro /i para mostrar marcas de pool que começam com uma cadeia de caracteres específica, por exemplo , Hid.
poolmon /iHid? /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"
Memory:33473120K Avail:20055132K PageFlts: 5 InRam Krnl:10444K P:1843072K
Commit:15035764K Limit:67027552K Peak:16677444K Pool N:1023400K P:1955448K
System pool information
Tag Type Allocs Frees Diff Bytes Per Alloc Mapped_Driver
HidC Paged 1667 ( 0) 1659 ( 0) 8 896 ( 0) 112 [hidclass.sys - HID Class d
HidC Nonp 17375 ( 0) 17256 ( 0) 119 19808 ( 0) 166 [hidclass.sys - HID Class d
HidP Nonp 1014 ( 0) 998 ( 0) 16 6704 ( 0) 419 [hidparse.sys - HID Parser]
Usar o utilitário PoolMon para encontrar um vazamento de memória
Aqui está uma abordagem para encontrar um vazamento de memória com o utilitário PoolMon:
Inicie o PoolMon.
Se você tiver determinado que o vazamento está ocorrendo em um pool não paginado, selecione P uma vez. Se você determinou que ele está ocorrendo em um pool de páginas, selecione P duas vezes. Se você não souber, não selecione P, portanto, ambos os tipos de pool serão incluídos.
Selecione B para classificar a exibição pelo uso máximo de bytes.
Inicie o teste. Copie a saída da tela, por exemplo, tirando uma captura de tela e salvando-a.
Faça uma nova captura de tela a cada meia hora. Comparando capturas de tela, determine quais bytes de marca estão aumentando.
Pare o teste e aguarde algumas horas. Determine quanto da marca foi liberada neste momento.
Normalmente, depois que um aplicativo atinge um estado de execução estável, ele aloca memória e memória livre na mesma taxa. Se alocar memória mais rapidamente do que a libera, seu uso de memória aumentará ao longo do tempo. Isso geralmente indica um vazamento de memória.
Endereçar o vazamento
Depois de determinar qual marca de pool está associada ao vazamento, talvez você tenha tudo o que precisa saber sobre o vazamento. Se você precisar determinar qual instância específica da rotina de alocação está causando o vazamento, consulte Usando o depurador de kernel para encontrar vazamentos de memória no modo kernel.