1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Valgrind] 2 00:00:02,000 --> 00:00:05,000 [نيت Hardison، جامعة هارفارد] 3 00:00:05,000 --> 00:00:07,000 هذا هو CS50، CS50.TV] 4 00:00:07,000 --> 00:00:10,000 بعض الخلل الأكثر صعوبة في برامج C 5 00:00:10,000 --> 00:00:13,000 تأتي من سوء إدارة الذاكرة. 6 00:00:13,000 --> 00:00:15,000 هناك عدد كبير من الطرق لالمسمار الامور، 7 00:00:15,000 --> 00:00:17,000 بما في ذلك تخصيص مبلغ الخطأ من الذاكرة، 8 00:00:17,000 --> 00:00:20,000 النسيان لتهيئة المتغيرات، 9 00:00:20,000 --> 00:00:23,000 الكتابة قبل أو بعد نهاية المخزن المؤقت، 10 00:00:23,000 --> 00:00:25,000 وتحرير الذاكرة الاحتفاظ مرات متعددة. 11 00:00:25,000 --> 00:00:28,000 الأعراض تتراوح من حوادث متقطعة 12 00:00:28,000 --> 00:00:30,000 إلى قيم الكتابة في ظروف غامضة، 13 00:00:30,000 --> 00:00:34,000 في كثير من الأحيان في أماكن وأوقات بعيدة كل البعد عن الخطأ الأصلي. 14 00:00:34,000 --> 00:00:37,000 تتبع المشكلة الملاحظ عودة إلى السبب الجذري الأساسي 15 00:00:37,000 --> 00:00:39,000 يمكن أن يكون تحديا، 16 00:00:39,000 --> 00:00:42,000 لكن لحسن الحظ هناك برنامج يسمى مفيدة Valgrind 17 00:00:42,000 --> 00:00:44,000 يمكن أن تفعل الكثير للمساعدة. 18 00:00:44,000 --> 00:00:47,000 >> تشغيل برنامج لتمكين تحت Valgrind 19 00:00:47,000 --> 00:00:50,000 فحص واسعة النطاق تخصيص الذاكرة والوصول إلى كومة. 20 00:00:50,000 --> 00:00:53,000 عندما Valgrind كشف مشكلة، فإنه يوفر لك على الفور، 21 00:00:53,000 --> 00:00:56,000 المعلومات المباشرة التي تسمح لك ل 22 00:00:56,000 --> 00:00:58,000 أكثر سهولة العثور وإصلاح المشكلة. 23 00:00:58,000 --> 00:01:01,000 Valgrind أيضا تقارير عن مشاكل الذاكرة أقل فتكا، 24 00:01:01,000 --> 00:01:04,000 مثل التسرب في الذاكرة، وتخصيص ذاكرة الكومة، 25 00:01:04,000 --> 00:01:07,000 والنسيان اطلاق سراحه. 26 00:01:07,000 --> 00:01:10,000 لدينا مثل مترجم، ضجيج، في المصحح لدينا، GDB، 27 00:01:10,000 --> 00:01:14,000 Valgrind هي البرمجيات الحرة، وتثبيته على الجهاز. 28 00:01:14,000 --> 00:01:16,000 Valgrind يعمل على ثنائي قابل للالخاص بك، 29 00:01:16,000 --> 00:01:20,000 ليس لديك. ج أو شفرة المصدر ملفات ساعة، 30 00:01:20,000 --> 00:01:23,000 لذا يجب التأكد كنت قد جمعت نسخة ما يصل إلى تاريخ البرنامج 31 00:01:23,000 --> 00:01:25,000 استخدام ضجيج أو تقديم. 32 00:01:25,000 --> 00:01:28,000 ثم، يمكن تشغيل البرنامج تحت Valgrind يكون 33 00:01:28,000 --> 00:01:32,000 بسيطة مثل التقديم فقط الأمر مع برنامج القياسية Valgrind كلمة، 34 00:01:32,000 --> 00:01:35,000 الذي يبدأ Valgrind ويعمل البرنامج داخل منه. 35 00:01:35,000 --> 00:01:38,000 عند بدء، لا Valgrind بعض معقدة 36 00:01:38,000 --> 00:01:41,000 القولبة لتكوين الملف التنفيذي للشيكات الذاكرة، 37 00:01:41,000 --> 00:01:44,000 لذلك يمكن أن يستغرق قليلا للحصول على قائمة وعاملة. 38 00:01:44,000 --> 00:01:48,000 سيقوم البرنامج ثم تنفيذ عادة، سواء كان ذلك ببطء أكثر بكثير، 39 00:01:48,000 --> 00:01:52,000 وعندما ينتهي، وسوف Valgrind طباعة ملخص استخدام الذاكرة. 40 00:01:52,000 --> 00:01:58,000 إذا سارت الامور بشكل جيد، وسوف ننظر بشيء من هذا القبيل: 41 00:01:58,000 --> 00:02:01,000 في هذه الحالة، / clean_program 42 00:02:01,000 --> 00:02:04,000 هو المسار إلى برنامج I تريد تشغيله. 43 00:02:04,000 --> 00:02:06,000 وعلى الرغم من هذا واحد لا يأخذ أية وسائط، 44 00:02:06,000 --> 00:02:09,000 إذا فعلت يهمني تك منهم فقط إلى نهاية الأمر على النحو المعتاد. 45 00:02:09,000 --> 00:02:12,000 برنامج النظيفة هو مجرد سخيفة قليلا برنامج أنا خلقت 46 00:02:12,000 --> 00:02:15,000 أن يخصص مساحة لكتلة من رجات على كومة، 47 00:02:15,000 --> 00:02:19,000 وضع بعض القيم داخل منهم، وتفرج عن كتلة كاملة. 48 00:02:19,000 --> 00:02:23,000 هذا هو ما كنت اطلاق النار ل، وعدم وجود أخطاء التسريبات لا. 49 00:02:23,000 --> 00:02:27,000 >> آخر متري المهم هو العدد الإجمالي من وحدات البايت المخصصة. 50 00:02:27,000 --> 00:02:32,000 وفقا للبرنامج، إذا المخصصات الخاصة بك في ميغا بايت أو أعلى، 51 00:02:32,000 --> 00:02:34,000 ربما كنت تريد ان تفعل شيئا خاطئا. 52 00:02:34,000 --> 00:02:37,000 هل أنت تخزين دون داع مكررة؟ 53 00:02:37,000 --> 00:02:40,000 هل تستخدم لتخزين الكومة، عندما كان من الأفضل استخدام المكدس؟ 54 00:02:40,000 --> 00:02:43,000 لذلك، يمكن أن تكون أخطاء الذاكرة الشر حقا. 55 00:02:43,000 --> 00:02:46,000 هم أكثر علنية تتسبب في حوادث مذهلة، 56 00:02:46,000 --> 00:02:49,000 لكن حتى ذلك الحين يمكن أن يكون لا يزال من الصعب تحديد 57 00:02:49,000 --> 00:02:51,000 ما أدى إلى تحطم تماما. 58 00:02:51,000 --> 00:02:54,000 أكثر دهاء، وهو برنامج مع خطأ الذاكرة 59 00:02:54,000 --> 00:02:56,000 يمكن تجميع تزال نظيفة 60 00:02:56,000 --> 00:02:58,000 ويبدو أن لا يزال للعمل بشكل صحيح 61 00:02:58,000 --> 00:03:01,000 لأن تدار لك للحصول على محظوظا أكثر من مرة. 62 00:03:01,000 --> 00:03:04,000 بعد عدة "النتائج الناجحة" 63 00:03:04,000 --> 00:03:07,000 قد تعتقد أن مجرد حادث هو مجرد صدفة للكمبيوتر، 64 00:03:07,000 --> 00:03:10,000 لكن الكمبيوتر لا يخطئ. 65 00:03:10,000 --> 00:03:13,000 >> يمكن تشغيل Valgrind تساعدك على تعقب سبب أخطاء الذاكرة مرئية 66 00:03:13,000 --> 00:03:18,000 وكذلك إيجاد الأخطاء الكامنة كنت لا تعرف عن بعد حتى. 67 00:03:18,000 --> 00:03:22,000 في كل مرة Valgrind كشف مشكلة، فإنه يطبع المعلومات حول ما لوحظ. 68 00:03:22,000 --> 00:03:24,000 كل عنصر هو مقتضب إلى حد ما - 69 00:03:24,000 --> 00:03:27,000 خط مصدر التعليمة المخالف، ما المسألة، 70 00:03:27,000 --> 00:03:30,000 والقليل من المعلومات حول الذاكرة المشتركة - 71 00:03:30,000 --> 00:03:34,000 ولكن في كثير من الأحيان أنها معلومات كافية لتوجيه انتباهكم الى المكان الصحيح. 72 00:03:34,000 --> 00:03:37,000 هنا مثال على Valgrind يعمل على برنامج عربات التي تجرها الدواب 73 00:03:37,000 --> 00:03:40,000 التي لا أحد غير صالحة للقراءة من الذاكرة الكومة. 74 00:03:40,000 --> 00:03:49,000 لا نرى أخطاء أو تحذيرات في تجميع. 75 00:03:49,000 --> 00:03:53,000 اه أوه، الملخص خطأ يقول ان هناك اثنين من الأخطاء - 76 00:03:53,000 --> 00:03:56,000 من عقدين من يقرأ غير صالحة حجم 4 - بايت، وهذا هو. 77 00:03:56,000 --> 00:04:01,000 كل سيئة يقرأ وقعت في الوظيفة الرئيسية للinvalid_read.c، 78 00:04:01,000 --> 00:04:04,000 أول على خط 16 والثاني على خط 19. 79 00:04:04,000 --> 00:04:06,000 دعونا ننظر في التعليمات البرمجية. 80 00:04:06,000 --> 00:04:11,000 يبدو أن المكالمة الأولى ليحاول printf لقراءة واحدة الباحث بعد نهاية كتلة ذاكرتنا. 81 00:04:11,000 --> 00:04:13,000 إذا نظرنا إلى الوراء في الناتج Valgrind ل، 82 00:04:13,000 --> 00:04:16,000 ونحن نرى أن Valgrind قال لنا بالضبط. 83 00:04:16,000 --> 00:04:19,000 عنوان نحاول قراءة يبدأ 0 بايت 84 00:04:19,000 --> 00:04:22,000 بعد نهاية كتلة من حجم 16 بايت - 85 00:04:22,000 --> 00:04:25,000 32-4 بت رجات أننا المخصصة. 86 00:04:25,000 --> 00:04:29,000 وهذا هو، عنوان كنا نحاول قراءة يبدأ الحق في نهاية كتلة لدينا، 87 00:04:29,000 --> 00:04:32,000 تماما كما نرى في دعوتنا printf سيئة. 88 00:04:32,000 --> 00:04:36,000 الآن، قد لا يبدو غير صالح قراءة من هذا القبيل كبيرة من التوصل الى اتفاق، 89 00:04:36,000 --> 00:04:39,000 ولكن إذا كنت تستخدم هذه البيانات للسيطرة على تدفق البرنامج - 90 00:04:39,000 --> 00:04:42,000 على سبيل المثال، كجزء من بيان أو إذا حلقة - 91 00:04:42,000 --> 00:04:45,000 ثم يمكن أن تسير الأمور سيئة بصمت. 92 00:04:45,000 --> 00:04:47,000 مشاهدة كيف يمكنني تشغيل برنامج invalid_read 93 00:04:47,000 --> 00:04:50,000 ولا شيء خارج عن المألوف يحدث. 94 00:04:50,000 --> 00:04:52,000 مخيف، أليس كذلك؟ 95 00:04:52,000 --> 00:04:56,000 >> الآن، دعونا ننظر في بعض أنواع أكثر من الأخطاء التي قد تواجهها في التعليمات البرمجية، 96 00:04:56,000 --> 00:04:59,000 وسنرى كيف Valgrind يكشف لهم. 97 00:04:59,000 --> 00:05:01,000 رأينا مجرد مثال لinvalid_read، 98 00:05:01,000 --> 00:05:04,000 حتى الآن دعونا تحقق من وinvalid_write. 99 00:05:04,000 --> 00:05:09,000 مرة أخرى، أية أخطاء أو تحذيرات في تجميع. 100 00:05:09,000 --> 00:05:12,000 حسنا، Valgrind يقول ان هناك اثنين من الأخطاء في هذا البرنامج - 101 00:05:12,000 --> 00:05:15,000 وinvalid_write وinvalid_read ملف. 102 00:05:15,000 --> 00:05:18,000 دعونا تحقق من هذا الرمز. 103 00:05:18,000 --> 00:05:21,000 يبدو أننا قد حصلت على مثيل من التوابع strlen الكلاسيكية بالإضافة إلى علة واحدة. 104 00:05:21,000 --> 00:05:24,000 رمز لا malloc على بايت إضافية من الفضاء 105 00:05:24,000 --> 00:05:26,000 للحرف / 0، 106 00:05:26,000 --> 00:05:30,000 لذلك عندما ذهبت إلى شارع نسخة كتابتها في ssubstrlen "الصخور CS50!" 107 00:05:30,000 --> 00:05:33,000 كتب عليه 1 بايت بعد نهاية كتلة لدينا. 108 00:05:33,000 --> 00:05:36,000 ويأتي invalid_read عندما نتخذ دعوتنا إلى printf. 109 00:05:36,000 --> 00:05:40,000 Printf ينتهي القراءة ذاكرة غير صالحة عندما يقرأ / 0 حرف 110 00:05:40,000 --> 00:05:43,000 كما يبدو في نهاية هذه السلسلة E انها الطباعة. 111 00:05:43,000 --> 00:05:45,000 ولكن لا شيء من هذا نجا Valgrind. 112 00:05:45,000 --> 00:05:48,000 ونحن نرى أنه اشتعلت invalid_write كجزء من نسخة شارع 113 00:05:48,000 --> 00:05:51,000 على خط 11 من الرئيسي، وinvalid_read هو جزء لل printf. 114 00:05:51,000 --> 00:05:54,000 الصخرة، Valgrind. 115 00:05:54,000 --> 00:05:57,000 مرة أخرى، وهذا قد لا يبدو مثل صفقة كبيرة. 116 00:05:57,000 --> 00:06:00,000 يمكننا تشغيل هذا البرنامج مرارا وتكرارا خارج Valgrind 117 00:06:00,000 --> 00:06:03,000 ولم تر اي اعراض الخطأ. 118 00:06:03,000 --> 00:06:06,000 >> ومع ذلك، دعونا ننظر في اختلاف طفيف من هذا أن نرى 119 00:06:06,000 --> 00:06:09,000 كيف يمكن الحصول على أشياء سيئة حقا. 120 00:06:09,000 --> 00:06:14,000 لذلك، منح، ونحن استغلال الأشياء أكثر من بت واحد فقط في هذا القانون. 121 00:06:14,000 --> 00:06:17,000 نحن فقط تخصيص مساحة على كومة لسلسلتين 122 00:06:17,000 --> 00:06:19,000 طول CS50 الصخور، 123 00:06:19,000 --> 00:06:22,000 هذه المرة، تذكر / 0 حرف. 124 00:06:22,000 --> 00:06:25,000 ولكن بعد ذلك نلقي في سلسلة طويلة فائقة في كتلة الذاكرة 125 00:06:25,000 --> 00:06:27,000 S أن يتم الإشارة إلى. 126 00:06:27,000 --> 00:06:30,000 ما تأثير ذلك على وكتلة الذاكرة الذي يشير إلى T؟ 127 00:06:30,000 --> 00:06:34,000 حسنا، إذا كان T نقطة إلى ذاكرة هذا المتاخمة لمجرد S، 128 00:06:34,000 --> 00:06:37,000 وصلت للتو بعد ذلك، 129 00:06:37,000 --> 00:06:39,000 ثم قد كتبنا على جزء من T. 130 00:06:39,000 --> 00:06:41,000 دعونا تشغيل هذا الرمز. 131 00:06:41,000 --> 00:06:43,000 ننظر إلى ما حدث. 132 00:06:43,000 --> 00:06:47,000 يبدو أننا السلاسل المخزنة في كومة كتل لدينا على حد سواء أن تطبع بشكل صحيح. 133 00:06:47,000 --> 00:06:49,000 لا شيء يبدو خاطئا على الإطلاق. 134 00:06:49,000 --> 00:06:52,000 ومع ذلك، دعونا نعود إلى نظامنا و 135 00:06:52,000 --> 00:06:55,000 تعليق خارج السطر حيث أننا نسخ CS50 الصخور 136 00:06:55,000 --> 00:06:59,000 إلى كتلة الذاكرة الثانية، المشار إليه بواسطة ر. 137 00:06:59,000 --> 00:07:02,000 الآن، عندما كنا تشغيل هذا الرمز يجب علينا 138 00:07:02,000 --> 00:07:06,000 إلا أن نرى محتويات كتلة الذاكرة الأولى طباعة. 139 00:07:06,000 --> 00:07:09,000 قف، على الرغم من فعلنا لا شارع نسخة 140 00:07:09,000 --> 00:07:12,000 أي شخصية في كتلة كومة الثانية، وأشار إلى واحد من T، 141 00:07:12,000 --> 00:07:15,000 نحصل على طباعة. 142 00:07:15,000 --> 00:07:18,000 والواقع أن سلسلة محشوة نحن في كتلة الأولى لنا 143 00:07:18,000 --> 00:07:21,000 اجتاحت كتلة الأولى وإلى كتلة الثاني، 144 00:07:21,000 --> 00:07:23,000 مما يجعل كل شيء يبدو طبيعيا. 145 00:07:23,000 --> 00:07:26,000 Valgrind، رغم ذلك، يقول لنا القصة الحقيقية. 146 00:07:26,000 --> 00:07:28,000 هناك نذهب. 147 00:07:28,000 --> 00:07:32,000 كل هذه غير صالحة يقرأ ويكتب. 148 00:07:32,000 --> 00:07:36,000 >> دعونا ننظر إلى مثال من نوع آخر من الخطأ. 149 00:07:36,000 --> 00:07:39,000 هنا نفعل شيئا مؤسفا. 150 00:07:39,000 --> 00:07:41,000 نحن انتزاع مساحة لكثافة العمليات على كومة، 151 00:07:41,000 --> 00:07:45,000 ونحن تهيئة مؤشر كثافة العمليات - ع - للإشارة إلى أن الفضاء. 152 00:07:45,000 --> 00:07:48,000 ومع ذلك، في حين تتم تهيئة مؤشر لدينا، 153 00:07:48,000 --> 00:07:52,000 البيانات التي تشير إلى انها مجرد وأيا كان هو غير المرغوب فيه في هذا الجزء من الكومة. 154 00:07:52,000 --> 00:07:55,000 لذلك عندما نقوم بتحميل هذه البيانات إلى ط كثافة العمليات، 155 00:07:55,000 --> 00:07:57,000 نحن تهيئة تقنيا ط، 156 00:07:57,000 --> 00:08:00,000 ولكننا نفعل ذلك مع البيانات غير المرغوب فيه. 157 00:08:00,000 --> 00:08:03,000 الدعوة إلى تأكيد، والذي هو في متناول يدي ماكرو التصحيح 158 00:08:03,000 --> 00:08:06,000 المعرفة في مكتبة تأكيد اسم على مسمى، 159 00:08:06,000 --> 00:08:09,000 سوف إحباط البرنامج إذا فشل الاختبار حالتها. 160 00:08:09,000 --> 00:08:11,000 وهذا هو، إذا كنت غير 0. 161 00:08:11,000 --> 00:08:14,000 اعتمادا على ما ورد في مساحة الكومة، المشار إليه بواسطة ع، 162 00:08:14,000 --> 00:08:18,000 هذا البرنامج قد يعملون أحيانا وتفشل في أحيان أخرى. 163 00:08:18,000 --> 00:08:20,000 اذا كان يعمل، ونحن مجرد الحصول على محظوظ. 164 00:08:20,000 --> 00:08:24,000 فإن المترجم لا يمسك هذا الخطأ، ولكن إرادة Valgrind بالتأكيد. 165 00:08:24,000 --> 00:08:28,000 هناك نرى الخطأ الناجمة عن استخدامنا للبيانات التي غير المرغوب فيه. 166 00:08:28,000 --> 00:08:32,000 >> عند تخصيص ذاكرة الكومة ولكن لا إلغاء تخصيص ذلك أو تحريرها، 167 00:08:32,000 --> 00:08:34,000 ويسمى ذلك تسرب. 168 00:08:34,000 --> 00:08:37,000 برنامج صغير للم يدم طويلا، والتي يتم تنفيذها على الفور مخارج، 169 00:08:37,000 --> 00:08:39,000 تسريبات غير مؤذية إلى حد ما، 170 00:08:39,000 --> 00:08:42,000 ولكن لمشروع من الحجم الكبير و / أو طول العمر، 171 00:08:42,000 --> 00:08:46,000 حتى يمكن تسرب صغير المركب إلى هناك شيئا كبيرا. 172 00:08:46,000 --> 00:08:49,000 لCS50، ونحن لا نتوقع منكم أن 173 00:08:49,000 --> 00:08:51,000 رعاية تحرير كل من ذاكرة الكومة التي تخصص، 174 00:08:51,000 --> 00:08:54,000 حيث أننا نريد لك لبناء المهارات اللازمة لمعالجة بشكل صحيح عملية يدوية 175 00:08:54,000 --> 00:08:56,000 المطلوبة من قبل C. 176 00:08:56,000 --> 00:08:59,000 للقيام بذلك، يجب أن يكون لديك برنامج دقيق 177 00:08:59,000 --> 00:09:03,000 واحد الى واحد المراسلات بين malloc ومكالمات مجانية. 178 00:09:03,000 --> 00:09:06,000 لحسن الحظ، يمكن أن تساعدك على Valgrind مع تسرب الذاكرة أيضا. 179 00:09:06,000 --> 00:09:09,000 هنا برنامج راشح دعا leak.c أن يخصص 180 00:09:09,000 --> 00:09:13,000 الفضاء على كومة، ويكتب إلى ذلك، ولكن لا سراحه. 181 00:09:13,000 --> 00:09:16,000 نحن تجميع مع تقديم وتشغيله تحت Valgrind، 182 00:09:16,000 --> 00:09:18,000 ونحن نرى أنه في حين لدينا أي أخطاء الذاكرة، 183 00:09:18,000 --> 00:09:20,000 نحن لديك واحدة تسرب. 184 00:09:20,000 --> 00:09:23,000 هناك 16 بايت خسر بالتأكيد، 185 00:09:23,000 --> 00:09:27,000 وهذا يعني أن مؤشر إلى أن الذاكرة ليست في نطاق البرنامج عندما خرجت. 186 00:09:27,000 --> 00:09:30,000 الآن، Valgrind لا يعطينا طن من المعلومات حول تسرب، 187 00:09:30,000 --> 00:09:35,000 ولكن إذا اتبعنا هذه المذكرة أنه يعطي قليلا إلى أسفل نحو الجزء السفلي من تقريرها 188 00:09:35,000 --> 00:09:38,000 إلى إعادة تشغيل مع - تسرب تسجيل الوصول الكامل = 189 00:09:38,000 --> 00:09:41,000 لمعرفة التفاصيل الكاملة لتسرب الذاكرة، 190 00:09:41,000 --> 00:09:44,000 سوف نحصل على مزيد من المعلومات. 191 00:09:44,000 --> 00:09:46,000 الآن، في الملخص الكومة، 192 00:09:46,000 --> 00:09:50,000 Valgrind يخبرنا في البداية حيث تم تخصيص الذاكرة التي فقدت. 193 00:09:50,000 --> 00:09:52,000 تماما كما نعرف من يبحث في التعليمات البرمجية المصدر، 194 00:09:52,000 --> 00:09:55,000 Valgrind يخبرنا أننا تسريب الذاكرة 195 00:09:55,000 --> 00:09:58,000 تخصيص مع استدعاء malloc على خط 8 من leak.c 196 00:09:58,000 --> 00:10:00,000 وتتمثل المهمة الرئيسية في. 197 00:10:00,000 --> 00:10:02,000 أنيق جدا. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind يصنف التسريبات باستخدام هذه المصطلحات: 199 00:10:04,000 --> 00:10:07,000 خسر بالتأكيد - وهذا هو كومة الذاكرة المخصصة 200 00:10:07,000 --> 00:10:10,000 لبرنامج الذي لم يعد لديه المؤشر. 201 00:10:10,000 --> 00:10:14,000 Valgrind يعرف أن كان لديك مرة واحدة ولكن المؤشر فقد منذ أثره. 202 00:10:14,000 --> 00:10:17,000 وتسربت بالتأكيد هذه الذاكرة. 203 00:10:17,000 --> 00:10:20,000 فقدت بشكل غير مباشر - وهذا هو كومة الذاكرة المخصصة 204 00:10:20,000 --> 00:10:24,000 التي مؤشرات فقط لأنه أيضا يتم فقدان. 205 00:10:24,000 --> 00:10:27,000 على سبيل المثال، إذا كنت فقدت المؤشر إلى العقدة الأولى من قائمة مرتبطة، 206 00:10:27,000 --> 00:10:30,000 هكذا تكون العقدة الأولى نفسها فقدت بالتأكيد، 207 00:10:30,000 --> 00:10:34,000 بينما سيتم عقد أي لاحقة خسر بشكل غير مباشر. 208 00:10:34,000 --> 00:10:37,000 فقدت ربما - وهذا هو كومة الذاكرة المخصصة 209 00:10:37,000 --> 00:10:41,000 الذي يمكن أن يكون متأكدا Valgrind ما إذا كان هناك مؤشر أم لا. 210 00:10:41,000 --> 00:10:44,000 لا تزال قابلة للوصول هو كومة الذاكرة المخصصة 211 00:10:44,000 --> 00:10:47,000 لبرنامج الذي لا يزال لديه مؤشر على الخروج، 212 00:10:47,000 --> 00:10:50,000 وهو ما يعني عادة أن نقاط العالمي المتغير لذلك. 213 00:10:50,000 --> 00:10:53,000 للتحقق من هذه التسريبات، سيكون لديك أيضا لتشمل الخيار 214 00:10:53,000 --> 00:10:55,000 - لا تزال قابلة للوصول = نعم 215 00:10:55,000 --> 00:10:58,000 في الاحتجاج بك من Valgrind. 216 00:10:58,000 --> 00:11:01,000 >> قد تتطلب هذه الحالات المختلفة استراتيجيات مختلفة لتنظيف عنها، 217 00:11:01,000 --> 00:11:05,000 ولكن ينبغي أن يتم القضاء على التسريبات. 218 00:11:05,000 --> 00:11:08,000 لسوء الحظ، يمكن إصلاح التسريبات يكون من الصعب القيام به، 219 00:11:08,000 --> 00:11:11,000 منذ أن المكالمات غير صحيحة لتحرير تفجير البرنامج. 220 00:11:11,000 --> 00:11:14,000 على سبيل المثال، إذا نظرنا إلى invalid_free.c، 221 00:11:14,000 --> 00:11:18,000 نرى مثالا على deallocation الذاكرة السيئة. 222 00:11:18,000 --> 00:11:21,000 ماذا يجب أن تكون مكالمة واحدة لتحرير المبنى كله 223 00:11:21,000 --> 00:11:24,000 من الذاكرة المشار إليه بواسطة int_block، 224 00:11:24,000 --> 00:11:27,000 بدلا من ذلك أصبح محاولة لتحرير كل قسم الباحث الحجم 225 00:11:27,000 --> 00:11:29,000 من الذاكرة بشكل فردي. 226 00:11:29,000 --> 00:11:32,000 سوف تفشل هذه كارثي. 227 00:11:32,000 --> 00:11:34,000 بوم! ما خطأ. 228 00:11:34,000 --> 00:11:36,000 هذا هو بالتأكيد ليست جيدة. 229 00:11:36,000 --> 00:11:39,000 إذا كنت عالقا مع هذا النوع من الخطأ، رغم ذلك، وكنت لا تعرف أن ننظر فيها، 230 00:11:39,000 --> 00:11:41,000 يرتد على صديق جديد افضل ما لديكم. 231 00:11:41,000 --> 00:11:44,000 هل تفكر في ذلك - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind، كما هو الحال دائما، يعرف بالضبط ما يعود. 233 00:11:47,000 --> 00:11:50,000 التهم alloc والحرة لا تصل المباراة. 234 00:11:50,000 --> 00:11:52,000 لقد حصلت على 1 و 4 alloc يحرر. 235 00:11:52,000 --> 00:11:55,000 ويخبرنا أيضا Valgrind حيث أول مكالمة مجانية سيئة - 236 00:11:55,000 --> 00:11:58,000 واحد الذي تسبب في تضخم - قادم من - 237 00:11:58,000 --> 00:12:00,000 السطر 16. 238 00:12:00,000 --> 00:12:03,000 كما ترون، ومكالمات سيئة لتحرير هي سيئة حقا، 239 00:12:03,000 --> 00:12:05,000 لذلك نحن ننصح السماح تسرب البرنامج الخاص بك 240 00:12:05,000 --> 00:12:08,000 بينما كنت تعمل على الحصول على وظائف الصحيح. 241 00:12:08,000 --> 00:12:12,000 البدء في البحث عن التسريبات إلا بعد البرنامج يعمل بشكل صحيح، 242 00:12:12,000 --> 00:12:14,000 دون أية أخطاء أخرى. 243 00:12:14,000 --> 00:12:16,000 >> وهذا كل ما لدينا لهذا الفيديو. 244 00:12:16,000 --> 00:12:18,000 الآن ماذا تنتظر؟ 245 00:12:18,000 --> 00:12:21,000 تذهب تشغيل Valgrind على البرامج الخاصة بك الآن. 246 00:12:21,000 --> 00:12:25,000 اسمي نيت Hardison. هذا هو CS50. [CS50.TV]