त्रुटि: C++ में 'GDB पते पर मेमोरी तक नहीं पहुंच सकता'।

Truti C Mem Gdb Pate Para Memori Taka Nahim Pahunca Sakata



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

हालाँकि, GDB का उपयोग करते समय, आपको 'त्रुटि: GDB पते पर मेमोरी तक नहीं पहुंच सकता' त्रुटि का सामना करना पड़ सकता है। यह त्रुटि भ्रमित करने वाली हो सकती है और डिबगिंग जारी रखना कठिन बना देती है। यह आलेख यह पहचानने पर केंद्रित है कि यह त्रुटि क्यों होती है और कोड के कुछ उदाहरणों को देख रहा है जो हमें यह समझने में मदद करते हैं कि इस त्रुटि को कैसे हल किया जाए।

उदाहरण 1:

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







#शामिल
का उपयोग करते हुए नाम स्थान कक्षा ;
int यहाँ मुख्य ( खालीपन ) {
int यहाँ * पी ;
अदालत << * पी ;
}

कार्यक्रम '#include ' प्रीप्रोसेसर निर्देश की घोषणा और 'नेमस्पेस एसटीडी' का उपयोग करने के साथ शुरू होता है जो मानक इनपुट और आउटपुट फ़ंक्शंस का उपयोग करने के लिए प्रोग्राम में शामिल होना आवश्यक है। उसके बाद, मुख्य प्रवेश बिंदु आता है जो 'int main(void);' है। यह पंक्ति प्रोग्राम के आरंभिक बिंदु की घोषणा करती है।



मुख्य फ़ंक्शन के भीतर, '*p' पॉइंटर वेरिएबल घोषित किया गया है। यहां, 'पी' वेरिएबल प्रारंभ नहीं किया गया है। इसलिए, यह किसी विशिष्ट मेमोरी स्थान को इंगित नहीं करता है जो पूर्णांक के लिए आरक्षित है। यह लाइन एक त्रुटि का कारण बनती है जिसे हम बाद में हल करेंगे। अगली पंक्ति में, हम 'काउट' स्टेटमेंट का उपयोग करके '*p' वेरिएबल का मान प्रिंट करने का प्रयास करते हैं।



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





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



#शामिल
का उपयोग करते हुए नाम स्थान कक्षा ;
int यहाँ मुख्य ( खालीपन ) {
int यहाँ वैल = 5 ;
int यहाँ * पी = & वैल ;
अदालत << 'मान है = ' << * पी ;

}

जैसा कि आप देख सकते हैं, कोड को 'int val =5;' को शामिल करके संशोधित किया गया है। कथन। यह पंक्ति 'वैल' नामक एक पूर्णांक चर घोषित करती है और इसे '5' के मान से प्रारंभ करती है। अगली पंक्ति, 'int *p = &val;', एक '*p' पॉइंटर वेरिएबल घोषित करती है और इसे 'वैल' वेरिएबल के पते पर इंगित करने के लिए आरंभ किया जाता है। पहले, '*p' पॉइंटर किसी भी मेमोरी एड्रेस की ओर इशारा नहीं कर रहा था, जिसके कारण 'एड्रेस 0x0 पर मेमोरी एक्सेस नहीं किया जा सकता'।

इस समस्या को हल करने के लिए, 'var' वेरिएबल को घोषित किया गया है, आरंभ किया गया है, और '*p' पॉइंटर को सौंपा गया है। अब, '*p' पॉइंटर 'वैल' वेरिएबल के पते की ओर इशारा कर रहा है क्योंकि '&' ऑपरेटर 'वैल' का पता लेता है और इसे 'पी' को असाइन करता है। फिर से, '*p' पॉइंटर के मान को प्रिंट करने के लिए 'cout' स्टेटमेंट का उपयोग किया जाता है। '*p' पॉइंटर द्वारा एक्सेस किए गए 'वैल' का मान देखने के लिए निम्नलिखित आउटपुट स्निपेट देखें:

जैसा कि आप देख सकते हैं, त्रुटि का समाधान कर दिया गया है और '5' का मान आरंभ किया गया है क्योंकि '*p' सूचक को कॉल करके 'वैल' वेरिएबल मुद्रित किया गया है।

उदाहरण 2:

आइए एक और उदाहरण पर विचार करें जो बताता है कि C++ कोड प्रोग्राम में 'जीडीबी पते पर मेमोरी तक पहुंच नहीं सकता' त्रुटि को कैसे ठीक किया जाए। आपके संदर्भ के लिए कोड निम्नलिखित में दिया गया है। एक नज़र देख लो:

#शामिल करें
int यहाँ मुख्य ( ) {
int यहाँ * पी = नया int यहाँ [ पंद्रह ] ;
मिटाना [ ] पी ;
कक्षा :: अदालत << पी [ 2 ] << कक्षा :: अंतः ;
वापस करना 0 ;
}

