Valgrind के साथ C/C++ में मेमोरी लीक का पता कैसे लगाएं

Valgrind Ke Satha C C Mem Memori Lika Ka Pata Kaise Laga Em



वेलग्रिंड उन सॉफ़्टवेयर प्रोग्रामों को डीबग और प्रोफ़ाइल करने के लिए व्यापक रूप से उपयोग किया जाने वाला टूल है जो मुख्य रूप से C, C++ और अन्य भाषाओं में लिखे जाते हैं। यह डेवलपर्स को मेमोरी लीक का पता लगाने, मेमोरी एक्सेस त्रुटियों को ट्रैक करने और उनके प्रोग्राम के निष्पादन को प्रोफाइल करने में मदद करता है।

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

C++ में मेमोरी लीक

यह ध्यान रखना महत्वपूर्ण है कि Valgrind मुख्य रूप से C और C++ प्रोग्रामों के लिए डिज़ाइन किया गया है और यह अन्य भाषाओं या सभी परिदृश्यों में उतने प्रभावी ढंग से काम नहीं कर सकता है। इसके अतिरिक्त, वालग्रिंड के तहत एक प्रोग्राम चलाने से इसका निष्पादन काफी धीमा हो सकता है, इसलिए इसका उपयोग अक्सर उत्पादन वातावरण के बजाय विकास और डिबगिंग के दौरान किया जाता है।







जब गतिशील रूप से बनाई गई मेमोरी को ठीक से जारी नहीं किया जाता है, तो यह C/C++ में मेमोरी लीक का कारण बन सकता है जो धीरे-धीरे उपलब्ध मेमोरी संसाधनों को खत्म कर देगा। इसके परिणामस्वरूप अत्यधिक मेमोरी खपत हो सकती है और प्रोग्राम का प्रदर्शन ख़राब हो सकता है।



वालग्रिड स्थापना

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



$ सूडो उपयुक्त अद्यतन

वैलग्रिंड स्थापित करने के लिए पैकेज मैनेजर का उपयोग करें। फिर, आपके लिनक्स वितरण के आधार पर कमांड भिन्न हो सकता है। उबंटू और डेबियन-आधारित सिस्टम के लिए निम्नलिखित कमांड का उपयोग करें:





$ सूडो अपार्ट स्थापित करना चुनाव द्वार

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



इंस्टॉलेशन प्रक्रिया समाप्त होने के बाद, आप सत्यापन चरण के रूप में निम्नलिखित कमांड निष्पादित करके वालग्रिंड की सफल स्थापना की पुष्टि कर सकते हैं:

$ चुनाव द्वार --संस्करण

यदि यह सफलतापूर्वक स्थापित है तो यह कमांड वालग्रिंड की संस्करण जानकारी प्रदर्शित करता है।

इतना ही! अब आपके Linux सिस्टम पर Valgrind इंस्टॉल हो जाना चाहिए, और आप इसका उपयोग मेमोरी लीक और अन्य समस्याओं के लिए अपने C/C++ प्रोग्राम का विश्लेषण और डीबग करने के लिए कर सकते हैं।

उबंटू में एक फ़ाइल बनाना

प्रोग्राम पर काम शुरू करने के लिए, हमें सबसे पहले उबंटू में एक फाइल बनानी होगी। फ़ाइल निर्माण के लिए, हम नैनो टेक्स्ट एडिटर का उपयोग करते हैं। इसलिए, हम टर्मिनल पर कमांड इस प्रकार लिखते हैं:

$ नैनो फ़ाइल1

यहां, नैनो उस टेक्स्ट एडिटर का नाम है जिसे निष्पादित किया जा रहा है। 'फ़ाइल1' तर्क उस फ़ाइल के नाम का प्रतिनिधित्व करता है जिसे आप नैनो टेक्स्ट एडिटर का उपयोग करके खोलना या बनाना चाहते हैं। यदि फ़ाइल पहले से मौजूद है तो नैनो उसे संपादन के लिए खोलता है; यदि नहीं, तो यह दिए गए नाम के साथ एक नई फ़ाइल तैयार करता है। चूँकि हमारे पास ऐसी कोई फ़ाइल नहीं है, यह 'file1' नाम से एक नया दस्तावेज़ बनाता है।

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

अब जब सभी आवश्यक शर्तें पूरी हो गई हैं, तो हम C++ प्रोग्राम में मेमोरी लीक का पता लगाने के लिए Valgrind का उपयोग करने के लिए कुछ उदाहरण बनाते हैं।

उदाहरण 1:

पहला उदाहरण जो हम प्रदान करते हैं वह सी में लाइब्रेरी से 'मॉलोक' फ़ंक्शन का उपयोग करके गतिशील मेमोरी आवंटन का एक सरल उदाहरण प्रदर्शित करता है।

#शामिल करें

int यहाँ मुख्य ( )

{

चार * = मॉलोक ( 102 ) ;

वापस करना 0 ;

}

यहां कोड का विवरण दिया गया है:

हम सबसे पहले मानक लाइब्रेरी हेडर फ़ाइल को शामिल करते हैं जो गतिशील मेमोरी आवंटन और डीलोकेशन के लिए मॉलोक जैसे फ़ंक्शन प्रदान करता है।

Int main() लाइन मुख्य फ़ंक्शन घोषित करती है। फिर, char *a = Malloc(102); char* प्रकार का एक पॉइंटर वेरिएबल 'ए' घोषित करता है (पॉइंटर टू चार)। यह 102 चार तत्वों (कुल 102 बाइट्स) की एक सरणी के लिए मेमोरी को गतिशील रूप से आवंटित करने के लिए 'मॉलोक' फ़ंक्शन का उपयोग करता है। बाइट्स में व्यक्त मेमोरी आवंटन आकार, मॉलोक फ़ंक्शन के इनपुट के रूप में भेजा जाता है और यह ताज़ा बनाए गए मेमोरी ब्लॉक में एक पॉइंटर आउटपुट करता है। चार* पॉइंटर 'ए' को यह पॉइंटर मान निर्दिष्ट किया गया है। अंत में, 'वापसी 0;' मुख्य कार्य के अंत का प्रतीक है।

