Comment puis-je déterminer la quantité de mémoire consommée par chaque pilote de périphérique? Je suppose que cela peut être fait avec une API Win32 ou .NET, mais je n'ai pas été en mesure de déterminer lequel.Mesure de l'utilisation de la mémoire des pilotes de périphérique dans Windows
Répondre
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.
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.
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
- 1. Combien de pilotes de périphérique sont disponibles pour Windows?
- 2. Mémoire de pool paginée ou mémoire de pool non paginée? (développement de pilotes Windows)
- 3. Mesure du temps d'exécution et de la mémoire utilisée
- 4. Comment mapper la mémoire de l'appelant dans un pilote de périphérique Windows CE après la fin d'un appel à XXX_IOControl?
- 5. Windows Processus inactif interférant avec la mesure de la performance
- 6. Recherche de pointeurs sur le développement de pilotes MIDI
- 7. Développement de pilotes
- 8. Surveillance des fichiers mappés de la mémoire Windows
- 9. Fichiers mappés de mémoire Windows
- 10. Utilisation de la mémoire Windows et du fichier de pages
- 11. Mesure de la surcharge de gestion des exceptions en C++
- 12. Gestion de la mémoire dans l'application C# windows
- 13. Mesure de texte dans WPF
- 14. Windows, Linux et la gestion de la mémoire
- 15. Rendre un périphérique Windows Mobile émule un périphérique Bluetooth HID
- 16. Comment obtenir l'utilisation de la mémoire sous Windows en C++
- 17. Performance des pilotes Oracle .Net
- 18. Dans la base de données de mémoire
- 19. Système de fichiers en mémoire pour Windows
- 20. ACT Professional pour Windows-fuite de mémoire?
- 21. Écrire des pilotes en C#
- 22. Déterminer l'utilisation de la mémoire des objets?
- 23. Utilisation de la mémoire dans la R
- 24. Conversion d'unité de mesure
- 25. Utilisation de la mémoire de JBoss?
- 26. Installation de Windows CE sur un périphérique embarqué x86
- 27. objets de mesure fileinfo.Length dans kbs
- 28. Windows Incompatibilités de périphérique mobile - besoin de suggestions pour l'approche des tests
- 29. Affectation d'un tableau 2D dans la mémoire du périphérique dans CUDA
- 30. Accéder à un périphérique USB sans utiliser la lettre de lecteur sous Windows
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. –