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 :
Démarrez PoolMon.
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.
Sélectionnez B pour trier l’affichage par utilisation maximale d’octets.
Démarrez votre test. Copiez la sortie de l’écran, par exemple en prenant une capture d’écran et en l’enregistrant.
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.
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.