आप अपने (अप्रबंधित) कोड में मेमोरी लीक का पता कैसे लगाते / टालते हैं? [बन्द है]


125

अनवांटेड C / C ++ कोड में, मेमोरी लीक का पता लगाने के लिए सर्वोत्तम अभ्यास क्या हैं? और कोडिंग दिशानिर्देशों से बचने के लिए? (जैसे कि यह इतना आसान है;)

हमने अतीत में थोड़ा मूर्खतापूर्ण तरीके से उपयोग किया है: प्रत्येक मेमोरी आवंटन कॉल के लिए एक काउंटर वेतन वृद्धि और मुक्त करते समय वेतन वृद्धि। कार्यक्रम के अंत में, काउंटर मूल्य शून्य होना चाहिए।

मुझे पता है कि यह एक शानदार तरीका नहीं है और कुछ कैच हैं। (उदाहरण के लिए, यदि आप मेमोरी को फ्री कर रहे हैं जिसे एक प्लेटफॉर्म एपीआई कॉल द्वारा आवंटित किया गया था, तो आपकी आवंटन संख्या आपके फ्रीजिंग काउंट से बिल्कुल मेल नहीं खाएगी। निश्चित रूप से, हमने एपीआई को कॉल किया था, जब मेमोरी आवंटित की गई थी।

मैं आपके अनुभवों, सुझावों और शायद कुछ उपकरणों के संदर्भों की अपेक्षा कर रहा हूं जो इसे सरल बनाते हैं।


लीक से बचने के संदर्भ में निम्नलिखित पोस्ट में कुछ सलाह है: http://stackoverflow.com/questions/27492/c-memory-management
tonylo


मैंने मेम लीक का पता लगाने के लिए विजुअल स्टूडियो के साथ इसका इस्तेमाल किया। codeproject.com/KB/applications/visualleakdetector.aspx
tiboo

1
आप सलेर वेलग्रिन (लिनेक्स के लिए) या डेल्केर (खिड़कियों के लिए), विज़ुअल लीक डिटेक्टर भी देखें ...
जॉन स्मिथ

मेमोरी लीक की जाँच के लिए यहाँ देखें: theunixshell.blogspot.com/2013/11/…
विजय

जवाबों:


78

यदि आपका C / C ++ कोड पोर्टेबल * nix है, तो कुछ चीजें Valgrind से बेहतर हैं ।


1
Valgrind अब OS X पर भी काम करता है, इसलिए linux आपका एकमात्र विकल्प नहीं है।
माइकल एंडरसन

1
लिनक्स (और ओएस एक्स) के लिए वैलग्राइंड। यदि आप विंडोस - डेल्केर का उपयोग करते हैं - सबसे अच्छा!
जॉन स्मिथ

@ जोर्डिनस्टर: अच्छा! लेकिन रनटाइम आधारित। एक बड़े कोड बेस के साथ (लाइ केस में सी लिखा) आप मुख्य रूप से अपने प्रोग्राम को उस तरीके से परखेंगे जिस तरह से इसे डिजाइन किया गया था। स्मृति रिसाव शोषण का पता लगाने के लिए एक हमलावर कोड को पढ़ने में कई हजारों आवश्यक घंटे लगा सकता है। मेरे पास जावास्क्रिप्ट के लिए मौजूद स्रोत कोड विश्लेषण के लिए एक स्वचालित उपकरण की उम्मीद होगी।
user2284570

65

यदि आप Visual Studio का उपयोग कर रहे हैं, तो Microsoft मेमोरी लीक का पता लगाने और डीबग करने के लिए कुछ उपयोगी कार्य प्रदान करता है।

मैं इस लेख से शुरू करूंगा: https://msdn.microsoft.com/en-us/library/x98tx3cf(v=vs.140).aspx

यहां उन लेखों का त्वरित सारांश दिया गया है। सबसे पहले, इन हेडर को शामिल करें:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

जब आपका प्रोग्राम बाहर निकलता है, तब आपको इसे कॉल करने की आवश्यकता होती है:

_CrtDumpMemoryLeaks();

वैकल्पिक रूप से, यदि आपका कार्यक्रम हर बार एक ही जगह से बाहर नहीं निकलता है, तो आप इसे अपने कार्यक्रम की शुरुआत में कॉल कर सकते हैं:

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

अब जब प्रोग्राम सभी आवंटन से बाहर निकलता है जो कि फ्री होल्ड नहीं थे, उन्हें आउटपुट विंडो में प्रिंट किया जाएगा और उन्हें आवंटित की गई फ़ाइल और आवंटन घटना के साथ।

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

ऊपर बताए गए MSDN लिंक में बताई गई अन्य तकनीकें हैं जिनका उपयोग भी किया जा सकता है।


इस पद्धति के बारे में एक नोट: ऐसा प्रतीत होता है कि यह केवल तभी काम करता है जब आप मॉलोक और फ्री के साथ शुद्ध सी का उपयोग कर रहे हों। यदि आप c ++ के नए और डिलीट का उपयोग कर रहे हैं, तो विस्तृत रिपोर्ट में लाइन नंबर शामिल नहीं है।
Zach

2
@Zach: वास्तव में आप इसे काम करने के लिए भी प्राप्त कर सकते हैं (किसी भी कोड के लिए आप वास्तव में खुद को संकलित करते हैं, वैसे भी) - social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/…/
रोमन

क्या यह रिलीज़ मोड में भी काम करेगा?
JV

1
@ user3152463 नहीं। दस्तावेज़ के अनुसार, यह केवल डिबग बिल्ड के लिए काम करेगा: msdn.microsoft.com/en-us/library/e5ewb1h3(v=vs.71).aspx
कैंपबेल

यह पंक्ति गलत है: #define CRTDBG_MAP_ALLOC यह होना चाहिए: #define _CRTDBG_MAP_ALLOC
बजे

37

C ++ में: RAII का उपयोग करें। स्मार्ट संकेत की तरह है std::unique_ptr, std::shared_ptr, std::weak_ptrआपके मित्र हैं।


1
और एसटीडी: वेक्टर एक महान प्रतिस्थापन है जब सरणियों (बफ़र्स) को उसी फ़ंक्शन में निपटाया जाता है जो उन्हें आवंटित किया जाता है।
केजवाल्फ

4
कम से कम std :: auto_ptr और बढ़ावा :: share_ptr अभी भी लीक के लिए अतिसंवेदनशील हैं।
जैस्पर बेकर्स

5
केवल अगर आप उन्हें गलत तरीके से उपयोग करते हैं, हालांकि मुझे यह स्वीकार करना चाहिए कि std :: auto_ptr का गलत तरीके से उपयोग करना काफी आसान है।
लियोन टिम्मरमन्स

2
जबकि मानकों को कोड करने के लिए यह अच्छी सलाह है, यह सवाल का जवाब नहीं देता है। यहां तक ​​कि शेयर्ड_प्ट्र का उपयोग करने से परिपत्र निर्भरता के साथ लीक हो सकता है। और आपके पास असीमित कैशिंग रणनीतियों के साथ "लीक" हो सकते हैं, जो कचरा एकत्र करने वाली भाषाओं पर भी लागू होते हैं।
CashCow 12

@ कैश: आप सही हैं। हालांकि मैंने इसे अभी तक अभ्यास में नहीं देखा है, ऐसा शायद इसलिए है क्योंकि मैं उन्हें संयम से इस्तेमाल कर रहा हूं। नीचे दिए गए उत्तर को उद्धृत करने के लिए, "केवल आवश्यक होने पर संकेत का उपयोग करें"।
लियोन टिम्मरमैन

28

C ++ डेवलपर के रूप में यहां कुछ सरल दिशा-निर्देश दिए गए हैं:

  1. केवल आवश्यक होने पर पॉइंटर्स का उपयोग करें
  2. यदि आपको एक पॉइंटर की आवश्यकता है, तो स्मार्टपॉइंट एक संभावना है तो डबलचेक करें
  3. GRASP निर्माता पैटर्न का उपयोग करें ।

व्यक्तिगत रूप से मेमोरी लीक का पता लगाने के लिए मैंने हमेशा विज़ुअल लीक डिटेक्टर का उपयोग किया है और इसे बहुत उपयोगी पाया है।


2
विज़ुअल लीक डिटेक्टोर
KindDragon

वीएलडी वास्तव में एक अच्छा रिसाव डिटेक्टर है - मैं पूरी तरह से सभी के लिए वीसी ++ का उपयोग करने की सलाह देता हूं
जाविद

1
बिंदु # 1 के लिए +1। यह बिल्कुल मौलिक बात है। दुर्भाग्य से, यह मुझे ऐसा लगता है कि कुछ सबसे बड़े "C ++" पुस्तकालयों में स्टैक आवंटन और / या RAII की ओर इशारा करते हैं। इसलिए, वे अंत में 'सी विद क्लासेस' होते हैं, वास्तविक सी ++ नहीं।
अंडरस्कोर_ड

16

मैं अब तक कई वर्षों से DevStudio का उपयोग कर रहा हूं और यह हमेशा मुझे आश्चर्यचकित करता है कि कितने प्रोग्रामर स्मृति विश्लेषण टूल के बारे में नहीं जानते हैं जो डिबग रन टाइम लाइब्रेरी में उपलब्ध हैं। यहां कुछ लिंक दिए गए हैं:

ट्रैकिंग आवंटन अनुरोध - विशेष रूप से अद्वितीय आवंटन अनुरोध संख्या पर अनुभाग

_CrtSetDbgFlag

_CrtSetBreakAlloc

बेशक, अगर आप DevStudio का उपयोग नहीं कर रहे हैं तो यह विशेष रूप से उपयोगी नहीं होगा।


10

मुझे आश्चर्य है कि विंडोज ओएस के लिए किसी ने भी डिबगडिग का उल्लेख नहीं किया है ।
यह रिलीज़ बिल्ड, और यहां तक ​​कि ग्राहक साइट पर भी काम करता है।
(आपको अपना रिलीज़ संस्करण PDBs रखने की आवश्यकता है, और Microsoft सार्वजनिक प्रतीक सर्वर का उपयोग करने के लिए DebugDiag कॉन्फ़िगर करें)


3
लिंक अब काम नहीं करता है, प्रलेखन के लिए यहां प्रयास करें: support.microsoft.com/kb/2580960 और यहां डाउनलोड करने के लिए: microsoft.com/en-us/download/details.aspx?id=26798
JPaget

7

विज़ुअल लीक डिटेक्टर एक बहुत अच्छा उपकरण है, कुल मिलाकर यह VC9 रनटाइम (उदाहरण के लिए MSVCR90D.DLL) पर कॉल का समर्थन नहीं करता है।


1
यह उपकरण वास्तव में एकदम सही है! यह आपको _CrtDumpMemoryLeaks () का उपयोग करने की परेशानी से बचाता है; और दोस्तों, जैसा कि MSDN में वर्णित है। बस एक शामिल है और यह सब कुछ उजागर करता है! यहां तक ​​कि पुराने सी पुस्तकालयों में काम करता है!
m_pGladiator

नया संस्करण (VS2013 के लिए) यहाँ है: vld.codeplex.com
ड्यूज़ेन

7

Microsoft VC ++ डिबग मोड में मेमोरी लीक दिखाता है, हालांकि यह नहीं दिखाता है कि आपके लीक कहां हैं।

आप सी उपयोग कर रहे हैं ++ आप हमेशा नए स्पष्ट रूप से उपयोग करने से बचें कर सकते हैं: आपके पास vector, string, auto_ptr(पूर्व सी ++ 11; द्वारा प्रतिस्थापित unique_ptrC ++ 11), unique_ptr(सी ++ 11) और shared_ptr(सी ++ 11) अपने शस्त्रागार में।

जब नया अपरिहार्य हो, तो उसे एक कंस्ट्रक्टर में छिपाने की कोशिश करें (और डिस्ट्रक्टर में डिलीट को छिपाएं); तृतीय पक्ष API के लिए समान कार्य करता है।


1
और 3 या 5 का नियम न भूलें
हमम हेलफावी

4

वहाँ विभिन्न प्रतिस्थापन "मॉलोक" लाइब्रेरी हैं जो आपको अंत में एक फ़ंक्शन को कॉल करने की अनुमति देगा और यह आपको सभी अप्रकाशित मेमोरी के बारे में बताएगा, और कई मामलों में, जिन्होंने पहले स्थान पर इसे (या न्यू'ड) किया था ।


4

यदि आप MS VC ++ का उपयोग कर रहे हैं, तो मैं कोडप्रोजेक्ट से इस नि: शुल्क उपकरण की अत्यधिक अनुशंसा कर सकता हूं: जोचेन कलम्बच द्वारा लीकफाइंडर

आप बस अपने प्रोजेक्ट में क्लास जोड़ें, और कॉल करें

InitAllocCheck(ACOutput_XML)
DeInitAllocCheck()

कोड से पहले और बाद में आप लीक के लिए जाँच करना चाहते हैं।

कोड बनाने और चलाने के बाद, Jochen एक साफ GUI उपकरण प्रदान करता है, जहाँ आप परिणामी .xmlleaks फ़ाइल को लोड कर सकते हैं, और कॉल स्टैक के माध्यम से नेविगेट कर सकते हैं जहाँ प्रत्येक लीक को कोड की आपत्तिजनक रेखा का शिकार करने के लिए उत्पन्न किया गया था।

तर्कसंगत (अब आईबीएम के स्वामित्व में) PurifyPlus एक समान फैशन में लीक दिखाता है, लेकिन मुझे लगता है कि लीकफाइंडर उपकरण वास्तव में उपयोग करना आसान है, इसके बोनस के साथ कई हजार डॉलर खर्च नहीं होते हैं!


1
मैंने लीकफाइंडर की जाँच की और यह ठीक लग रहा है, लेकिन सिर्फ FYI करना यह x64 के लिए काम नहीं करेगा क्योंकि इसमें इनलाइन असेंबली है।
Zach


3

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


2

मुझे लगता है कि इस सवाल का कोई आसान जवाब नहीं है। आप वास्तव में इस समाधान से कैसे संपर्क कर सकते हैं यह आपकी आवश्यकताओं पर निर्भर करता है। क्या आपको एक क्रॉस प्लेटफॉर्म समाधान की आवश्यकता है? क्या आप नया / डिलीट या मॉलोक / फ्री (या दोनों) का उपयोग कर रहे हैं? क्या आप वास्तव में सिर्फ "लीक" की तलाश कर रहे हैं या क्या आप बेहतर सुरक्षा चाहते हैं, जैसे कि बफर ओवर्रन (या अंडररून) का पता लगाना?

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

मैं मदद देने के लिए यूनिक्स पक्ष के बारे में पर्याप्त नहीं जानता, हालांकि फिर से, दूसरों के पास है।

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


2

मैं कुछ ऐसा पेश करना चाहता हूं जो मैंने अतीत में कई बार उपयोग किया है: एक अल्पविकसित रिसाव चेकर जो स्रोत स्तर और काफी स्वचालित है। मैं इसे तीन कारणों से दूर कर रहा हूं:

  1. आपको यह उपयोगी लग सकता है।

  2. हालांकि यह थोड़ा क्रुफी है, लेकिन मैंने उसे शर्मिंदा नहीं होने दिया।

  3. भले ही यह कुछ win32 हुक से बंधा हो, लेकिन इसे कम करना आसान होना चाहिए।

ऐसी चीजें हैं जिनका उपयोग करते समय आपको सावधान रहना चाहिए: कुछ भी ऐसा न करें newजो अंतर्निहित कोड पर झुकना आवश्यक है , उन मामलों के बारे में चेतावनियों से सावधान रहें जो इसे leakcheck.cpp के शीर्ष पर याद कर सकते हैं, महसूस करें कि यदि आप मुड़ते हैं जिस कोड पर छवि डंप होती है, उसके साथ (और किसी भी समस्या को ठीक करें), आप एक बड़ी फ़ाइल उत्पन्न कर सकते हैं।

डिज़ाइन का अर्थ है कि आप चेकर को चालू करने और बंद करने की अनुमति देने के लिए, जिसमें उसके हेडर शामिल हैं। जहां आप चेकिंग ट्रैक करना चाहते हैं और एक बार पुनर्निर्माण करना चाहते हैं, उसमें लीकेज चेक शामिल करें। इसके बाद, LEAKCHECK के साथ या उसके बिना leakcheck.cpp को संकलित करें और फिर इसे चालू और बंद करने के लिए relink करें। जिसमें अनलेक शामिल है। वह किसी फ़ाइल में स्थानीय रूप से बंद हो जाएगा। दो मैक्रोज़ प्रदान किए जाते हैं: CLEARALLOCINFO () एक ही फाइल और लाइन को अनुचित तरीके से रिपोर्ट करने से बचेंगे जब आपने कोड आवंटित किया है जिसमें लीकचेक शामिल नहीं था। ALLOCFENCE () बिना किसी आबंटन के केवल उत्पन्न रिपोर्ट में एक पंक्ति छोड़ देता है।

दोबारा, कृपया महसूस करें कि मैंने कुछ समय में इसका उपयोग नहीं किया है और आपको इसके साथ थोड़ा काम करना पड़ सकता है। मैं विचार को स्पष्ट करने के लिए इसे छोड़ रहा हूं। यदि पर्याप्त रुचि हो, तो मैं एक उदाहरण के साथ काम करने को तैयार हूं, जो प्रक्रिया में कोड को अपडेट कर रहा है, और निम्न URL की सामग्री को कुछ अच्छे से बदल सकता है जिसमें एक शालीनतापूर्वक सिन्थैक्स-रंग की लिस्टिंग शामिल है।

आप इसे यहाँ पा सकते हैं: http://www.cse.ucsd.edu/~tkammeye/leakcheck.html


2

लिनक्स के लिए: Google Perftools का प्रयास करें

ऐसे कई उपकरण हैं जो समान आबंटन / मुक्त गणना करते हैं, गूलर पेरफूल के नियम:

  • काफी तेज (वैलग्राइंड की तुलना में: बहुत तेज)
  • परिणामों के अच्छे चित्रमय प्रदर्शन के साथ आता है
  • अन्य उपयोगी क्षमताएं हैं: सीपीयू-प्रोफाइलिंग, मेमोरी-उपयोग प्रोफाइलिंग ...

इस पर जाएँ: github.com/gperftools/gperftools
Michael

2

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

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


2

मैं सॉफ्टवेयर सत्यापन से मेमोरी वैलिडेटर का उपयोग करने की सलाह दूंगा । यह उपकरण मुझे स्मृति रिसाव को ट्रैक करने में मदद करने और अनुप्रयोगों के मेमोरी प्रबंधन को बेहतर बनाने में मदद करने के लिए अमूल्य मदद साबित हुआ।

एक बहुत ही पूर्ण और तेज उपकरण।


मेमोरी वैलिडेटर C # के लिए फ़ाइल नाम और लाइन नंबर भी प्रदान करता है जो आपके मूल कोड को कॉल करता है। x64 संस्करण बीटा में है
स्टीफन केलेट

2

क्या आप अपने स्वयं के syscall फ़ंक्शन को कॉल करके अल्लोक और फ़्रीज़ की गिनती कर रहे हैं जो कॉल रिकॉर्ड करते हैं और फिर कॉल को वास्तविक फ़ंक्शन में पास करते हैं?

यह एकमात्र तरीका है जिसे आप उस कोड से उत्पन्न कॉल का ट्रैक रख सकते हैं जो आपने नहीं लिखा है।

Ld.so के लिए मैन पेज देखें या कुछ सिस्टम पर ld.so.1।

Google LD_PRELOAD भी करें और आपको www.itworld.com पर तकनीक की व्याख्या करने वाले कुछ दिलचस्प लेख मिलेंगे।


1

कम से कम एमएस वीसी ++ के लिए, सी रनटाइम लाइब्रेरी में कई कार्य हैं जो मैंने अतीत में मददगार पाए हैं। _Crt*कार्यों के लिए MSDN सहायता की जाँच करें ।


1

पॉल नेटल का एमएमएआरआर मेरा एक लंबा पसंदीदा उपकरण है। आप अपने स्रोत फ़ाइलों में mmgr.h को शामिल करते हैं, TEST_MEMORY को परिभाषित करते हैं, और यह आपके ऐप के चलाने के दौरान हुई मेमोरी समस्याओं से भरा टेक्स्टफाइल बचाता है।


1

सामान्य कोडिंग दिशानिर्देश:

  • संसाधनों को उसी "लेयर" (फंक्शन / क्लास / लाइब्रेरी) में निपटाया जाना चाहिए जहाँ उन्हें आवंटित किया गया है।
  • यदि यह संभव नहीं है, तो कुछ स्वचालित डीलक्लबेशन (बूस्ट शेयर्ड पॉइंटर ...) का उपयोग करने का प्रयास करें

1

मेमोरी डिबगिंग टूल सोने में उनके वजन के लायक हैं, लेकिन पिछले कुछ वर्षों में मैंने पाया है कि सबसे सरल मेमोरी / रिसोर्स लीक को रोकने के लिए दो सरल विचारों का उपयोग किया जा सकता है।

  1. जिन संसाधनों को आप आवंटित करना चाहते हैं, उनके लिए अधिग्रहण कोड लिखने के तुरंत बाद रिलीज़ कोड लिखें। इस पद्धति के साथ "भूल" करने के लिए कठिन है और कुछ अर्थों में एक को संसाधनों के जीवन चक्र के बारे में गंभीरता से सोचने के लिए मजबूर करता है बजाय एक तरफ के।

  2. जहाँ तक संभव हो वापसी का उपयोग करें। जो आवंटित किया जाता है, यदि संभव हो तो केवल एक ही स्थान पर मुक्त किया जाना चाहिए। संसाधन और रिलीज के अधिग्रहण के बीच सशर्त पथ को यथासंभव सरल और स्पष्ट बनाया जाना चाहिए।


1

इस सूची में सबसे ऊपर (जब मैंने इसे पढ़ा) तो वैध था। यदि आप एक परीक्षण प्रणाली पर रिसाव को पुन: उत्पन्न करने में सक्षम हैं, तो वेलग्रिंड उत्कृष्ट है। मैंने इसका बड़ी सफलता के साथ उपयोग किया है।

क्या होगा यदि आपने अभी देखा है कि उत्पादन प्रणाली अभी लीक हो रही है और आपको पता नहीं है कि इसे परीक्षण में कैसे पुन: पेश किया जाए? उस उत्पादन प्रणाली की स्थिति में जो कुछ भी गलत है, उस पर कब्जा कर लिया गया है, और यह समस्या के बारे में जानकारी प्रदान करने के लिए पर्याप्त हो सकता है जहां समस्या है इसलिए आप इसे पुन: पेश कर सकते हैं।

यहीं से मोंटे कार्लो का नमूना चित्र में आया है। रेमंड चेन का ब्लॉग लेख पढ़ें, "मेमोरी लीक की पहचान करने का गरीब आदमी का तरीका" और फिर मेरे कार्यान्वयन की जांच करें (लिनक्स मानता है, केवल x86 और x86-64 पर परीक्षण किया गया है)

http://github.com/tialaramex/leakdice/tree/master


1

मोटोरोला सेल फोन ऑपरेटिंग सिस्टम पर काम करते हुए, हमने सभी मेमोरी आवंटन का निरीक्षण करने के लिए मेमोरी एलोकेशन लाइब्रेरी को हाईजैक कर लिया। यह स्मृति आवंटन के साथ समस्याओं का एक बहुत खोजने के लिए मदद की। चूंकि रोकथाम बेहतर है, इसलिए इलाज करते हुए, मैं क्लॉकवर्क या पीसी-लिंट जैसे स्थिर विश्लेषण उपकरण का उपयोग करने की सलाह दूंगा


स्पिंट लिंट के लिए एक नया प्रतिस्थापन है।
मार्क केगेल

@ user14788: जिम्पेल का पीसी-लिंट उत्पाद पुराने यूनिक्स की तुलना में बहुत अधिक आधुनिक है lint। इसमें C ++ के लिए कई चेक विशिष्ट हैं, जो कि एफिक स्प्लिंट नहीं करता है। उत्तर में लिंक देखें (जिसे मैंने लिंट से पीसी-लिंट का नाम दिया था)।
दान

0

Valgrind Linux के लिए एक अच्छा विकल्प है। MacOS X के तहत, आप MallocDebug लाइब्रेरी को सक्षम कर सकते हैं जिसमें मेमोरी आवंटन समस्याओं को डीबग करने के कई विकल्प हैं (मॉलॉक मैनपेज देखें, "ENVIRONMENT" अनुभाग में प्रासंगिक विवरण हैं)। OS X SDK में MallocDebug नाम का एक टूल भी शामिल है (आमतौर पर / डेवलपर / एप्लिकेशन / प्रदर्शन उपकरण / में स्थापित) जो आपको उपयोग और लीक की निगरानी करने में मदद कर सकता है।


0

का पता लगाने:

डिबग सी.आर.टी.

से बचें:

स्मार्ट पॉइंटर्स, बोहम जीसी


0

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

http://www.hexco.de/rmdebug/


0

अधिकांश मेमोरी प्रोफाइलर मेरे बड़े जटिल विंडोज एप्लिकेशन को उस बिंदु पर धीमा कर देते हैं जहां परिणाम बेकार हैं। मेरे आवेदन में लीक खोजने के लिए एक उपकरण अच्छा काम करता है: UMDH - http://msdn.microsoft.com/en-us/library/ff560206%28VS.85%29.aspx


मैं यह नहीं देखता कि मंदी का परिणाम बेकार क्यों होता है। निश्चित रूप से स्मृति जो लीक हुई है, वह उस गति की परवाह किए बिना लीक हुई है जिस पर कार्यक्रम चलता है। इन साधनों का बिंदु लीक को खोजना है, तो समस्या कहां है? क्या यह इतनी धीमी गति से चला कि आप उन्हें प्रोफाइल करने के लिए सभी कोड पथों को कवर करने के लिए भौतिक रूप से प्राप्त नहीं कर सके?
अंडरस्कोर_ड

-1

माउंट लीनक्स के लिए मानक निर्मित में एक प्रतीत होता है। कदम हैं:


  1. MALLOC_TRACE = / tmp / mtrace.dat निर्यात MALLOC_TRACE में पर्यावरण चर MALLOC_TRACE सेट करें
    ;
  2. आप मुख्य स्रोत फ़ाइल के शीर्ष पर #include <mcheck.h> जोड़ें
  3. Mtrace () जोड़ें ; मुख्य और muntrace () की शुरुआत में ; तल पर (वापसी विवरण से पहले)
  4. डिबग जानकारी के लिए -g स्विच के साथ अपने कार्यक्रम को संकलित करें
  5. अपना प्रोग्राम चलाएं

  6. mtrace के साथ लीक सूचना प्रदर्शित करें your_prog_exe_name /tmp/mtrace.dat
    (मुझे yt स्थापित glibc_utils के साथ अपने फेडोरा सिस्टम पर mtrace पर्ल स्क्रिप्ट को पहले स्थापित करना था   )

mtrace C ++
Erin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.