[Powered by Google Translate] [Valgrind]
[نیٹ Hardison، ہارورڈ یونیورسٹی]
یہ CS50 ہے، CS50.TV]
C پروگراموں میں سب سے زیادہ مشکل کیڑے کچھ
میموری کی بدانتظامی سے آتے ہیں.
چیزوں کو نچوڑنا کے طریقوں کی ایک بڑی تعداد میں ہیں،
میموری کی غلط رقم کا آونٹن بھی شامل
متغیر ابتدا بھول
سے پہلے یا اس کے بعد ایک بفر کے اختتام پر لکھنے،
آزاد اور میموری ایک سے زیادہ اوقات رکھنے.
علامات وقفے وقفے سے گر کر تباہ سے لے
مشکوک ادلیکھت اقدار،
اکثر مقامات اور اوقات تک اصل غلطی سے ہٹا دیا.
پایا مسئلہ بنیادی جڑ تخریھن واپس
چیلنج کیا جا سکتا ہے،
لیکن خوش قسمتی سے ایک مددگار بلایا Valgrind پروگرام ہے
وہ بہت کی مدد کر سکتے ہیں.
>> آپ Valgrind کے تحت ایک پروگرام کو چالو کرنے کے چلاتے ہیں
ڈھیر میموری کے آونٹن اور رسائی کی وسیع چیکنگ.
جب Valgrind ایک مسئلہ کا پتہ لگاتا ہے، تو آپ کو فوری طور پر فراہم کرتا ہے،
براہ راست معلومات جو آپ کو کرنے کی اجازت دیتا ہے
زیادہ آسانی سے اور اس مسئلہ کو حل تلاش کریں.
بھی کم مہلک میموری کے مسائل پر Valgrind،
جیسا کہ میموری لیک، ڈھیر میموری آونٹن
اور اسے آزاد بھول ہے.
ہمارے debugger سنکلک، بجنا، GDB، طرح
Valgrind مفت سافٹ ویئر ہے، اور اس آلے پر نصب کیا جاتا ہے.
Valgrind اپنے بائنری کارکردگی پر چلتا ہے،
نہیں سی. یا H منبع کوڈ فائلوں،
تو اس بات کا یقین کر لیں کہ آپ کو آپ کے پروگرام کی ایک کاپی کو اپ ڈیٹ مرتب کی ہے
بجنا کا استعمال کرتے ہوئے یا بنائیں.
اس کے بعد، Valgrind کے تحت اپنے پروگرام چلا رہا ہو سکتا ہے
نے صرف لفظ Valgrind کے ساتھ معیاری پروگرام کمان prefixing کے طور پر کے طور پر آسان،
جو شروع ہوتا ہے Valgrind ہے اور اس کے اندر پروگرام چلاتی ہے.
Valgrind جب شروع، کچھ پیچیدہ ہے
میموری چیک کے لئے کارکردگی قابل تشکیل jiggering
تو یہ تھوڑا سا حاصل کرنے کے لئے اور چلانے سکتے ہیں.
پروگرام عام طور پر تو، یہ بہت زیادہ آہستہ آہستہ قتل،
اور جب وہ فارغ ہو جائے، اس کی میموری استعمال کی Valgrind خلاصہ پرنٹ گا.
اگر سب کچھ اچھی طرح سے جاتا ہے، یہ کچھ اس طرح نظر آئے گا:
اس صورت میں، / clean_program.
پروگرام میں چلانا چاہتے ہیں، اس کے پاس راستہ ہے.
اور جب اس سے کوئی بحث نہیں ہے،
اگر یہ میں نے صرف انہیں ہمیشہ کی طرح حکم کے اختتام پر سمت تھا.
صاف پروگرام صرف ایک پاگل سی پروگرام میں پیدا
جو ڈھیر پر ints کا ایک بلاک کے لئے جگہ مختص،
کچھ اقدار ان کے اندر ڈال دیا، اور پورے بلاک آزاد ہے.
اس کا ہے جو آپ کے لئے کوئی غلطیوں اور کوئی لیک شوٹنگ کر رہے ہیں.
>> ایک اور اہم میٹرک مختص بائٹس کی کل تعداد ہے.
پروگرام کی بنیاد پر، اگر آپ کے آونٹن میگا بائٹ یا اس سے زیادہ میں ہیں،
آپ شاید کچھ غلط کر رہے ہیں.
کیا آپ بیکار میں نقلیں ذخیرہ کرنے؟
کیا آپ کو ذخیرہ کرنے کے لیے ڈھیر کا استعمال کرتے ہوئے، جب یہ بہتر ہو گا اسٹیک استعمال کرنے کے لئے کرے گا؟
لہذا، میموری کی غلطیوں کو واقعی برا ہو سکتا ہے.
زیادہ ظاہر ہوتے شاندار گر کر تباہ کی وجہ سے،
لیکن پھر بھی یہ مشکل اشارہ اب بھی ہو سکتا ہے
کیا بالکل حادثے کی وجہ سے.
ایک میموری کی خرابی کے ساتھ مزید insidiously ایک پروگرام
cleanly اب بھی مرتب کر سکتے ہیں
اور پھر بھی صحیح طریقے سے کام کرنے کے لئے لگ رہے ہو کر سکتے ہیں
کیونکہ آپ نے خوش وقت کے سب سے زیادہ حاصل کرنے کے لئے.
کئی کے بعد "کامیاب نتائج"
آپ نے ابھی لگتا ہے کہ ہو سکتا ہے کہ کمپیوٹر کے ایک حادثے میں ایک عارضی ہے،
لیکن کمپیوٹر کبھی غلط نہیں ہے.
>> Valgrind چل رہا ہے میں آپ کی مدد نظر آئے میموری کی غلطیوں کی وجہ سے ٹریک کر سکتے ہیں
کے ساتھ ساتھ غلطیاں lurking تلاش آپ کے بارے میں بھی ابھی تک پتہ نہیں ہے.
ہر بار Valgrind ایک مسئلہ کا پتہ لگاتا ہے، جو یہ دیکھا اس کے بارے میں کے بارے میں معلومات پرنٹ.
ہر آئٹم کو کافی terse ہے -
اذيت ہدایات کا ذریعہ، لائن، کیا مسئلہ ہے،
ملوث میموری کے بارے میں اور ایک چھوٹی سی معلومات -
لیکن اکثر یہ صحیح جگہ پر آپ کی توجہ کو کافی معلومات ہے.
Valgrind کی ایک مثال ہے ایک چھوٹی گاڑی پروگرام چل رہے ہیں
جو ڈھیر میموری کی ایک جعلی پڑھیں کرتا ہے.
ہم تالیف میں غلطیاں یا انتباہ دیکھتے ہیں.
اہ اوہ، غلطی کی سمری میں کہا گیا ہے کہ دو غلطیاں ہیں -
دو 4 سائز کے جعلی کتابیں - شراکت، ہے.
دونوں خراب کتابیں invalid_read.c کے مرکزی تقریب میں ہوا،
16 لائن اور 19 لائن پر دوسری سب سے پہلے ہے.
کوڈ نظر دو
پہلے printf ہماری میموری بلاک کے آخر پچھلے ایک int کو پڑھنے کے لئے کی کوشش کرتا ہے کال کی طرح لگتا ہے.
اگر ہم Valgrind پیداوار میں واپس دیکھو،
ہم دیکھتے ہیں کہ Valgrind نے ہمیں بتایا بالکل وہی.
ایڈریس پر ہم سے پڑھنے کی کوشش کر رہے ہیں وہ شروع ہوتا 0 بائٹس
حجم 16 بائٹس کی بلاک کے آخر ماضی -
چار ints 32 بٹ کہ ہم مختص.
پتہ ہم پڑھنے کی کوشش کر رہے تھے اور یہی وجہ ہے کہ ہمارے بلاک کے آخر میں شروع ہوتا ہے،
بالکل اسی طرح جیسے ہم نے ہمارے برے printf کال میں دیکھتے ہیں.
اب ہے کہ ایک معاہدے کے بڑے کی طرح جعلی کتابیں لگتا نہیں ہو سکتا ہے،
لیکن اگر آپ نے اس کے اعداد و شمار کا استعمال کرتے ہوئے آپ کے پروگرام کے بہاؤ کو کنٹرول کر رہے ہیں -
مثال کے طور پر، ایک کے حصے کے طور پر اگر بیان یا لوپ -
تو حالات خراب خاموشی سے جا سکتے ہیں.
دیکھو کس طرح میں invalid_read پروگرام چلا سکتے ہیں
اور عام سے باہر کچھ بھی نہیں ہوتا ہے.
ڈراونا، ہہ؟
>> اب، غلطیوں کے کچھ اور قسم کی ہے کہ آپ اپنے کوڈ میں سامنا ہو سکتا ہے کو دیکھو،
ہم دیکھتے ہیں اور کتنا Valgrind ان کا پتہ لگاتا ہوں گے.
ہم صرف ایک invalid_read کے ایک مثال کے طور پر دیکھا،
تو اب ہم باہر ایک invalid_write چیک کرنے کے لیے.
ایک بار پھر، تالیف میں غلطیاں یا انتباہ.
ٹھیک ہے، Valgrind کا کہنا ہے کہ ہے کہ اس پروگرام میں دو غلطیاں ہیں -
invalid_write اور ایک invalid_read.
آو اس کوڈ کو چیک کرنے کے لیے ہے.
جیسا کہ ہم نے کلاسک strlen کے علاوہ ایک بگ کی ایک مثال ہے لگتا ہے.
کوڈ ہے malloc جگہ کی ایک اضافی بائٹ
0 / حروف کے لئے،
تو جب STR نقل ssubstrlen میں لکھ گئے "cs50 پتھروں!"
یہ ہمارے بلاک کے آخر ماضی 1 بائٹ لکھا.
اس invalid_read آتا ہے جب ہم printf ہماری کال کرنے کے.
Printf ختم جعلی میموری کو پڑھنے کے جب تم میں سے کسی ایک کو یہ کردار 0 / کتابیں
کے طور پر اس اس E سٹرنگ کے آخر میں لگتا ہے یہ پرنٹنگ ہے.
لیکن اس میں سے کوئی بھی Valgrind فرار ہو گئے.
ہم STR کاپی کے ایک حصے کے کے طور پر دیکھتے ہیں کہ یہ invalid_write پکڑ لیا
اہم 11 لائن پر، اور invalid_read printf کا حصہ ہے.
راک، Valgrind.
ایک بار پھر ایک بڑا سودا کی طرح یہ لگتا، نہیں ہو سکتا ہے.
ہم اور اس سے زیادہ Valgrind سے باہر اس پروگرام چلا سکتے ہیں
اور کسی بھی خرابی کی علامات نہیں دیکھا.
>> تاہم، اس کا ایک معمولی تبدیلی میں دیکھو
چیزیں بہت برا کس طرح حاصل کر سکتے ہیں.
تو عطا کی گئی، ہم چیزیں صرف اس کوڈ میں تھوڑا سا سے کوس رہے ہیں.
ہم صرف ڈھیر پر دو ڈور کے لئے کر رہے ہیں خلا آونٹن
cs50 پتھروں کی لمبائی،
اس وقت، کردار 0 / یاد ہے.
لیکن اس وقت ہم نے ایک بہت طویل سٹرنگ میں میموری بلاک میں پھینک
کہ S اشارہ کر رہا ہے.
کیا اثر میموری بلاک پر پڑے گا کہ T پوائنٹس ہے؟
ٹھیک ہے، اگر، یاد T بتاتے ہیں کہ صرف S سے ملحق ہے
بعد آنے والے
تو ہم T. کا حصہ پر لکھا ہو سکتا ہے
چلو اس کوڈ کو چلانے کے.
دیکھو کیا ہوا.
ڈور ہم ہماری ڈھیر بلاکس دونوں میں جمع طباعت درست شائع.
کچھ غلط نہیں بالکل لگتا ہے.
تاہم، اپنے کوڈ میں واپس جاؤ اور
لائن تبصرہ جہاں ہم نے cs50 پتھروں کاپی کرنے کے
دوسری میموری بلاک میں، ٹی کی طرف سے کی طرف اشارہ ہے.
اب، جب ہم اس کوڈ کو چلاتے ہیں، ہم کرنا چاہیے
صرف دیکھ کر پہلی میموری بلاک کی پرنٹ.
واہ، اگرچہ ہم نے STR کاپی نہیں
دوسری ڈھیر بلاک میں کسی بھی حروف، T کی طرف سے ایک کی طرف اشارہ کیا،
ہم نے ایک پرنٹ باہر لے جائیں.
بے شک، سٹرنگ ہم ہماری پہلی بلاک میں بھرے
پہلے بلاک اور دوسرے بلاک میں overran،
سب کچھ ٹھیک لگ رہے ہو.
Valgrind، اگرچہ، ہمیں سچی کہانی بتاتا ہے.
ہم وہاں جا رہے ہیں.
ان جعلی سب پڑھتا اور لکھتا ہے.
>> غلطی کی ایک اور قسم کی ایک مثال کے طور پر نظر آتے ہیں.
یہاں ہم بلکہ بدقسمتی سے کچھ کرتے ہیں.
ہم ڈھیر پر ایک int کے لئے جگہ پر قبضہ،
P - - اس جگہ کی طرف اشارہ ہے اور ہم ایک int پوائنٹر ابتدا.
تاہم، جبکہ ہماری پوائنٹر initialized ہے
اعداد و شمار ہے کہ اس کی طرف اشارہ ہے جو کچھ بھی ردی ڈھیر کے اس حصے میں ہے.
، تو جب ہم int میں میں ڈیٹا لوڈ
ہم تکنیکی طور پر میں، ابتدا
لیکن ہم ردی اعداد و شمار کے ساتھ ایسا کرتے ہیں.
کال، زور جو ایک ہاتھ بگ میکرو ہے
aptly نام لائبریری زور میں وضاحت کی گئی ہے
اسقاط حمل پروگرام اگر اس کے ٹیسٹ حالت ناکام ہو جاتا ہے.
یہ ہے، اگر میں 0 نہیں ہے.
ڈھیر کی جگہ میں کیا تھا پر منحصر ہے، پی کی طرف سے کی طرف اشارہ،
اس پروگرام کو کبھی کبھی کام اور دیگر اوقات میں ناکام ہو سکتا ہے.
اگر یہ کام کرتا ہے، ہم صرف خوش ہو رہے ہیں.
سنکلک اس خامی کو پکڑنے، لیکن اس بات کا یقین مرضی Valgrind.
وہاں ہم اس ردی کے ڈیٹا کی ہماری کے استعمال کے نتیجے میں پڑنے والے غلطی دیکھیں.
>> ، جب آپ کو ڈھیر میموری مختص لیکن یہ deallocate نہیں یا یہ مفت
جو ایک لیک کہا جاتا ہے.
، ایک چھوٹا سا پروگرام ہے، الپکالک چلتا ہے اور فوری طور پر exits کے لئے،
لیک کافی نقصان نہیں پہنچاتی ہیں،
لیکن بڑے سائز اور / یا لمبی عمر کا ایک منصوبہ کے لئے،
بھی ایک چھوٹی سی درار اہم کچھ میں کمپاؤنڈ کر سکتے ہیں.
CS50 کے لئے، ہم آپ سے امید رکھتے ہیں
ڈھیر میموری کہ آپ مختص کی سب آزاد کی دیکھ بھال،
کیونکہ ہم آپ کو مہارت دستی عمل کو مناسب طریقے سے سنبھال کی تعمیر کرنا چاہتے ہیں
سی کی طرف سے کی ضرورت
ایسا کرنے کے لئے، آپ کے پروگرام میں ایک عین مطابق ہونا چاہئے
malloc اور مفت کال کے درمیان ایک ایک خط و کتابت.
خوش قسمتی سے، Valgrind میموری لیک کے ساتھ تم بھی مدد کر سکتے ہیں.
نامی ایک leaky leak.c پروگرام ہے کہ مختص
ڈھیر پر جگہ، اس پر لکھتے ہیں، لیکن اس کی نہیں آزاد.
ہم اس Valgrind کے تحت اسے چلانے بنائیں کے ساتھ مرتب،
اور ہم دیکھتے ہیں کہ، جب ہم کوئی میموری کی غلطیوں،
ہم ایک لیک ہے.
16 بائٹس یقینی طور پر کھو ہیں،
کا مطلب یہ ہے کہ اس یاد پوائنٹر دائرہ کار میں نہیں تھا جب پروگرام سے باہر ہے.
اب، Valgrind ہمیں نہیں دے لیک کے بارے میں معلومات کے ایک ٹن،
لیکن اگر ہم اس چھوٹی سی بات کو نوٹ کیجیئے کی پیروی ہے کہ وہ اپنی رپورٹ کے سب سے نیچے دیئے کی طرف نیچے دیتا ہے
ساتھ rerun - لیک چیک کرنے کے لیے مکمل =
لیک میموری کی مکمل تفصیلات کو دیکھنے کے لئے،
ہم مزید معلومات حاصل کریں گے.
اب،، ڈھیر کے خلاصے میں
Valgrind ہمیں بتاتا ہے جہاں میموری جو کھو گیا تھا ابتدائی طور پر مختص کیا گیا ہے.
، جیسا کہ ہم منبع کوڈ میں تلاش کرنے سے جانتے ہیں
Valgrind ہمیں مطلع کہ ہم نے میموری لیک
malloc leak.c 8 لائن پر کال کے ساتھ مختص
مرکزی تقریب میں.
خوبصورت نفٹی.
>> Valgrind ان اصطلاحات کا استعمال کرتے ہوئے لیک categorizes:
یقینی طور پر کھو - اس ڈھیر مختص میموری ہے
جو پروگرام نہیں رہ پوائنٹر ہے.
Valgrind جانتا ہے کہ تم نے ایک بار پوائنٹر تھا لیکن کے بعد سے اس کے ٹریک کھو دیا ہے.
یقینی طور پر یہ میموری لیک ہے.
بالواسطہ طور پر کھو - اس ڈھیر مختص میموری ہے
جس میں اس کا صرف اشارہ بھی کھو رہے ہیں.
مثال کے طور پر، اگر آپ کو ایک لنک کی فہرست کا پہلا نوڈ اپنے پوائنٹر کھو دیا ہے،
تو پہلے نوڈ خود یقینی طور پر ختم ہو جائے گا،
جبکہ ابھی بعد نوڈس بالواسطہ طور پر ختم ہو جائے گی.
شاید کھو - اس ڈھیر مختص میموری ہے
جس Valgrind اس بات کا یقین کر لیں کہ کہ کیا پوائنٹر ہے یا نہیں نہیں ہو سکتا.
پھر بھی لگ رہا ڈھیر مختص میموری ہے
جو پروگرام اب بھی باہر نکلیں پوائنٹر ہے،
جس کا عام طور پر مطلب یہ ہے کہ ایک عالمی متغیر پوائنٹس.
ان لیک کی جانچ پڑتال کرنے کے لئے، آپ کو اختیار کو شامل کرنے کے لئے بھی پڑے گا
- اب بھی لگ رہا = ہاں
Valgrind کی فریاد میں.
>> یہ مختلف مقدمات میں ان کی صفائی کرنے کے لئے مختلف حکمت عملی کی ضرورت سکتے ہیں،
لیکن لیک کو ختم کیا جانا چاہئے.
بدقسمتی سے، لیک کا تعین کرنا مشکل ہو سکتا ہے،
مزید مفت غلط کال اپنے پروگرام کو اڑا کر سکتے ہیں.
مثال کے طور پر، اگر ہم invalid_free.c میں دیکھو،
ہم خراب میموری deallocation کی ایک مثال کے طور پر دیکھتے ہیں.
پورے بلاک کو آزاد کرنے کے لئے ایک کال کیا ہونا چاہئے
میموری کا int_block کی طرف سے کی طرف اشارہ،
بجائے ایک int درجے کے ہر حصے کو آزاد کرنے کی کوشش بن
انفرادی طور پر میموری کی.
یہ catastrophically ناکام ہو جائے گا.
بوم! کیا میں ایک خرابی ہے.
یہ ضرور اچھی نہیں ہے.
اگر آپ نے غلطی کی اس قسم کے ساتھ پھنس گئے، اگرچہ، کر رہے ہیں اور آپ کہاں دیکھنا نہیں جانتے،
اپنے نئے سب سے اچھے دوست پر واپس آتے ہیں.
تم نے یہ اندازہ لگایا - Valgrind.
، Valgrind ہمیشہ کی طرح جانتا ہے، بالکل کیا ہے.
alloc اور آزاد شمار سے مماثل نہیں ہے.
ہم 1 alloc اور 4 آزاد ہے.
Valgrind بھی ہمیں بتاتا ہے جہاں پہلے بری مفت کال -
وہ جو blowup کو متحرک - سے آ رہا ہے -
16 لائن.
جیسا کہ آپ دیکھ، برا مفت کالیں واقعی بہت خراب ہیں،
تاکہ ہم آپ کے پروگرام لیک دے مشورہ ہے
جبکہ آپ کو فعالیت درست ہونے پر کام کر رہے ہیں.
لیک کے لئے تلاش شروع کر کے بعد ہی اپنے پروگرام کو مناسب طریقے سے کام کر رہا ہے،
بغیر کسی دوسرے کی غلطیوں کو.
>> اور یہ کہ ہم نے اس ویڈیو کے لئے مل گیا ہے.
اب کیا آپ کے لئے انتظار کر رہے ہیں؟
چلانے کے آپ کے پروگراموں پر ابھی Valgrind جاؤ.
میرا نام نیٹ Hardison ہے. یہ CS50 ہے. [CS50.TV]