2011-10-26 17 views
7

मैं एक सी # अनुप्रयोग विकसित कर रहा हूं जो कि रिसाव लगता है। मैं स्मृति प्रोफाइलर का इस्तेमाल किया और पाया कि मेरानिजी बाइट्स (मूल स्मृति) रिसाव कैसे हल करें?

निजी बाइट्स रखें बढ़ रही है, लेकिन सभी ढेर में बाइट्स ऐसा नहीं है, जिसका अर्थ है कि शायद यह एक देशी स्मृति

अब मैं अटक कर रहा हूँ रिसाव है किया है, मैं देशी कोड में मेमोरी लीक कैसे ढूंढूं?

+0

क्या आपको पता है कि रिसाव कहां है? हम कोड के बिना आपकी मदद नहीं कर सकते ... –

+0

आप सी # में मूल कोड नहीं लिखते हैं। निश्चित रूप से केवल एक चीज जो आप कर सकते हैं यह सुनिश्चित कर लें कि आप इंटरऑप को सही तरीके से संभालेंगे? –

+0

यह प्रोफाइलर्स के साथ एक आम समस्या है, वे आपको जितना जानना चाहते हैं उससे ज्यादा बताते हैं। बढ़ते निजी बाइट असामान्य नहीं हैं, इसे स्थिर करने में कुछ समय लग सकता है। क्या आप वास्तव में आउटऑफमेमरी अपवाद प्राप्त करते हैं? यदि नहीं तो इसके लिए अनदेखा बिट फ्लिप करें। –

उत्तर

0

अधिक जानकारी के बिना आपको ठोस प्रतिक्रिया देना मुश्किल है, लेकिन ऐसा लगता है कि आप जिस lib का उपयोग करने का प्रयास कर रहे हैं वह स्मृति रिसाव है। आपको लिखित भाषा के आधार पर उपयुक्त टूल के साथ lib की आवश्यकता होगी। यदि आपके पास lib का स्रोत नहीं है, तो डेवलपर्स से संपर्क करें और उन्हें रिसाव ठीक करें।

यदि आप लाइब्रेरी का नाम और अपने कुछ स्रोत कोड (साथ ही मूल विधि हस्ताक्षर) पोस्ट कर सकते हैं, तो हम आपको कुछ और विशिष्ट सलाह दे सकते हैं।

0

.नेट फ्रेमवर्क द्वारा प्रबंधित ढेर में निजी बाइट्स, आपको अपने स्रोत का विश्लेषण करने के लिए पेशेवर टूल का उपयोग करने की आवश्यकता है। जैसे कि लाल गेट मेमोरी प्रोफाइलर का उपयोग करें, ऑब्जेक्ट को ढूंढें लेकिन डिस्पोजेड नहीं किया जा रहा है।

3

किसी प्रबंधित एप्लिकेशन में देशी मेमोरी लीक का निदान करना (कम से कम शुरुआत में) किसी अन्य मूल एप्लिकेशन में मेमोरी लीक का निदान करने के समान ही है।

जिस तरह से मैं आम तौर पर इन समस्याओं का सामना करता हूं, प्रक्रिया को बड़ी मात्रा में स्मृति को रिसाव करने के लिए, पूर्ण प्रक्रिया डंप लेना और फिर सबसे अधिक स्मृति का उपयोग करने के लिए डंप की जांच करना है। उदाहरण के लिए यदि आपकी प्रक्रिया में ~ 20 एमबी का सामान्य/प्रारंभिक निजी बाइट है लेकिन आप अपनी प्रक्रिया को ~ 200 एमबी निजी बाइट्स तक स्मृति तक रिसाव करने के लिए प्राप्त कर सकते हैं, तो एक अच्छा मौका है कि उस स्मृति का ~ 180 एमबी लीक हो जाता है - आम तौर पर बोलना जो कुछ भी आवंटित किया गया है वह है जहां आपको दिखना शुरू करना चाहिए।

