Valgrind کے ساتھ C/C++ میں میموری کی لیکس کا پتہ لگانے کا طریقہ

Valgrind K Sat C C My Mymwry Ky Lyks Ka Pt Lgan Ka Tryq



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

جب آپ Valgrind کے تحت کوئی پروگرام چلاتے ہیں، تو یہ متحرک طور پر پروگرام کے قابل عمل آلات کو تیار کرتا ہے، جس سے یہ پروگرام کے میموری کے استعمال اور عمل کے رویے کی نگرانی کر سکتا ہے۔

C++ میں میموری کا اخراج

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







جب متحرک طور پر بنائی گئی میموری کو صحیح طریقے سے جاری نہیں کیا جاتا ہے، تو یہ C/C++ میں میموری لیک ہونے کا سبب بن سکتا ہے جو دستیاب میموری کے وسائل کو آہستہ آہستہ ختم کر دے گا۔ اس کے نتیجے میں ضرورت سے زیادہ میموری کی کھپت اور پروگرام کی کارکردگی خراب ہو سکتی ہے۔



والگرڈ کی تنصیب

لینکس سسٹم پر والگرینڈ انسٹال کرنے کے لیے، ایک ٹرمینل کھولیں اور پیکیج مینیجر کا استعمال کرتے ہوئے اپنے پیکیج ریپوزٹری کو اپ ڈیٹ کریں جو آپ کے لینکس کی تقسیم کے لیے مخصوص ہے۔ درج ذیل کمانڈ Ubuntu اور Debian پر مبنی نظاموں کے لیے کام کرتی ہے۔



$ sudo مناسب اپ ڈیٹ

ویلگرینڈ انسٹال کرنے کے لیے پیکیج مینیجر کا استعمال کریں۔ ایک بار پھر، آپ کی لینکس کی تقسیم کے لحاظ سے کمانڈ مختلف ہو سکتی ہے۔ Ubuntu اور Debian پر مبنی سسٹمز کے لیے درج ذیل کمانڈ استعمال کریں:





$ sudo مناسب انسٹال کریں الیکشن گیٹ

جب اشارہ کیا جائے تو اپنا صارف پاس ورڈ درج کریں اور 'Enter' دبائیں۔ نوٹ کریں کہ آپ کے صارف اکاؤنٹ کو سافٹ ویئر انسٹال کرنے کے لیے انتظامی مراعات کی ضرورت ہے۔ پیکیج مینیجر والگرینڈ کو کسی بھی ضروری انحصار کے ساتھ ڈاؤن لوڈ اور انسٹال کرتا ہے۔ اس عمل میں چند منٹ لگ سکتے ہیں۔



انسٹالیشن کا عمل مکمل ہونے کے بعد، آپ تصدیقی قدم کے طور پر درج ذیل کمانڈ پر عمل کر کے Valgrind کی کامیاب انسٹالیشن کی تصدیق کر سکتے ہیں۔

$ الیکشن گیٹ --ورژن

یہ کمانڈ Valgrind کے ورژن کی معلومات دکھاتی ہے اگر یہ کامیابی سے انسٹال ہو جاتی ہے۔

یہی ہے! Valgrind اب آپ کے لینکس سسٹم پر انسٹال ہونا چاہیے، اور آپ اسے میموری لیک اور دیگر مسائل کے لیے اپنے C/C++ پروگراموں کا تجزیہ اور ڈیبگ کرنے کے لیے استعمال کر سکتے ہیں۔

اوبنٹو میں فائل بنانا

پروگرام پر کام شروع کرنے کے لیے، ہمیں سب سے پہلے Ubuntu میں ایک فائل بنانے کی ضرورت ہے۔ فائل بنانے کے لیے، ہم نینو ٹیکسٹ ایڈیٹر استعمال کرتے ہیں۔ لہذا، ہم ٹرمینل پر درج ذیل کمانڈ لکھتے ہیں:

$ نینو فائل 1

