2008-12-27 16 views
9

में डिवाइस ड्राइवरों के मेमोरी उपयोग को मापना मैं कैसे निर्धारित कर सकता हूं कि प्रत्येक डिवाइस चालक कितनी मेमोरी खा रहा है? मुझे लगता है कि यह कुछ Win32 या .NET API के साथ किया जा सकता है, लेकिन मैं बस यह निर्धारित करने में सक्षम नहीं हूं।विंडोज

उत्तर

1

मुझे पता है कि यह गैर-तुच्छ है। यहाँ निकट से संबंधित प्रश्नों के लिए कुछ शुरुआती बिंदु हैं:

आप एक (संभावना असंतोषजनक) प्राप्त कर सकते हैं VirtualQueryEx का उपयोग कर पीई फ़ाइलें, ढेर, आदि के द्वारा प्रयोग किया स्मृति का निर्धारण करने के द्वारा शुरू यहाँ एक कार्यक्रम के एक Virtual memory map दृश्य प्रदान करता है। यह डिवाइस चालक के छवि आकार का जवाब देना चाहिए।

बड़ी कठिनाई यह निर्धारित करने में है कि इसे आवंटित करने वाले कोड द्वारा गतिशील रूप से आवंटित स्मृति को कैसे टैग किया जाए। सबसे अच्छा शॉट detours जैसे कुछ गतिशील स्मृति आवंटन को ट्रैक करने के लिए और ऑर्गिनेटर को निर्धारित करने के लिए स्टैक पर चलने के लिए उपयोग करना है। आखिरकार यह तथ्य कि आप डिवाइस ड्राइवरों के लिए ऐसा करना चाहते हैं, यह एक कदम आगे ले जाता है। मुझे संदेह है कि डिवाइस ड्राइवरों के लिए डिटोर का उपयोग किया जा सकता है (हालांकि मुझे निश्चित रूप से पता नहीं है)। मुझे पता है कि एक डिवाइस चालक से ढेर चलना बेहद गैर-तुच्छ है।

आप SysInternals suite में ProcExp से इच्छित डेटा प्राप्त करने में भी सक्षम हो सकते हैं। इसे चलाएं 'सिस्टम' पर जाएं, देखें/नीचे फलक दिखाएं, डीएलएल सक्षम करें। फिर कॉलम हेडर पर राइट क्लिक करें और वर्किंग सेट के लिए जोड़ें। उदा। 'डब्लूएस कुल'। मुझे यकीन नहीं है कि यह उन्हें स्मृति को सही ढंग से लेबल करने के लिए क्या करता है। मेरे बॉक्स पर यह उन्हें डिवाइस ड्राइवरों के मैप किए गए छवि आकार देता है, लेकिन वर्किंग सेट कॉलम में बस 0K है। मैं procexp से एक उत्तर की कमी को उचित सबूत के रूप में लेता हूं कि इस समस्या को हल करने से स्नैप नहीं किया जाएगा।

शुभकामनाएं।

+0

यह शानदार है! प्रक्रिया एक्सप्लोरर फिर से आता है। हालांकि कामकाजी सेट डेटा बस 0 है, लेकिन कोई भी भौतिक मेमोरी बेस पता और नक्शा आकार प्राप्त कर सकता है, जो सही दिशा में एक बड़ा कदम है। –

12

विंडोज पूल टैग के साथ डिवाइस ड्राइवर मेमोरी उपयोग ट्रैक करता है। यदि आप जानते हैं कि ड्राइवर टैग में कौन से पूल टैग ExAllocatePoolWithTag तक गुजरते हैं, तो आप poolmon (विंडोज चालक किट से), PoolTag (ओएसआर से), या WinDbg (or KD) (विंडोज़ के लिए डिबगिंग टूल से) जैसे टूल का उपयोग करके अपने मेमोरी उपयोग को ट्रैक कर सकते हैं। ।

ध्यान दें कि डिवाइस ड्राइवर कर्नेल एपीआई को कॉल कर सकते हैं जो अप्रत्यक्ष रूप से स्मृति आवंटित करते हैं। उदाहरण के लिए, IoAllocateMdl पर कॉल करने से Windows I/O प्रबंधक Windows I/O प्रबंधक द्वारा असाइन किए गए एक अलग पूल टैग का उपयोग करके मेमोरी डिस्क्रिप्टर सूची के लिए स्मृति आवंटित करने का कारण बन जाएगा। इसके कारण, एकाधिक डिवाइस ड्राइवरों की तरफ से किए गए आवंटन सभी एक ही पूल टैग का उपयोग कर सकते हैं।

यदि आप यह निर्धारित करने की कोशिश कर रहे हैं कि कौन सा चालक स्मृति लीक कर रहा है, तो पूलमोन/पूलटाग/विन डीबीजी/केडी का उपयोग पूल टैग (ओं) को लीक किया जा रहा है। फिर सिस्टम में कर्नेल डीबगर (WinDbg या KD) संलग्न करें और लीकी पूल टैग पर परिवर्तनीय nt!poolhittag सेट करें। अगली बार ExAllocatePoolWithTag को उस पूल टैग के साथ स्मृति आवंटित करने के लिए बुलाया जाता है, सिस्टम कर्नेल डीबगर में टूट जाएगा, और फिर आप यह पता लगाने के लिए कॉल स्टैक देख सकते हैं कि कौन सा चालक आवंटन कर रहा है। इस प्रक्रिया को Using the Kernel Debugger to Find a Kernel-Mode Memory Leak में अधिक विस्तार से वर्णित किया गया है।

+0

यह सही जवाब है। यदि आप एक ड्राइवर को ट्रैक करना चाहते हैं, तो प्रोग्राम 'सत्यापनकर्ता' आपको अधिक आसानी से मदद कर सकता है, बस कमांड प्रॉम्प्ट पर 'verifier.exe' को कॉल करें। इस उपकरण के साथ आप एक ड्राइवर को ट्रैक कर सकते हैं। – Christopher