2010-05-18 15 views
10

मेमोरी लीक डिटेक्शन टूल्स शुद्ध और वाल्ग्रिंड काम कैसे करें?मेमोरी लीक का पता लगाने के लिए टूल

मैं अपना खुद का टूल कैसे डिज़ाइन और कार्यान्वित कर सकता हूं?

+1

http://stackoverflow.com/questions/1656227/how-does-valgrind-work – stephan

+1

आप मेरी [हीप डीबगर] (http://stackoverflow.com/questions/2835416/critique-my-non- घुसपैठ-ढेर-डीबगर); शुरुआत के लिए ;-) – fredoverflow

+0

मैं इसे डुप्लिकेट के रूप में ध्वजांकित नहीं करता, 'वालग्रिंड' प्रश्न प्रासंगिक है लेकिन "अपना खुद का कार्यान्वयन कैसे करें" नया है। –

उत्तर

5

बुनियादी रिसाव पहचान के लिए आपको केवल निम्न स्तर की स्मृति आवंटन दिनचर्या में शामिल होना चाहिए, उदा। malloc/मुक्त पैचिंग द्वारा। फिर आप सभी आवंटन को ट्रैक करते हैं और बाद में ऐसी किसी भी रिपोर्ट की रिपोर्ट करते हैं जिसे उपयुक्त बिंदु पर मुक्त नहीं किया गया है, उदा। बाहर निकलने से पहले।

8

ऐसे उपकरण आमतौर पर उपकरण अपने स्वयं के कोड के साथ निष्पादन योग्य है। उदाहरण के लिए वे प्रत्येक कॉल को malloc() और free() पर अपने स्वयं के कार्यों के साथ प्रतिस्थापित करते हैं जो उन्हें प्रत्येक आवंटन का पालन करने की अनुमति देता है।

दृश्य स्टूडियो में इस _CrtDumpMemoryLeaks()

+2

आप टूल्स का उपयोग कर सकते हैं - डिलीकर (यदि आप विंडोज उपयोगकर्ता)। – MastAvalons

+2

deleaker - ठंडा उपकरण! Supoort स्मृति और जीडीआई लीक, e.t. – z0r1fan

3

वास्तविक कार्य के लिए की परिवार से कार्यों सिर्फ सी रनटाइम लाइब्रेरी का उपयोग का उपयोग कर स्वचालित रूप से किया जा सकता है, valgrind काफी अच्छी तरह से काम करता है। यह अमान्य पढ़ने/लिखने और स्मृति रिसाव का पता लगाता है।

शौक परियोजना के लिए, आप अपना खुद का मेमोरी प्रबंधन मॉड्यूल बना सकते हैं जो विभिन्न सूचक आवंटन और इसके उपयोग का ट्रैक रखता है। यदि आपको लंबे समय तक कुछ ज्ञात स्थान का उपयोग नहीं किया जाता है, तो यह एक रिसाव हो सकता है।

1

मैं इस उपकरण को विकसित कर रहा हूं: Deleaker

निश्चित रूप से, स्पष्ट विचार आवंटन और विध्वंस करने वाले सभी कार्यों को हुक करना है। यह केवल मॉलोक और फ्री नहीं है, बल्कि हेपअलोक/हेपफ्री (यदि हम विंडोज प्लेटफ़ॉर्म के बारे में बात कर रहे हैं) क्योंकि आधुनिक वीसी ++ संस्करण (वीसी 6.0 के बाद) केवल मोनोक/फ्री को Winapi के HeapAlloc/HeapFree पर रीडायरेक्ट करते हैं।

प्रत्येक आवंटन के लिए एक स्टैक सहेजा जाता है और एक वस्तु सहेजी जाती है। प्रत्येक deallocation पर वस्तु मुक्त है। पहली नज़र में, यह इतना आसान है: बस आवंटित वस्तुओं की एक सूची संग्रहित करें और डेलोकेशन हुक पर ऑब्जेक्ट को हटा दें।

लेकिन देखते हैं मुश्किल भागों:

  • स्पीड

आप आवंटित वस्तुओं की एक सूची बनाए रखने के लिए की जरूरत है। यदि आप प्रत्येक हुक किए गए फ़ंक्शन में ऑब्जेक्ट जोड़ते/हटाते हैं, तो प्रक्रिया बहुत ही धीमी गति से चल रही है। ऐसा लगता है कि इस तरह के औजारों की एक आम समस्या है।

  • स्टैक ट्रेस

dbghelp.dll समारोह का उपयोग करना स्टैक ट्रेस प्राप्त करने के लिए बहुत समय लेता है। आपको स्टैक प्रविष्टियों को तेजी से प्राप्त करना होगा: उदाहरण के लिए प्रक्रिया मेमोरी के मैन्युअल रीडिंग द्वारा।

  • गलत सकारात्मक

कुछ लीक प्रणाली DLLs द्वारा उत्पादित कर रहे हैं। यदि आप उन सभी को दिखाते हैं, तो आपको बहुत सारे रिसाव मिलते हैं, लेकिन उपयोगकर्ता इसे "हल" नहीं कर सकता है: उसके पास उसके स्रोत कोड तक पहुंच नहीं है, और इस कोड को निष्पादित करने से नहीं रोक सकता है।इस लीक को रोकना असंभव है। उनमें से कुछ सिस्टम डीएल के प्रवेश बिंदु पर एकल आवंटन हैं, इसलिए यह वास्तविक रिसाव नहीं है (एक अच्छा सवाल है, बिल्कुल रिसाव क्या है?)। उन लीक को कैसे पहचानें जिन्हें दिखाया जाना चाहिए? एक अच्छा फ़िल्टरिंग एक जवाब है।

उम्मीद है कि इससे मदद मिलती है।

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