पॉइंटर्स के साथ प्रोग्रामिंग करते समय डेवलपर्स के सामने सबसे आम परिदृश्यों में से एक गलत या अनुचित मेमोरी आवंटन है। जब भी C++ प्रोग्राम में गलत मेमोरी आवंटन और डीलोकेशन होता है तो GDB में त्रुटि उत्पन्न होती है।

पिछले कोड उदाहरण को ध्यान में रखते हुए, एक '*p' पॉइंटर को एक नए int[15] के साथ आरंभ किया गया है। यह कथन नए ऑपरेटर का उपयोग करके गतिशील रूप से 15 पूर्णांकों की एक सरणी आवंटित करता है। '*p' पॉइंटर वैरिएबल ऐरे के मेमोरी एड्रेस को स्टोर करता है।

निम्नलिखित कथन में, 'delete[] p;,' बताता है कि मेमोरी को delete[] कमांड का उपयोग करके हटा दिया गया है। डिलीट[] कमांड '*p' पॉइंटर की पहले से आवंटित मेमोरी को हटा देता है, जिसका अर्थ है कि अन्य सिस्टम उपयोग पहले से आवंटित मेमोरी ब्लॉक को फिर से आवंटित कर सकता है। जब हम 'काउट' स्टेटमेंट का उपयोग करके '*p' वेरिएबल का मान प्रिंट करने का प्रयास करते हैं, तो हमें मेमोरी एक्सेस त्रुटि मिलेगी जैसा कि निम्नलिखित आउटपुट में देखा गया है:

यहां ध्यान रखने वाली बात यह है कि सटीक त्रुटि संदेश आपके GDB संस्करण और सिस्टम के आधार पर थोड़ा भिन्न हो सकता है। लेकिन 'त्रुटि: जीडीबी स्थान पर मेमोरी तक नहीं पहुंच सकता' और पिछले स्निपेट में दी गई त्रुटि समान है। इस त्रुटि को हल करने के लिए, हम बस डिलीट[] कमांड को 'काउट' स्टेटमेंट के बाद शिफ्ट कर देते हैं। निम्नलिखित में संशोधित कोड देखें:

#शामिल करें
int यहाँ मुख्य ( ) {
int यहाँ * पी = नया int यहाँ [ पंद्रह ] ;
के लिए ( int यहाँ मैं = 0 ; मैं < पंद्रह ; ++ मैं ) {
पी [ मैं ] = मैं * 2 - 5 + 8 ;
कक्षा :: अदालत << 'पी[' << मैं << '] = ' << पी [ मैं ] << कक्षा :: अंतः ;
}
मिटाना [ ] पी ;
वापस करना 0 ;
}

यहां, आप देख सकते हैं कि हमने सरणी को उन मानों के साथ आरंभ किया है जिनकी गणना रन टाइम पर की जाती है, और हम 'फॉर' लूप का उपयोग करके लूप के सभी मानों को प्रिंट करते हैं। यहां ध्यान देने वाली सबसे महत्वपूर्ण बात है डिलीट[] स्टेटमेंट का स्थानांतरण; इसे अब सरणी के सभी मान प्राप्त करने के बाद कॉल किया जाता है जिसने मेमोरी एक्सेस त्रुटि को हटा दिया है। निम्नलिखित में कोड का अंतिम आउटपुट देखें:

निष्कर्ष

अंत में, 'त्रुटि: जीडीबी पते पर मेमोरी तक नहीं पहुंच सकता' त्रुटि आमतौर पर C++ कोड में मेमोरी से संबंधित समस्याओं को इंगित करती है। इस आलेख में कुछ सामान्य परिदृश्यों की खोज की गई है जो इस त्रुटि को शुरू करते हैं ताकि यह समझाया जा सके कि इसे कब और कैसे हल किया जा सकता है। जब कोड में यह त्रुटि होती है, तो पॉइंटर वेरिएबल्स, मेमोरी आवंटन, एरेज़ और संरचनाओं पर बारीकी से ध्यान देकर इसकी सावधानीपूर्वक समीक्षा करना आवश्यक है।

इसके अलावा, जीडीबी द्वारा प्रदान की गई ब्रेकप्वाइंट जैसी सुविधाएं प्रोग्राम को डीबग करते समय त्रुटि का पता लगाने में मदद कर सकती हैं। ये सुविधाएँ स्मृति-संबंधी त्रुटियों के सटीक स्थान को इंगित करने में मदद कर सकती हैं। इन मुद्दों को सक्रिय रूप से संबोधित करके, डेवलपर्स अपने C++ अनुप्रयोगों की स्थिरता और विश्वसनीयता बढ़ा सकते हैं।