Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O depurador do kernel determina a localização precisa de uma fuga de memória em modo kernel.
Ativar marcação de pool
Você deve primeiro usar GFlags para habilitar a marcação de pool. O GFlags está incluído nas Ferramentas de Depuração para Windows. Inicie o GFlags, escolha a guia Registro do Sistema , marque a caixa Habilitar Marcação de Pool e selecione Aplicar. Tem de reiniciar o Windows para que esta definição tenha efeito.
No Windows Server 2003 e versões posteriores do Windows, a marcação de pool está sempre habilitada.
Determinando a tag de pool do vazamento
Para determinar qual tag de pool está associada ao vazamento, geralmente é mais fácil usar a ferramenta PoolMon para esta etapa. Para obter detalhes, consulte Usando o PoolMon para localizar fugas de memória Kernel-Mode.
Como alternativa, você pode usar o depurador do kernel para procurar tags associadas a grandes alocações de pool. Para fazer isso, siga este procedimento:
Recarregue todos os módulos usando o comando .reload (Reload Module ).
Utilize a extensão !poolused. Inclua o sinalizador "4" para classificar a saída por uso de memória paginada:
kd> !poolused 4 Sorting by Paged Pool Consumed Pool Used: NonPaged Paged Tag Allocs Used Allocs Used Abc 0 0 36405 33930272 Tron 0 0 552 7863232 IoN7 0 0 10939 998432 Gla5 1 128 2222 924352 Ggb 0 0 22 828384Determine qual tag de pool está associada ao maior uso de memória. Neste exemplo, o driver que usa a tag "Abc" está usando a maior parte da memória - quase 34 MB. Portanto, é mais provável que o vazamento de memória esteja nesse driver.
Encontrando o vazamento
Depois de determinar a tag do pool associada ao vazamento, siga este procedimento para localizar o vazamento em si:
Use o comando ed (Enter Values) para modificar o valor da variável de sistema global PoolHitTag. Essa variável global faz com que o depurador quebre sempre que uma tag de pool correspondente ao seu valor é usada.
Defina PoolHitTag igual à tag que você suspeita ser a fonte do vazamento de memória. O nome do módulo "nt" deve ser especificado para uma resolução de símbolos mais rápida. O valor da tag deve ser inserido no formato little-endian (ou seja, para trás). Como as tags de pool são sempre quatro caracteres, essa tag é na verdade A-b-c-space, não apenas A-b-c. Portanto, use o seguinte comando:
kd> ed nt!poolhittag ' cbA'Para verificar o valor atual de PoolHitTag, use o comando db (Display Memory):
kd> db nt!poolhittag L4 820f2ba4 41 62 63 20 AbcO depurador quebrará toda vez que o pool for alocado ou liberado com a tag Abc. Sempre que o depurador interromper em uma dessas alocações ou operações de liberação, use o comando do depurador kb (Display Stack Backtrace) para exibir o traço de pilha.
Usando este procedimento, você pode determinar qual código residente na memória está superalocando pool com a tag Abc.
Para limpar o ponto de interrupção, defina PoolHitTag como zero:
kd> ed nt!poolhittag 0
Se houver vários locais diferentes onde a memória com essa tag está sendo alocada e eles estão em um aplicativo ou driver que você escreveu, você pode alterar seu código-fonte para usar tags exclusivas para cada uma dessas alocações.
Se você não pode recompilar o programa, mas deseja determinar qual dos vários locais possíveis no código está causando o vazamento, você pode desmontar o código em cada local e usar o depurador para editar esse código residente na memória para que cada instância use uma tag de pool distinta (e não usada anteriormente). Em seguida, permita que o sistema funcione por vários minutos ou mais. Depois de algum tempo, entre novamente com o depurador e use a extensão !poolfind para encontrar todas as alocações de pool associadas a cada uma das novas tags.