संक्षेप में, यह कोड 'मॉलोक' का उपयोग करके 102 चार तत्वों की एक सरणी के लिए गतिशील रूप से मेमोरी आवंटित करता है और पॉइंटर 'ए' को मेमोरी एड्रेस निर्दिष्ट करता है। हालाँकि, ध्यान दें कि कोड किसी भी तरह से आवंटित मेमोरी का उपयोग या हेरफेर नहीं करता है और इसमें फ्री का उपयोग करके मेमोरी का डीलोकेशन शामिल नहीं है।

जब हम इस प्रोग्राम को वेलग्रिंड के माध्यम से '-लीक-चेक=फुल' विकल्प के साथ चलाते हैं, तो यह मेमोरी लीक की जांच करता है और एक आउटपुट रिपोर्ट प्रदान करता है।

वालग्रिड द्वारा तैयार की गई आउटपुट रिपोर्ट इस प्रकार दी गई है:

उदाहरण 2:

इस चित्रण को शुरू करने के लिए, हम पहले नैनो टेक्स्ट एडिटर का उपयोग करके एक 'टेस्ट2' फ़ाइल बनाते हैं जैसा कि पहले कमांड लिखकर बताया गया है:

$ नैनो परीक्षण2

अब, हम Valgrind का उपयोग करके यह जांचने के लिए एक C++ प्रोग्राम लिखते हैं कि कोई मेमोरी लीक तो नहीं है:

#शामिल करें

#शामिल

#शामिल करें

const int a_s = 3000 ;

मुख्य प्रवेश बिंदु ( ) {

int यहाँ * आईए = मॉलोक ( का आकार ( int यहाँ ) * जैसा ) ;

के लिए ( पूर्णांक मैं = 0 ; मैं < जैसा; मैं++ ) {

उसे [ मैं ] = मैं;

}

srand ( समय ( व्यर्थ ) ) ;

इंट आरएन = रैंड ( ) % जैसा;

printf ( 'यह[%d]: %d \एन ' , आरएन, यह [ आर एन ] ) ;

वापस करना 0 ;

}

आइए कार्यक्रम के बारे में जानें।

कोड में आवश्यक हेडर फ़ाइलें शामिल हैं और 3000 के मान के साथ 'a_s' स्थिर चर को परिभाषित करता है। मुख्य() फ़ंक्शन के अंदर, int* प्रकार का एक पॉइंटर 'ia' घोषित किया जाता है और मेमोरी को 'मॉलोक' का उपयोग करके गतिशील रूप से आवंटित किया जाता है। समारोह। 'sizeof(int) * a_s' अभिव्यक्ति पूर्णांकों की 'a_s' संख्या को संग्रहीत करने के लिए कुल आवश्यक मेमोरी निर्धारित करती है। 'आईए' सरणी के सभी तत्वों को इसके संबंधित सूचकांक मूल्य के साथ 'फॉर' लूप द्वारा प्रारंभ किया गया है। उदाहरण के लिए, ia[0] 0 होगा, ia[1] 1 होगा, इत्यादि।

यादृच्छिक संख्या जनरेटर को वर्तमान समय का उपयोग करके 'स्रांड' फ़ंक्शन का उपयोग करके सीड किया जाता है। यह सुनिश्चित करता है कि प्रोग्राम हर बार निष्पादित होने पर यादृच्छिक पूर्णांकों का एक अद्वितीय सेट तैयार करता है। 'रैंड' फ़ंक्शन एक यादृच्छिक संख्या उत्पन्न करता है, और 'आरएन' को रैंड()% a_s के परिणाम के साथ असाइन किया जाता है। मॉड्यूलस ऑपरेटर '%' यादृच्छिक संख्या की सीमा को 0 और a_s - 1 के बीच सीमित करता है जो 'ia' सरणी के भीतर एक वैध सूचकांक से मेल खाता है।

अंत में, प्रोग्राम 'ia' सरणी के यादृच्छिक रूप से चयनित इंडेक्स 'rn' पर संबंधित इंडेक्स के साथ मान प्रिंट करने के लिए 'प्रिंटफ' फ़ंक्शन का उपयोग करता है।

जब आप इस प्रोग्राम को वालग्रिंड के माध्यम से चलाते हैं, तो यह निम्नलिखित आउटपुट रिपोर्ट उत्पन्न करता है:

  कंप्यूटर प्रोग्राम विवरण का एक स्क्रीनशॉट स्वचालित रूप से उत्पन्न होता है

निष्कर्ष

हमने C++ प्रोग्राम में मेमोरी लीक का पता लगाने के लिए वालग्रिंड टूल के उपयोग का पता लगाया। वालग्रिंड की स्थापना मार्गदर्शिका प्रारंभ में प्रदान की गई है। उसके बाद, हमने नैनो टेक्स्ट एडिटर का उपयोग करके उबंटू में एक फ़ाइल के निर्माण के बारे में विस्तार से बताया। अंत में, इन पूर्वापेक्षाओं का उपयोग करते हुए, हमने उनमें मेमोरी लीक की जांच करने के लिए दो C++ उदाहरण निष्पादित किए। वालग्रिंड द्वारा तैयार की गई रिपोर्ट भी संलग्न है जो प्रदान की गई फ़ाइल में मेमोरी लीक को दर्शाती है।