Partilhar via


Usar o Depurador de Kernel para encontrar um vazamento de memória no Modo Kernel

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:

  1. Recarregue todos os módulos usando o comando .reload (Reload Module ).

  2. 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   828384 
    
  3. Determine 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:

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

  2. 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' 
    
  3. Para verificar o valor atual de PoolHitTag, use o comando db (Display Memory):

    kd> db nt!poolhittag L4 
    820f2ba4  41 62 63 20           Abc  
    
  4. O 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.