خرابی: C++ میں 'GDB ایڈریس پر میموری تک رسائی حاصل نہیں کر سکتا'

Khraby C My Gdb Ay Rys Pr Mymwry Tk Rsayy Hasl N Y Kr Skta



C++ یا کسی دوسری پروگرامنگ زبان میں ایپلی کیشنز تیار کرتے وقت ڈیبگنگ اس عمل کا ایک لازمی حصہ ہے۔ C++ میں ایپلی کیشنز بنانا آسان نہیں ہے۔ اس میں ڈیٹا ڈھانچہ کی اچھی مہارتیں، بگ فکسنگ کی مہارتیں، اور ڈیبگنگ ٹولز کا انتظام شامل ہے۔ GDB، GNU Debugger، ایک موثر ٹول ہے جو ڈویلپرز کو ان کے کوڈ میں موجود غلطیوں کی شناخت اور حل کرنے میں مدد کرتا ہے۔ GDB ایک دلچسپ سادہ اور کارآمد ٹول ہے جو ڈویلپرز کو کوڈ بگز تلاش کرنے اور ٹھیک کرنے میں مدد کرتا ہے۔

تاہم، GDB استعمال کرتے وقت، آپ کو 'خرابی: GDB ایڈریس پر میموری تک رسائی حاصل نہیں کر سکتا' کی خرابی کا سامنا کر سکتا ہے۔ یہ خرابی مبہم ہو سکتی ہے اور ڈیبگنگ کو جاری رکھنا مشکل بنا دیتی ہے۔ یہ مضمون اس بات کی نشاندہی کرنے پر مرکوز ہے کہ یہ خرابی کیوں پیش آتی ہے اور کوڈ کی کچھ مثالوں کو دیکھنا ہے جو اس غلطی کو حل کرنے کا طریقہ سمجھنے میں ہماری مدد کرتے ہیں۔

مثال 1:

آئیے ہم اپنی پہلی کوڈ کی مثال دیکھتے ہیں جس پر عمل درآمد ہونے پر، 'GDB ایڈریس پر میموری تک رسائی حاصل نہیں کر سکتا' کی خرابی دیتا ہے۔ سب سے پہلے، ہم کوڈ کو دیکھتے ہیں. پھر، ہم اس کی لائن بہ لائن وضاحت دیکھیں گے۔







# شامل کریں
استعمال کرتے ہوئے نام کی جگہ std ;
int مرکزی ( باطل ) {
int * ص ;
cout << * ص ;
}

پروگرام '#include ' پری پروسیسر ہدایت کے اعلان اور 'نیم اسپیس std' کے استعمال سے شروع ہوتا ہے جو معیاری ان پٹ اور آؤٹ پٹ فنکشنز کو استعمال کرنے کے لیے پروگرام میں شامل ہونا ضروری ہے۔ اس کے بعد، مین انٹری پوائنٹ آتا ہے جو ہے 'int main(void);'۔ یہ لائن پروگرام کے نقطہ آغاز کا اعلان کرتی ہے۔



مین فنکشن کے اندر، '*p' پوائنٹر متغیر کا اعلان کیا جاتا ہے۔ یہاں، 'p' متغیر کو شروع نہیں کیا گیا ہے۔ لہذا، یہ کسی مخصوص میموری مقام کی طرف اشارہ نہیں کرتا جو عدد کے لیے مخصوص ہے۔ یہ لائن ایک غلطی کا سبب بنتی ہے جسے ہم بعد میں حل کریں گے۔ اگلی لائن میں، ہم 'cout' سٹیٹمنٹ کا استعمال کرتے ہوئے '*p' متغیر کی ویلیو پرنٹ کرنے کی کوشش کرتے ہیں۔



چونکہ 'p' متغیر ٹائپ انٹیجر کا ایک پوائنٹر ہے، اس لیے ستارہ '*' کا استعمال اس کا حوالہ دینے کے لیے کیا جاتا ہے۔ اس کا مطلب ہے کہ قدر میموری کے مقام پر ہے جس کی طرف اشارہ کرتا ہے۔ تاہم، چونکہ 'p' پوائنٹر شروع نہیں کیا گیا تھا اور کسی مخصوص اور درست جگہ کی طرف اشارہ نہیں کرتا ہے، اس لیے پوائنٹر کو ڈیریفرنس کرنے کا نتیجہ غیر متعینہ رویے کی صورت میں نکلے گا۔ لہذا، اس کے نتیجے میں سسٹم اور کمپائلر کے لحاظ سے مختلف قسم کی غلطیاں پیدا ہوتی ہیں۔ چونکہ ہم اس پروگرام کو ڈیبگ کرنے اور چلانے کے لیے GDB کمپائلر استعمال کر رہے ہیں، اس لیے ڈیبگر مندرجہ ذیل غلطی کو پھینک دے گا۔ خرابی آؤٹ پٹ کے ٹکڑوں میں دکھائی گئی ہے:





