Partager via


Utiliser PoolMon pour rechercher une fuite de mémoire en mode noyau

Si vous pensez qu’il y a une fuite de mémoire en mode noyau, vous pouvez utiliser l’outil PoolMon pour déterminer la balise de pool associée à la fuite.

PoolMon (Poolmon.exe) surveille l’utilisation de la mémoire du pool par nom de balise de pool. Cet outil est inclus dans le Kit de pilotes Windows (WDK). Pour plus d’informations, consultez PoolMon.

Paramètres du pool GFlags

Certains paramètres GFlags, tels que le pool spécial, ont un impact sur la façon dont les pools de mémoire sont utilisés. Pour plus d’informations, consultez GFlags et Configuration d’un pool spécial.

Utiliser PoolMon

L’en-tête PoolMon affiche le nombre total d’octets de pool paginés et non paginés. Les colonnes indiquent l’utilisation du pool pour chaque balise de pool. L’affichage est mis à jour automatiquement toutes les quelques secondes. Par exemple :

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 a des clés de commande qui trient la sortie en fonction de différents critères. Sélectionnez la lettre associée à chaque commande pour utiliser les données. Le fonctionnement de chaque commande prend quelques secondes.

Les commandes de tri sont les suivantes :

Clé de commande Opération
P Limite les balises affichées aux octets de pool non paginés, aux octets de pool paginés ou aux deux. Appuyez à plusieurs reprises sur P pour parcourir chacune de ces options, dans cet ordre.
B Trie les balises en fonction de l’utilisation maximale d’octets.
M Trie les balises par allocations d’octets maximales.
T Trie les étiquettes par ordre alphabétique par nom de balise.
E Entraîne l’affichage à inclure les totaux paginés et non paginés dans le bas.
A Trie les balises par taille d’allocation.
F Trie les balises par opérations libres.
S Trie les balises en fonction de la différence entre les allocations et les libres.
Q Quitte PoolMon.

Afficher les noms des pilotes dans PoolMon

Vous pouvez utiliser le paramètre PoolMon /g pour afficher les noms des composants Windows et des pilotes couramment utilisés qui attribuent chaque balise de pool. Si vous rencontrez un problème dans les allocations avec une balise particulière, cette fonctionnalité vous aide à identifier le composant ou le pilote incriminé.

Les composants et les pilotes sont répertoriés dans la colonne Mapped_Driver, la colonne la plus à droite de l’affichage. Les données de la colonne Mapped_Driver proviennent de pooltag.txt, un fichier installé avec le WDK.

La commande suivante montre l’utilisation du paramètre /g pour ajouter la colonne Mapped_Driver.

poolmon /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"

Afficher des pools spécifiques

Utilisez le paramètre /i pour afficher les balises de pool qui commencent par une chaîne spécifique, par exemple 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]

Utiliser l’utilitaire PoolMon pour rechercher une fuite de mémoire

Voici une approche pour rechercher une fuite de mémoire avec l’utilitaire PoolMon :

  1. Démarrez PoolMon.

  2. Si vous avez déterminé que la fuite se produit dans un pool non paginé, sélectionnez P une fois. Si vous avez déterminé qu’il se produit dans un pool paginé, sélectionnez P deux fois. Si vous ne le savez pas, ne sélectionnez pas P, afin que les deux types de pool soient inclus.

  3. Sélectionnez B pour trier l’affichage par utilisation maximale d’octets.

  4. Démarrez votre test. Copiez la sortie de l’écran, par exemple en prenant une capture d’écran et en l’enregistrant.

  5. Prenez une nouvelle capture d’écran toutes les demi-heures. En comparant les captures d’écran, déterminez les octets de la balise qui augmentent.

  6. Arrêtez votre test et attendez quelques heures. Déterminez la quantité de la balise libérée pendant cette période.

En règle générale, une fois qu’une application atteint un état d’exécution stable, elle alloue de la mémoire et de la mémoire libre au même rythme. S’il alloue de la mémoire plus rapidement qu’il ne la libère, son utilisation de la mémoire augmente au fil du temps. Cela indique souvent une fuite de mémoire.

Résoudre la fuite

Une fois que vous avez déterminé la balise de pool associée à la fuite, vous avez peut-être tout ce que vous devez savoir sur la fuite. Si vous devez déterminer quelle instance spécifique de la routine d’allocation est à l’origine de la fuite, consultez Utilisation du débogueur de noyau pour rechercher les fuites de mémoire en mode noyau.