2008-12-27 3 views

Répondre

1

Je sais que c'est non-trivial. Voici quelques points de départ pour des questions étroitement liées:

Vous pouvez obtenir un (probablement pas satisfaisant) commencer par utiliser VirtualQueryEx pour déterminer la mémoire utilisée par les fichiers PE, tas, etc. Voici un programme qui offre une vue Virtual memory map. Cela devrait répondre à la taille de l'image du pilote de périphérique.

La plus grande difficulté consiste à déterminer comment étiqueter la mémoire allouée dynamiquement par le code qui l'alloue. Le meilleur coup est d'utiliser quelque chose comme detours pour suivre les allocations de mémoire dynamique comme ils sont faits et marcher sur la pile pour déterminer l'orginator. Enfin, le fait que vous souhaitiez faire cela pour les pilotes de périphériques va encore plus loin. Je doute que des détours puissent être utilisés pour les pilotes de périphériques (bien que je ne sache pas vraiment). Je sais que la marche de la pile à partir d'un pilote de périphérique est hautement non-trivial. Vous pouvez également obtenir les données de ProcExp dans le SysInternals suite. Lancez-le Allez dans 'Système', allez dans Afficher/afficher le volet inférieur, activez Dll's. Ensuite, faites un clic droit sur les en-têtes de colonne et ajoutez ceux pour travailler ensemble par ex. 'WS Total'. Je ne suis pas sûr de ce que cela fait pour les étiqueter correctement. Sur ma boîte il leur donne la taille d'image mappée des conducteurs de périphérique, mais a simplement 0K dans les colonnes d'ensemble de travail. Je prends l'absence d'une réponse de procexp comme une preuve raisonnable que la résolution de ce problème ne sera pas instantanée.

Bonne chance.

+0

C'est fantastique! Process Explorer revient à nouveau. Bien que les données de l'ensemble de travail soient simplement égales à 0, on peut obtenir l'adresse de base de la mémoire physique et la taille de la carte, ce qui est un grand pas dans la bonne direction. –

12

Windows suit l'utilisation de la mémoire du pilote de périphérique avec les balises de pool. Si vous savez ce que les balises de pool le pilote en question passe à ExAllocatePoolWithTag, vous pouvez suivre son utilisation de la mémoire en utilisant des outils tels que poolmon (à partir du Kit de pilotes Windows), PoolTag (de OSR) ou WinDbg (or KD) (à partir des outils de débogage pour Windows) .

Notez que les pilotes de périphérique peuvent appeler des API de noyau qui allouent indirectement de la mémoire. Par exemple, si vous appelez le IoAllocateMdl, le gestionnaire d'E/S Windows allouera de la mémoire à une liste de descripteurs de mémoire, en utilisant une autre balise de pool affectée par le gestionnaire d'E/S Windows. Pour cette raison, les allocations effectuées pour le compte de plusieurs pilotes de périphériques peuvent tous utiliser la même balise de pool.

Si vous essayez de déterminer quel pilote est une fuite de mémoire, utilisez poolmon/pooltag/WinDbg/KD identifier la balise de pool (s) qui sont fuite. Puis attachez un débogueur de noyau (WinDbg ou KD) au système et définissez la variable nt!poolhittag à la balise de pool de fuite. La prochaine fois que ExAllocatePoolWithTag est appelée pour allouer de la mémoire avec cette balise de pool, le système pénètre dans le débogueur du noyau, et vous pouvez ensuite regarder la pile d'appels pour déterminer quel pilote effectue l'allocation. Ce processus est décrit plus en détail dans Using the Kernel Debugger to Find a Kernel-Mode Memory Leak.

+0

C'est la bonne réponse. Si vous voulez suivre un seul pilote, le programme 'vérificateur' pourrait vous aider plus facilement, il suffit d'appeler 'verifier.exe' à l'invite de commande. Avec cet outil, vous pouvez suivre un seul pilote. – Christopher

Questions connexes