جیسا کہ آپ آؤٹ پٹ میں دیکھ سکتے ہیں، ڈیبگر میموری تک رسائی حاصل نہیں کر سکتا۔ یہ پروگرام ایک غیر شروع شدہ پوائنٹر کا حوالہ دیتا ہے، جو اس غیر متعینہ رویے کی بنیادی وجہ ہے۔ اب دیکھتے ہیں کہ ہم اس مسئلے کو کیسے حل کر سکتے ہیں۔ صحیح کوڈ درج ذیل میں دیا گیا ہے۔ اس پر ایک نظر ڈالیں اور ہم بتائیں گے کہ ہم کوڈ میں موجود بگ کو کیسے ٹھیک کرتے ہیں:



# شامل کریں
استعمال کرتے ہوئے نام کی جگہ std ;
int مرکزی ( باطل ) {
int val = 5 ;
int * ص = اور val ;
cout << 'قیمت ہے =' << * ص ;

}

جیسا کہ آپ دیکھ سکتے ہیں، 'int val =5؛' کو شامل کرکے کوڈ میں ترمیم کی گئی ہے۔ بیان یہ لائن 'val' نامی ایک عدد متغیر کا اعلان کرتی ہے اور اسے '5' کی قدر کے ساتھ شروع کرتی ہے۔ اگلی لائن، 'int *p = &val;'، ایک '*p' پوائنٹر متغیر کا اعلان کرتی ہے اور 'val' متغیر کے ایڈریس کی طرف اشارہ کرنے کے لیے شروع کی جاتی ہے۔ پہلے، '*p' پوائنٹر کسی بھی میموری ایڈریس کی طرف اشارہ نہیں کر رہا تھا جس کی وجہ سے 'ایڈریس 0x0 پر میموری تک رسائی نہیں ہو سکتی'۔

اس مسئلے کو حل کرنے کے لیے، 'var' متغیر کا اعلان، آغاز، اور '*p' پوائنٹر کو تفویض کیا جاتا ہے۔ اب، '*p' پوائنٹر 'val' متغیر کے ایڈریس کی طرف اشارہ کر رہا ہے کیونکہ '&' آپریٹر 'val' کا پتہ لیتا ہے اور اسے 'p' کو تفویض کرتا ہے۔ ایک بار پھر، 'cout' کا بیان '*p' پوائنٹر کی قدر پرنٹ کرنے کے لیے استعمال ہوتا ہے۔ '*p' پوائنٹر کے ذریعے حاصل کردہ 'val' کی قدر دیکھنے کے لیے درج ذیل آؤٹ پٹ کا ٹکڑا دیکھیں:

جیسا کہ آپ مشاہدہ کر سکتے ہیں، غلطی کو حل کر دیا گیا ہے اور '5' کی قدر شروع کی گئی ہے کیونکہ '*p' پوائنٹر والیبیل کو کال کر کے 'val' متغیر کو پرنٹ کیا گیا ہے۔

مثال 2:

آئیے ایک اور مثال پر غور کریں جو یہ بتاتی ہے کہ C++ کوڈ پروگرام میں 'GDB ایڈریس پر میموری تک رسائی نہیں کر سکتا' کی خرابی کو کیسے پورا کرے۔ آپ کے حوالہ کے لیے کوڈ درج ذیل میں دیا گیا ہے۔ ایک نظر ڈالیں:

# شامل کریں
int مرکزی ( ) {
int * ص = نئی int [ پندرہ ] ;
حذف کریں [ ] ص ;
std :: cout << ص [ 2 ] << std :: endl ;
واپسی 0 ;
}

سب سے عام منظرناموں میں سے ایک جس کا سامنا ڈویلپرز کو پوائنٹرز کے ساتھ پروگرامنگ کے دوران ہوتا ہے وہ ہے غلط یا غلط میموری مختص کرنا۔ جب بھی C++ پروگرام میں میموری کی غلط تقسیم اور ڈیل لوکیشن ہوتی ہے تو GDB کے نتیجے میں غلطی ہوتی ہے۔

