Analisando pool leak com o Poolmon

Em nosso artigo anterior apresentamos o nonpaged pool, um espaço reservado da memória utilizado pelo kernel e por drivers de dispositivos, agora vamos mostrar como identificar um leak na memória utilizando o poolmon.

O poolmon é uma ferramenta da Microsoft que vem sendo distribuída junto a diversos pacotes diferentes ao longo dos anos, atualmente pode ser baixado junto com o Windows Driver Kit. Se você instalar o WDK na pasta padrão, o poolmon estará em “C:\Program Files (x86)\Windows Kits\10\Tools\<version>” (version pode ser x86, x64, arm). O software não tem nenhuma dependência ou módulo adicional, você pode copiar ele pra outro computador se precisar investigar o uso de pool. Para mais praticidade, ele pode ser movido para a pasta “C:\Windows\System32”, assim é possível executa-lo no prompt ou no power shell sem navegar até a pasta.

Para ilustrar o funcionamento da ferramenta, iremos utilizar o NotMyFault, da suite SysInternals, que simula pool leak em paged e nonpaged pools.

Utilizando o Poolmon

O poolmon é uma ferramenta muito fácil de usar, apesar de não ser tão fácil assim de baixar. Vamos considerar que o WDK foi instalado com sucesso na pasta padrão e o poolmon não foi copiado ou movido para outro local.

  • Abra o prompt ou o power shell e navegue até a pasta em que a ferramenta está localizada:
    • cd “C:\Program Files (x86)\Windows Kits\10\Tools\x64”.

Acessando o poolmon

  • Para executar basta digitar o comando “poolmon -b” (sem aspas). O parametro “-b” executa o aplicativo e organiza os processos (na verdade é uma tag que representa um processo) em ordem de consumo, assim fica mais fácil descobrir quem é o ofensor.

Tela do poolmon

Geralmente, o primeiro processo é o responsável pelo problema no sistema operacional. No meu caso, ele tem a tag Leak e está destacado na imagem acima.

O poolmon pode ser configurado para enviar os dados para um log e, em alguns casos, pode ser interessante criar um schedule para que ele colete os dados periodicamente. Para rodar a ferramenta com essa configuração execute “poolmon -b -n log.txt”.

Depois de identificada a tag que apresenta leak, vamos descobrir qual processo a mesma representa. A tag é uma string de quatro letras usada para nomear a alocação na memória, o desenvolvedor do driver é quem escolhe a tag, que deve ser unica. Identificamos que a tag Leak é o ofensor do meu SO, agora vamos identificar qual driver está usando essa tag. Existem algumas técnicas para associar um leak e uma tag, vamos utilizar o findstr, que é bem efetivo. A maioria dos drivers fica localizada na pasta c:\windows\system32\drivers, então é um bom lugar para começar a procurar. Se você não encontrar resultado nessa pasta, vá um nível acima e tente novamente e assim até a raiz do disco. O comando para executar a busca é:

  • C:\>findstr /s Leak *.sys

Desktop\NotMyFault\x64\myfault.sys:$ À2ÁË¡\’Ë¡\’Ë¡\’Ë¡]’Ó¡\’½<‘’È¡\’½<!’É¡\’½<1’Ê¡\’ÂÙÕ’Ê¡\’ÂÙÈ’Ê¡\’ÂÙÍ’Ê¡\’RichË¡\’ PE d† ¡l€O ð ”   H           p  ó       P ( ` x @ ` ” ˆ Ð  È .text §    h.rdata |   @ H.data à 0   @ È.pdata ` @   @ HINIT  P   â.rsrc x `   @ @ fëþÌÌÌÌÌÌÌÌHƒì(è÷ÿÿÿëùÌÌÌÌÌÌÌÌÌH‰\$D¶ÚA¶ÀE‹ÈÁàA¸@ D‹ÑAÁãD ضÁD ØA‹À*ÂD‰[! ¶ØA‹ÀE*ÂA*ÁÁã¶ÈA¶ÀÁá

O resultado é cheio de de caracteres especiais, mas é fácil identificar o driver, podemos ver que é o myfault.sys, utilizado pelo nosso simulador de leak. Se você tem um problema real no seu sistema operacional é hora de busca na internet pela tag e o driver. Depois de alguma pesquisa, você deve ser capaz de identificar uma falha especifica com o driver e a solução.

Em alguns casos, o findstr pode não encontrar a tag ou mostrar múltiplos resultados, o que dificulta um pouco na hora de procurar a resolução do problema. Como comentamos, existem outras técnicas para associar drivers com tags e, nos próximos posts, tentaremos abordar algumas delas.

Espero que o artigo tenha ficado claro, mas se ficou com alguma duvida fique a vontade para comentar. Também agradecemos qualquer contribuição adicional, já que é um assunto critico quando se fala de grandes ambientes de servidores.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *