Compartilhar via


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:

  1. Inicie o PoolMon.

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

  3. Selecione B para classificar a exibição pelo uso máximo de bytes.

  4. Inicie o teste. Copie a saída da tela, por exemplo, tirando uma captura de tela e salvando-a.

  5. Faça uma nova captura de tela a cada meia hora. Comparando capturas de tela, determine quais bytes de marca estão aumentando.

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