یہاں، نینو ٹیکسٹ ایڈیٹر کا نام ہے جس پر عمل کیا جا رہا ہے۔ 'فائل 1' دلیل اس فائل کے نام کی نمائندگی کرتی ہے جسے آپ نینو ٹیکسٹ ایڈیٹر کا استعمال کرکے کھولنا یا تخلیق کرنا چاہتے ہیں۔ نینو فائل کو ایڈیٹنگ کے لیے کھولتا ہے اگر یہ پہلے سے موجود ہے۔ اگر نہیں، تو یہ فراہم کردہ نام کے ساتھ ایک نئی فائل تیار کرتا ہے۔ چونکہ ہمارے پاس ایسی فائل نہیں ہے، اس لیے یہ 'file1' نام کے ساتھ ایک نئی دستاویز بناتی ہے۔

ایک بار جب آپ کمانڈ چلاتے ہیں، نینو ایڈیٹر کھل جائے گا، آپ کو 'file1' فائل کے مواد میں داخل یا ترمیم کرنے کے لیے ایک خالی کینوس فراہم کرے گا۔ آپ ایڈیٹر میں موجودہ مواد کو ٹائپ یا پیسٹ کرنا شروع کر سکتے ہیں۔

اب جب کہ تمام شرائط پوری ہو گئی ہیں، ہم C++ پروگراموں میں میموری لیک ہونے کا پتہ لگانے کے لیے Valgrind استعمال کرنے کے لیے کچھ مثالیں بناتے ہیں۔

مثال 1:

پہلی مثال جو ہم فراہم کرتے ہیں وہ C میں لائبریری سے 'malloc' فنکشن کا استعمال کرتے ہوئے متحرک میموری مختص کرنے کی ایک سادہ مثال کو ظاہر کرتی ہے۔

# شامل کریں

int مرکزی ( )

{

چار * a = malloc ( 102 ) ;

واپسی 0 ;

}

یہاں کوڈ کی خرابی ہے:

ہم سب سے پہلے معیاری لائبریری ہیڈر فائل شامل کرتے ہیں جو متحرک میموری کی تقسیم اور ڈیل لوکیشن کے لیے malloc جیسے فنکشن فراہم کرتی ہے۔

int main() لائن مین فنکشن کا اعلان کرتی ہے۔ پھر، char *a = malloc(102)؛ ایک پوائنٹر متغیر کا اعلان کرتا ہے 'a' قسم char* (پوائنٹر ٹو چار)۔ یہ 102 چار عناصر (کل 102 بائٹس) کے لیے میموری کو متحرک طور پر مختص کرنے کے لیے 'malloc' فنکشن کا استعمال کرتا ہے۔ میموری ایلوکیشن سائز، جس کا اظہار بائٹس میں ہوتا ہے، malloc فنکشن میں ان پٹ کے طور پر بھیجا جاتا ہے اور یہ تازہ بنائے گئے میموری بلاک کی طرف ایک پوائنٹر دیتا ہے۔ چار* پوائنٹر 'a' کو یہ پوائنٹر ویلیو تفویض کیا گیا ہے۔ آخر میں، 'واپسی 0؛' مین فنکشن کے اختتام کو ظاہر کرتا ہے۔

مختصراً، یہ کوڈ متحرک طور پر 'malloc' کا استعمال کرتے ہوئے 102 char عناصر کی ایک صف کے لیے میموری کو مختص کرتا ہے اور میموری کا پتہ پوائنٹر 'a' کو تفویض کرتا ہے۔ تاہم، نوٹ کریں کہ کوڈ مختص میموری کو کسی بھی طرح سے استعمال یا ہیرا پھیری نہیں کرتا ہے اور اس میں مفت کا استعمال کرتے ہوئے میموری کی ڈیل لوکیشن شامل نہیں ہے۔