پچھلے کوڈ کی مثال پر غور کرتے ہوئے، ایک '*p' پوائنٹر کو ایک نئے int [15] کے ساتھ شروع کیا گیا ہے۔ یہ بیان متحرک طور پر نئے آپریٹر کا استعمال کرتے ہوئے 15 عدد کی ایک صف مختص کرتا ہے۔ '*p' پوائنٹر متغیر صف کے میموری ایڈریس کو اسٹور کرتا ہے۔

مندرجہ ذیل بیان میں، 'delete[] p؛،' میں کہا گیا ہے کہ ڈیلیٹ[] کمانڈ کا استعمال کرتے ہوئے میموری کو ڈیلوکٹ کیا گیا ہے۔ ڈیلیٹ[] کمانڈ '*p' پوائنٹر کی پہلے سے مختص میموری کو ڈیلوکیٹ کرتی ہے جس کا مطلب ہے کہ دوسرا سسٹم استعمال کرتا ہے جو پہلے سے مختص میموری بلاک کو دوبارہ مختص کرسکتا ہے۔ جب ہم '*p' متغیر کی قدر کو 'cout' بیان کا استعمال کرتے ہوئے پرنٹ کرنے کی کوشش کرتے ہیں، تو ہمیں میموری تک رسائی کی خرابی ملے گی جیسا کہ درج ذیل آؤٹ پٹ میں دیکھا گیا ہے۔

یہاں ذہن میں رکھنے والی چیزیں یہ ہیں کہ آپ کے GDB ورژن اور سسٹم کے لحاظ سے درست غلطی کا پیغام تھوڑا سا مختلف ہو سکتا ہے۔ لیکن 'خرابی: GDB مقام پر میموری تک رسائی حاصل نہیں کر سکتا' اور پچھلے ٹکڑوں میں دی گئی غلطی ایک جیسی ہے۔ اس غلطی کو حل کرنے کے لیے، ہم صرف ڈیلیٹ[] کمانڈ کو 'cout' اسٹیٹمنٹ کے بعد شفٹ کرتے ہیں۔ ترمیم شدہ کوڈ کو درج ذیل میں دیکھیں:

# شامل کریں
int مرکزی ( ) {
int * ص = نئی int [ پندرہ ] ;
کے لیے ( int میں = 0 ; میں < پندرہ ; ++ میں ) {
ص [ میں ] = میں * 2 - 5 + 8 ;
std :: cout << 'p[' << میں << '] = ' << ص [ میں ] << std :: endl ;
}
حذف کریں [ ] ص ;
واپسی 0 ;
}

یہاں، آپ دیکھ سکتے ہیں کہ ہم نے رن ٹائم کے حساب سے اری کو شروع کیا ہے، اور ہم 'for' لوپ کا استعمال کرتے ہوئے لوپ کی تمام ویلیوز پرنٹ کرتے ہیں۔ یہاں نوٹ کرنے کی سب سے اہم چیز ڈیلیٹ[] اسٹیٹمنٹ کو تبدیل کرنا ہے۔ اب اسے صف کی تمام اقدار حاصل کرنے کے بعد کہا جاتا ہے جس نے میموری تک رسائی کی خرابی کو دور کر دیا ہے۔ درج ذیل میں کوڈ کی حتمی پیداوار دیکھیں:

نتیجہ

آخر میں، 'خرابی: GDB ایڈریس پر میموری تک رسائی حاصل نہیں کر سکتا' غلطی عام طور پر C++ کوڈ میں میموری سے متعلق مسائل کی نشاندہی کرتی ہے۔ اس مضمون میں کچھ عام منظرناموں کی کھوج کی گئی ہے جو اس غلطی کو شروع کرتے ہیں اس بات کی وضاحت کرنے کے لیے کہ اسے کب اور کیسے حل کیا جا سکتا ہے۔ جب کوڈ میں یہ خرابی واقع ہوتی ہے، تو یہ ضروری ہے کہ پوائنٹر متغیرات، میموری مختص، صفوں اور ڈھانچے پر گہری توجہ دے کر اس کا بغور جائزہ لیں۔

مزید بریک پوائنٹس جیسی خصوصیات جو GDB کی طرف سے فراہم کی جاتی ہیں پروگرام کو ڈیبگ کرتے وقت غلطی کا پتہ لگانے میں مدد کر سکتی ہیں۔ یہ خصوصیات میموری سے متعلق غلطیوں کے صحیح مقام کی نشاندہی کرنے میں مدد کر سکتی ہیں۔ ان مسائل کو فعال طور پر حل کرنے سے، ڈویلپرز اپنی C++ ایپلی کیشنز کے استحکام اور بھروسے کو بڑھا سکتے ہیں۔