C++ میں سیگمنٹیشن فالٹ کی وجہ کیسے تلاش کی جائے۔

C My Sygmn Yshn Fal Ky Wj Kys Tlash Ky Jay



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

سیگمنٹیشن کی خرابیاں ڈیبگ کرنا مشکل ہو سکتی ہیں کیونکہ ان کے نتیجے میں اکثر خرابی کے تفصیلی پیغامات فراہم کیے بغیر کریش ہو جاتے ہیں۔ تاہم، GDB (GNU Debugger) جیسے ٹولز پروگرام کی حالت اور خرابی کے وقت اسٹیک ٹریس کی جانچ کرکے سیگمنٹیشن فالٹ کے ماخذ کی شناخت میں مدد کرسکتے ہیں۔

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







  • کالعدم یا غیر شروع شدہ پوائنٹرز کا حوالہ دینا
  • کسی صف کی حدود سے باہر لکھنا یا پڑھنا
  • ایسی میموری کا استعمال کرنا جو پہلے ڈیلوکیٹ یا جاری کی گئی ہو۔
  • اسٹیک اوور فلو یا اسٹیک کرپشن
  • غیر شروع شدہ متغیرات کا استعمال

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



GDB ڈیبگر

GDB (GNU Debugger) ایک طاقتور ڈیبگنگ ٹول ہے جو مرتب شدہ پروگراموں میں مسائل کی شناخت اور تجزیہ کرنے میں مدد کرتا ہے بشمول سیگمنٹیشن فالٹس۔ یہ آپ کو پروگرام کی حالت کا جائزہ لینے، بریک پوائنٹس کو متحرک کرنے، اور عملدرآمد کے بہاؤ کا مشاہدہ کرنے کے قابل بناتا ہے۔



سیگمنٹیشن فالٹس کو ڈیبگ کرنے کے لیے GDB کو مؤثر طریقے سے استعمال کرنے کے لیے، آپ کو اپنے C++ پروگرام کو فعال ڈیبگنگ علامتوں کے ساتھ مرتب کرنا ہوگا۔ ان علامتوں میں پروگرام کے ڈھانچے، متغیرات اور افعال کے بارے میں اضافی معلومات شامل ہیں جو ڈیبگنگ کے عمل میں معاون ہیں۔





GDB کے ساتھ C++ میں سیگمنٹیشن فالٹ تلاش کرنا

یہاں ایک مثال کوڈ کا ٹکڑا ہے جو سیگمنٹیشن فالٹ کا سبب بنتا ہے:

# شامل کریں

int مرکزی ( ) {

int * ptr = nullptr ;

* ptr = 5 ;

واپسی 0 ;

}

آئیے پہلے کوڈ کی وضاحت کرتے ہیں۔ پھر، ہم پچھلے کوڈ میں سیگمنٹیشن فالٹ تلاش کرنے کے بارے میں اقدامات پر بات کریں گے۔



'#include ' پری پروسیسر ہدایت مطلوبہ ہیڈر فائل کو شامل کرتی ہے جو C++ میں ان پٹ کے ساتھ ساتھ آؤٹ پٹ اسٹریم کی خصوصیات بھی پیش کرتی ہے۔

مین() فنکشن کے اندر، int* قسم کے ایک پوائنٹر متغیر 'ptr' کا اعلان ہوتا ہے۔ 'nullptr' ویلیو کو پوائنٹر کی ابتداء کے طور پر استعمال کیا جاتا ہے جو کہ ایک خاص null پوائنٹر ویلیو ہے جو اس بات کی نشاندہی کرتی ہے کہ یہ کسی بھی طرف اشارہ نہیں کرتا ہے۔ درست میموری کا مقام۔

مندرجہ ذیل لائن میں null پوائنٹر 'ptr' کے ساتھ ڈیریفرنس کی کوششیں کی جاتی ہیں جو کہ '*ptr = 5؛' ہے۔ اس صورت میں، چونکہ 'ptr' کو 'nullptr' پر سیٹ کیا گیا ہے، اس لیے رسائی کے لیے کوئی درست میموری مقام نہیں ہے۔

اب، ہم کچھ ایسے اقدامات پر تبادلہ خیال کریں گے جنہیں پروگرام کو مرتب کرنے کے لیے اپنانے کی ضرورت ہے تاکہ تقسیم کی خرابی کو تلاش کیا جا سکے۔

مرحلہ 1: ڈیبگنگ سمبلز کو فعال کریں۔

شروع کرنے کے لیے، اپنے C++ پروگرام کو فعال ڈیبگنگ علامتوں کے ساتھ مرتب کرنا یقینی بنائیں۔ تالیف کے دوران قابل عمل فائل کو ڈیبگنگ کی معلومات فراہم کرنے کے لیے، '-g' جھنڈا استعمال کریں۔ اس معاملے پر غور کریں جہاں ہمارے پاس 'main.cpp' نامی C++ فائل ہے۔