جب ہم اس پروگرام کو Valgrind کے ذریعے '-leak-check=full' آپشن کے ساتھ چلاتے ہیں، تو یہ میموری لیک چیک کرتا ہے اور آؤٹ پٹ رپورٹ فراہم کرتا ہے۔

ویلگرڈ کے ذریعہ تیار کردہ آؤٹ پٹ رپورٹ درج ذیل ہے:

مثال 2:

اس مثال کے ساتھ شروع کرنے کے لیے، ہم سب سے پہلے نینو ٹیکسٹ ایڈیٹر کا استعمال کرتے ہوئے ایک 'test2' فائل بناتے ہیں جیسا کہ پہلے کمانڈ لکھ کر وضاحت کی گئی ہے:

$ نینو ٹیسٹ 2

اب، ہم یہ چیک کرنے کے لیے ایک C++ پروگرام لکھتے ہیں کہ آیا Valgrind کا استعمال کرتے ہوئے کوئی میموری لیک ہوئی ہے:

# شامل کریں

# شامل کریں

#include

const int a_s = 3000 ;

اہم int ( ) {

int * ia = malloc ( کا سائز ( int ) * a_s ) ;

کے لیے ( int i = 0 ; میں < a_s; i++ ) {

یہ [ میں ] = میں

}

srand ( وقت ( خالی ) ) ;

int rn = رینڈ ( ) % a_s;

printf ( 'یہ[%d]: %d \n ' , rn, it [ rn ] ) ;

واپسی 0 ;

}

آئیے پروگرام سے گزرتے ہیں۔

کوڈ میں ضروری ہیڈر فائلیں شامل ہیں اور 3000 کی قدر کے ساتھ 'a_s' مستقل متغیر کی وضاحت کرتا ہے۔ مین() فنکشن کے اندر، قسم int* کے ایک پوائنٹر 'ia' کا اعلان کیا جاتا ہے اور 'malloc' کا استعمال کرتے ہوئے میموری کو متحرک طور پر مختص کیا جاتا ہے۔ فنکشن 'sizeof(int) * a_s' اظہار 'a_s' عدد کے عدد کو ذخیرہ کرنے کے لیے کل مطلوبہ میموری کا تعین کرتا ہے۔ 'ia' سرنی کے تمام عناصر کو 'for' لوپ سے اس کی متعلقہ انڈیکس قدر کے ساتھ شروع کیا جاتا ہے۔ مثال کے طور پر، ia[0] ہوگا 0، ia[1] ہوگا 1، وغیرہ۔

رینڈم نمبر جنریٹر کو موجودہ وقت کا استعمال کرتے ہوئے 'srand' فنکشن کا استعمال کرتے ہوئے سیڈ کیا جاتا ہے۔ یہ اس بات کو یقینی بناتا ہے کہ پروگرام ہر بار اس پر عمل درآمد ہونے پر بے ترتیب عدد کا ایک منفرد سیٹ تیار کرتا ہے۔ 'رینڈ' فنکشن ایک بے ترتیب نمبر تیار کرتا ہے، اور 'rn' کو rand() % a_s کے نتیجے کے ساتھ تفویض کیا جاتا ہے۔ ماڈیولس آپریٹر '%' بے ترتیب نمبر کی حد کو 0 اور a_s – 1 کے درمیان محدود کرتا ہے جو 'ia' صف کے اندر ایک درست انڈیکس سے مطابقت رکھتا ہے۔

آخر میں، پروگرام 'printf' فنکشن کا استعمال کرتا ہے تاکہ متعلقہ انڈیکس کے ساتھ، 'ia' صف کے تصادفی طور پر منتخب کردہ انڈیکس 'rn' پر ویلیو پرنٹ کرے۔

جب آپ اس پروگرام کو Valgrind کے ذریعے چلاتے ہیں، تو یہ درج ذیل آؤٹ پٹ رپورٹ تیار کرتا ہے۔

  کمپیوٹر پروگرام کی تفصیل کا اسکرین شاٹ خود بخود تیار ہوتا ہے۔

نتیجہ

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