माइक्रोसॉफ्ट के पास DebugDiag नामक एक बहुत ही उपयोगी टूल है - प्रारंभ में आईआईएस में मेमोरी लीक का निदान करने के लिए उपयोग के लिए विकसित किया गया है, यह एक बहुत ही vesatile उपकरण है और स्मृति समस्याओं से निपटने के दौरान बहुत आसान है। यदि आप इसे एक क्रैश डंप देते हैं तो यह कुछ विश्लेषण करेगा और (कम से कम) आपको बताएगा कि मॉड्यूल ने उस स्मृति को आवंटित किया है, फिर आप उस मॉड्यूल का उपयोग कैसे किया जा सकता है, इस बारे में अधिक विशेष रूप से देखना शुरू कर सकते हैं।

0

आमतौर पर ANTS Memory Profiler का उपयोग कर मेमोरी लीक शिकार करते समय मेरे पास सबसे अच्छे परिणाम थे।

3

पहले (Or other tools, व्यक्तिगत रूप से मैं चींटियों के साथ सबसे अच्छा अनुभव था), यदि आप लीक प्रक्रिया का एक डंप है, तो आप WinDbg में खोलने और आदेश जारी कर सकते हैं:! -summary संबोधित

  • अगर RegionUsageHeap बड़ी है, तो यह एक देशी स्मृति रिसाव
  • अगर RegionUsageIsVAD, तो यह एक .NET स्मृति रिसाव होना चाहिए होना चाहिए।

    • उपयोग DebugDiag:

    इस एक देशी रिसाव है, तो आप 2 विकल्प हैं जब शीघ्र, चुनें 'मूल निवासी मेमोरी रिसाव और रिसाव संभाल', इस प्रक्रिया का पता लगाने में करना चाहते हैं, और जब तक आप स्मृति रिसाव का प्रयोग नहीं करते हैं तब तक एप्लिकेशन के साथ काम करना शुरू करें। पूर्ण होने पर, एप्लिकेशन का पूर्ण डंप उत्पन्न करें (लीक नियम पर राइट क्लिक करें और पूर्ण उपयोगकर्ता डंप का चयन करें)। इसके बाद आप जेनरेट डंप का विश्लेषण कर सकते हैं (आपको इसके लिए कुशलतापूर्वक काम करने के लिए प्रतीकों को सही तरीके से कॉन्फ़िगर करना होगा): 'उन्नत विश्लेषण' टैब पर, 'मेमोरी प्रेशर विश्लेषक' का चयन करें, डंप फ़ाइल खोलें और 'विश्लेषण शुरू करें' दबाएं। यह उत्पादन और एचटीएमएल रिपोर्ट का विश्लेषण कर सकते हैं। आप एक विस्तृत walkthrough के लिए इस page का उल्लेख कर सकते हैं।

  • एप्लिकेशन सत्यापनकर्ता/WinDbg का उपयोग करें। एप्लिकेशन सत्यापनकर्ता में, अपना एप्लिकेशन (.exe) चुनें। परीक्षण पृष्ठ में, सुनिश्चित करें कि मूल बातें/हीप्स का चयन किया गया है। निचले फलक में, सुनिश्चित करें कि 'निशान' सत्य पर सेट है। कॉन्फ़िगरेशन सहेजे जाने के बाद, एप्लिकेशन को फिर से चलाएं और रिसाव होने पर पूर्ण डंप उत्पन्न करें। डंप उत्पन्न होने के बाद एप्लिकेशन झंडे को साफ करना न भूलें। फिर आप WinDbg के भीतर से डंप खोल सकते हैं, और '! Heap' कमांड की सहायता से रिसाव की जांच कर सकते हैं। विशेष रूप से, '! हीप-एल' आपको लीक किए गए ब्लॉक की एक सूची देगा, '! हीप-पी-ए' आवंटन के कॉल स्टैक सहित ब्लॉक के विवरण दिखाएगा।

यदि यह एक .NET रिसाव है, तो समस्या निवारण के लिए तीसरे पक्ष के उपकरण हैं। संस्करण 1.2 से शुरू होने पर, डीबगडिआग .NET मेमोरी रिसाव विश्लेषण करने में भी सक्षम है (हालांकि यह कभी कोशिश नहीं की गई)।

संबंधित मुद्दे