$ g++ -جی main.cpp -O مرکزی

مرحلہ 2: GDB چلائیں۔

ایک بار جب پروگرام ڈیبگنگ علامتوں کے ساتھ مرتب ہو جائے تو، قابل عمل فائل کو دلیل کے طور پر پاس کر کے GDB چلائیں۔

$ جی ڈی بی مرکزی

مرحلہ 3: پروگرام شروع کریں۔

GDB پرامپٹ پر 'رن' یا 'r' ٹائپ کرکے پروگرام شروع کریں:

$ ( جی ڈی بی ) رن

اس کے بعد آپ کا پروگرام کام کرنا شروع کر دے گا۔

مرحلہ 4: سیگمنٹیشن فالٹ کی شناخت کریں۔

پروگرام اس وقت تک چلتا رہتا ہے جب تک کہ اس میں سیگمنٹیشن کی خرابی کا سامنا نہ ہو۔ پھر پروگرام چلنا بند کر دیتا ہے، اور GDB ایک غلطی کا پیغام تیار کرتا ہے۔

مثال کے طور پر: آئیے پہلے بیان کردہ کوڈ پر غور کریں جہاں جب ہم 5 کی قدر کو میموری کے مقام پر تفویض کرنے کی کوشش کرتے ہیں جس کی طرف null pointer کی طرف اشارہ کیا جاتا ہے، تو اس کے نتیجے میں سیگمنٹیشن فالٹ ہوتا ہے۔ پروگرام فوری طور پر اس لائن پر ختم ہو جاتا ہے جہاں سیگمنٹیشن فالٹ ہوتا ہے۔

اس پروگرام کو GDB کے ساتھ چلاتے وقت، آپ کو مندرجہ ذیل سے ملتا جلتا آؤٹ پٹ نظر آئے گا۔

یہ آؤٹ پٹ اس بات کی نشاندہی کرتا ہے کہ 'main.cpp' فائل کی لائن 5 پر مین فنکشن میں سیگمنٹیشن کی خرابی واقع ہوئی ہے۔

مرحلہ 5: اسٹیک ٹریس کی جانچ کریں۔

سیگمنٹیشن فالٹ کے بارے میں مزید بصیرت حاصل کرنے کے لیے، آپ 'backtrace' کمانڈ یا صرف 'bt' کا استعمال کرتے ہوئے اسٹیک ٹریس کی جانچ کر سکتے ہیں۔ یہ کمانڈ فنکشن کالز کی ترتیب دکھاتا ہے جو کریش کی طرف جاتا ہے۔

$ ( جی ڈی بی ) بی ٹی

اسٹیک ٹریس ظاہر ہوتا ہے جو ان افعال کی نشاندہی کرتا ہے جنہیں سیگمنٹیشن فالٹ سے پہلے کہا جاتا ہے:

یہ آؤٹ پٹ ہمیں بتاتا ہے کہ سیگمنٹیشن کی خرابی 'main.cpp' فائل کی لائن 5 پر مین فنکشن میں ہوئی ہے۔

مرحلہ 6: بریک پوائنٹس سیٹ کریں۔

مزید تفتیش کے لیے، آپ کوڈ کی مخصوص لائنوں پر بریک پوائنٹس سیٹ کر سکتے ہیں تاکہ ان پوائنٹس پر پروگرام کے عمل کو روکا جا سکے۔ یہ آپ کو پروگرام کی حالت اور متغیرات کا معائنہ کرنے کی اجازت دیتا ہے۔ مثال کے طور پر، 'main.cpp' کی لائن 5 پر بریک پوائنٹ سیٹ کرنے کے لیے، 'break' کمانڈ کو اس طرح استعمال کریں:

$ ( جی ڈی بی ) توڑنا main.cpp: 5

یہ 'main.cpp' فائل کی لائن 5 پر ایک بریک پوائنٹ سیٹ کرتا ہے:

مرحلہ 7: عملدرآمد دوبارہ شروع کریں۔

بریک پوائنٹس کو سیٹ کرنے کے بعد، 'جاری' کمانڈ یا صرف 'c' کا استعمال کرتے ہوئے پروگرام کے عمل کو دوبارہ شروع کریں:

$ ( جی ڈی بی ) جاری رہے

پروگرام بریک پوائنٹ پر پہنچنے تک چلتا رہتا ہے۔

مرحلہ 8: متغیرات اور کوڈ کا معائنہ کریں۔

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

مرحلہ 9: GDB چھوڑ دیں۔

ایک بار جب آپ ڈیبگنگ مکمل کر لیتے ہیں، تو آپ 'quit' کمانڈ کا استعمال کرتے ہوئے GDB سے باہر نکل سکتے ہیں:

$ ( جی ڈی بی ) چھوڑو

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

نتیجہ

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