मेमोरी लीक डिटेक्शन टूल्स शुद्ध और वाल्ग्रिंड काम कैसे करें?मेमोरी लीक का पता लगाने के लिए टूल
मैं अपना खुद का टूल कैसे डिज़ाइन और कार्यान्वित कर सकता हूं?
मेमोरी लीक डिटेक्शन टूल्स शुद्ध और वाल्ग्रिंड काम कैसे करें?मेमोरी लीक का पता लगाने के लिए टूल
मैं अपना खुद का टूल कैसे डिज़ाइन और कार्यान्वित कर सकता हूं?
बुनियादी रिसाव पहचान के लिए आपको केवल निम्न स्तर की स्मृति आवंटन दिनचर्या में शामिल होना चाहिए, उदा। malloc/मुक्त पैचिंग द्वारा। फिर आप सभी आवंटन को ट्रैक करते हैं और बाद में ऐसी किसी भी रिपोर्ट की रिपोर्ट करते हैं जिसे उपयुक्त बिंदु पर मुक्त नहीं किया गया है, उदा। बाहर निकलने से पहले।
ऐसे उपकरण आमतौर पर उपकरण अपने स्वयं के कोड के साथ निष्पादन योग्य है। उदाहरण के लिए वे प्रत्येक कॉल को malloc()
और free()
पर अपने स्वयं के कार्यों के साथ प्रतिस्थापित करते हैं जो उन्हें प्रत्येक आवंटन का पालन करने की अनुमति देता है।
दृश्य स्टूडियो में इस _CrtDumpMemoryLeaks()
आप टूल्स का उपयोग कर सकते हैं - डिलीकर (यदि आप विंडोज उपयोगकर्ता)। – MastAvalons
deleaker - ठंडा उपकरण! Supoort स्मृति और जीडीआई लीक, e.t. – z0r1fan
वास्तविक कार्य के लिए की परिवार से कार्यों सिर्फ सी रनटाइम लाइब्रेरी का उपयोग का उपयोग कर स्वचालित रूप से किया जा सकता है, valgrind काफी अच्छी तरह से काम करता है। यह अमान्य पढ़ने/लिखने और स्मृति रिसाव का पता लगाता है।
शौक परियोजना के लिए, आप अपना खुद का मेमोरी प्रबंधन मॉड्यूल बना सकते हैं जो विभिन्न सूचक आवंटन और इसके उपयोग का ट्रैक रखता है। यदि आपको लंबे समय तक कुछ ज्ञात स्थान का उपयोग नहीं किया जाता है, तो यह एक रिसाव हो सकता है।
आप कोड के उदाहरणों के लिए मेमोरी प्रबंधन/प्रोफाइलिंग टूल के कुछ बीएसडी कार्यान्वयन की तलाश कर सकते हैं। उदाहरण के लिए http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools
मैं इस उपकरण को विकसित कर रहा हूं: Deleaker।
निश्चित रूप से, स्पष्ट विचार आवंटन और विध्वंस करने वाले सभी कार्यों को हुक करना है। यह केवल मॉलोक और फ्री नहीं है, बल्कि हेपअलोक/हेपफ्री (यदि हम विंडोज प्लेटफ़ॉर्म के बारे में बात कर रहे हैं) क्योंकि आधुनिक वीसी ++ संस्करण (वीसी 6.0 के बाद) केवल मोनोक/फ्री को Winapi के HeapAlloc/HeapFree पर रीडायरेक्ट करते हैं।
प्रत्येक आवंटन के लिए एक स्टैक सहेजा जाता है और एक वस्तु सहेजी जाती है। प्रत्येक deallocation पर वस्तु मुक्त है। पहली नज़र में, यह इतना आसान है: बस आवंटित वस्तुओं की एक सूची संग्रहित करें और डेलोकेशन हुक पर ऑब्जेक्ट को हटा दें।
लेकिन देखते हैं मुश्किल भागों:
आप आवंटित वस्तुओं की एक सूची बनाए रखने के लिए की जरूरत है। यदि आप प्रत्येक हुक किए गए फ़ंक्शन में ऑब्जेक्ट जोड़ते/हटाते हैं, तो प्रक्रिया बहुत ही धीमी गति से चल रही है। ऐसा लगता है कि इस तरह के औजारों की एक आम समस्या है।
dbghelp.dll समारोह का उपयोग करना स्टैक ट्रेस प्राप्त करने के लिए बहुत समय लेता है। आपको स्टैक प्रविष्टियों को तेजी से प्राप्त करना होगा: उदाहरण के लिए प्रक्रिया मेमोरी के मैन्युअल रीडिंग द्वारा।
कुछ लीक प्रणाली DLLs द्वारा उत्पादित कर रहे हैं। यदि आप उन सभी को दिखाते हैं, तो आपको बहुत सारे रिसाव मिलते हैं, लेकिन उपयोगकर्ता इसे "हल" नहीं कर सकता है: उसके पास उसके स्रोत कोड तक पहुंच नहीं है, और इस कोड को निष्पादित करने से नहीं रोक सकता है।इस लीक को रोकना असंभव है। उनमें से कुछ सिस्टम डीएल के प्रवेश बिंदु पर एकल आवंटन हैं, इसलिए यह वास्तविक रिसाव नहीं है (एक अच्छा सवाल है, बिल्कुल रिसाव क्या है?)। उन लीक को कैसे पहचानें जिन्हें दिखाया जाना चाहिए? एक अच्छा फ़िल्टरिंग एक जवाब है।
उम्मीद है कि इससे मदद मिलती है।
http://stackoverflow.com/questions/1656227/how-does-valgrind-work – stephan
आप मेरी [हीप डीबगर] (http://stackoverflow.com/questions/2835416/critique-my-non- घुसपैठ-ढेर-डीबगर); शुरुआत के लिए ;-) – fredoverflow
मैं इसे डुप्लिकेट के रूप में ध्वजांकित नहीं करता, 'वालग्रिंड' प्रश्न प्रासंगिक है लेकिन "अपना खुद का कार्यान्वयन कैसे करें" नया है। –