DOUG لويد: جميع الحقوق GDB. ما هو بالضبط؟ حتى GDB، والتي تقف لالمصحح GNU، هي أداة رهيبة حقا أن نتمكن من استخدام لمساعدتنا في تصحيح برامجنا، أو معرفة أين الامور يحدث خطأ في برامجنا. GDB قوية بشكل مثير للدهشة، ولكن الإخراج والتفاعل معها يمكن أن يكون خفي قليلا. انها عادة ما تكون أداة سطر الأوامر، و ويمكن رمي الكثير من الرسائل لك. وما في وسعها نوع من الصعب تحليل بالضبط ما يجري. خطوات لحسن الحظ، لقد اتخذنا لإصلاح هذه المشكلة بالنسبة لك أثناء العمل من خلال CS50. إذا كنت لا تستخدم الرسومية المصحح، التي زميلي دان وقد تحدث Armandarse جدا قليلا عنه في شريط فيديو ينبغي أن يكون أكثر من هنا الآن، قد تحتاج لاستخدام هذه سطر الأوامر أدوات للعمل مع GDB. إذا كنت تعمل في CS50 IDE، لا تحتاج للقيام بذلك. ولكن إذا كنت لا العمل في IDE CS50، ربما تستخدم إصدار من CS50 الأجهزة، أو لينكس أخرى تعمل النظام مع GDB تثبيت على ذلك، قد تحتاج إلى استخدام هذه أدوات سطر الأوامر. ومنذ كنت قد يجب أن نفعل ذلك، انها مفيدة فقط لفهم كيف GDB تعمل من سطر الأوامر. ولكن مرة أخرى، إذا كنت باستخدام IDE CS50، كنت يمكن استخدام المصحح رسومية التي بنيت في IDE. وذلك للحصول على اشياء اخرى مع GDB، لبدء التصحيح عملية معين برنامج، كل ما عليك القيام به هو نوع يليه GDB بواسطة اسم البرنامج. هكذا على سبيل المثال، إذا كان البرنامج هو مرحبا، ستكتب GDB مرحبا. عندما تفعل ذلك، وأنت تسير لسحب ما يصل البيئة GDB. سوف موجه بك تتغير، و بدلا من أن يكون ما عادة عندما كنت اكتب اشياء في ليرة سورية line-- الأوامر، cd-- كل من النمطية الخاصة بك أوامر لينكس، موجه بك سوف تتغير إلى، على الأرجح، شيء مثل الأقواس GDB قوسين. هذا هو الخاص بك موجه GDB جديد، ل كنت داخل البيئة GDB. مرة واحدة داخل تلك البيئة، هناك اثنين من الأوامر الرئيسية التي ربما عليك استخدام بالترتيب التالي. الأول هو ب، التي قصيرة لقضاء عطلة. وبعد كتابة ب، عادة اكتب اسم وظيفة، أو إذا كنت أعلم حول ما رقم السطر البرنامج بدأ تتصرف غريبة بعض الشيء، يمكنك كتابة سطر عدد هناك أيضا. ما ب، أو انقطاع، لا غير أنه يسمح البرنامج لتشغيل حتى نقطة معينة، وهي اسم الدالة الذي تحدده أو خط الرقم الذي تحدده. وعند هذه النقطة، ستجمد التنفيذ. هذا أمر جيد حقا، ل مرة واحدة وقد تم تجميد التنفيذ، يمكنك أن تبدأ ببطء جدا الخطوة من خلال البرنامج. عادة، إذا كنت قد تم تشغيل البرامج الخاصة بك، وانهم قصيرة جدا. عادة، اكتب مائل دوت أيا كان وضرب اسم البرنامج أدخل، وقبل أن تتمكن من وميض، الخاص بك الانتهاء بالفعل البرنامج. انها ليست في الواقع الكثير من الوقت لمحاولة ومعرفة ما يحدث خطأ. لذلك حقا لتكون قادرة على إبطاء الامور إلى أسفل عن طريق وضع نقطة فاصل مع ب، ثم يخطو في. ثم مرة واحدة كنت قد قمت بتعيين كسر الخاص بك النقطة، يمكنك تشغيل البرنامج. وإذا كان لديك أي وسائط سطر الأوامر، تحدده لهم هنا، وليس عندما كنت اكتب GDB اسم البرنامج. تحديد كافة سطر الأوامر الحجج من خلال اتخاذ ص، أو تشغيل، ثم وسائط سطر الأوامر أيا كان تحتاج داخل البرنامج. وهناك عدد آخر حقا أوامر مهمة ومفيدة داخل البيئة الناتج المحلي الإجمالي. لذلك اسمحوا لي بسرعة فقط يذهب أكثر من بعضهم. الأول هو ن، وهو اختصار لالمقبل، ويمكنك كتابة المقبل بدلا من ن، كلا سوف تعمل. وانها مجرد الاختزال. وكما ربما كنت قد حصلت بالفعل تستخدم ل، والقدرة على كتابة الأشياء أقصر عموما أفضل. وما سوف تفعله هو أنها سوف خطوة إلى الأمام كتلة واحدة من التعليمات البرمجية. لذلك سوف نمضي قدما حتى استدعاء دالة. ثم بدلا من الغوص في ذلك وظيفة ويمر كل ذلك وظائف رمز، فإنه سيكون مجرد وظيفة. وسوف يطلق على وظيفة. انها لن تفعل كل ما عمله هو. فإنه سيعود قيمة ل وظيفة الذي يطلق عليه. وبعد ذلك سوف ننتقل إلى السطر التالي من تلك الوظيفة الاستدعاء. إذا كنت ترغب في خطوة داخل وظيفة، بدلا من مجرد وجود فإنه تنفيذ، خصوصا إذا كنت تعتقد أن المشكلة ربما تكمن داخل تلك الوظيفة، هل يمكن، بالطبع، تعيين استراحة نقطة داخل تلك الوظيفة. أو إذا كنت بالفعل قيد التشغيل، يمكنك استخدام الصورة لخطوة إلى الأمام واحد سطر من التعليمات البرمجية. ولذلك فإن هذا سوف تدخل ويغوص وظائف، بدلا من أن يكون مجرد تنفيذ واستمرار على وظيفة في ان كنت في لتصحيح الأخطاء. إذا كنت تريد أن تعرف من أي وقت مضى قيمة متغير، يمكنك كتابة ص أو طباعة، ثم اسم المتغير. والتي ستطبع من أصل إليك، داخل البيئة GDB، اسم المتغير، أن you-- عذر me-- قيمة المتغير بعد أن كنت قد مسمى. إذا كنت تريد أن تعرف قيم كل محلي متغير يمكن الوصول إليها من حيث أنت حاليا في الخاص البرنامج، يمكنك كتابة معلومات من السكان المحليين. انها أسرع بكثير من كتابة ص ثم أيا كان، القائمة من كل من المتغيرات التي تعرف موجودة. يمكنك كتابة معلومات من السكان المحليين، وذلك سوف تطبع كل شيء بالنسبة لك. يصل المقبل هو مواطنه، الذي هو باختصار عن الرجوع تتبع. الآن، عموما، في CS50 في وقت مبكر للغاية، لن يكون لديك حقا مناسبة لاستخدام BT، أو العودة تعقبها لأنك عدم وجود وظائف أن استدعاء وظائف أخرى. قد يكون لديك الرئيسي دعوة ل وظيفة، ولكن هذا ربما ذلك. لم يكن لديك أن وظيفة أخرى استدعاء الدالة آخر، وهو يدعو وظيفة أخرى، وهلم جرا. ولكن كما يحصل البرامج الخاصة بك أكثر مجمع، وبخاصة عند بدء العمل مع العودية، نتتبع يمكن أن يكون وسيلة مفيدة حقا للسماح لك نوع من الحصول على بعض السياق حيث أنا في برنامجي. لذلك نقول لكم لقد كتابة التعليمات البرمجية الخاصة بك، و هل تعلم أن أهم وظيفة يدعو و مما يستدعي وظيفة ز، الذي يدعو وظيفة ساعة. لذلك لدينا عدة طبقات التعشيش يحدث هنا. إذا كنت داخل البيئة GDB الخاص بك، وأنت تعرف داخل بك من ساعة، ولكن كنت قد نسيت حول ما حصل لك حيث أنت are-- يمكنك كتابة BT، أو نتتبع، وسوف تطبع ح، ز، و الرئيسية، جنبا إلى جنب مع بعض المعلومات الأخرى التي تعطيك فكرة أنه موافق الرئيسية دعا و، و دعا ز، ز دعا ساعة، وحيث ان أنا حاليا في برنامجي. لذلك يمكن أن يكون مفيدا حقا، خصوصا أن غمرت خفي من GDB يصبح الساحقة قليلا، ل معرفة بالضبط أين تسير الأمور. أخيرا، عندما يتم برنامجك، أو عند الانتهاء تصحيح ذلك وتريد الابتعاد من البيئة GDB، فإنه يساعد على معرفة كيفية الخروج منه. يمكنك كتابة سؤال أو إنهاء، للخروج. الآن، قبل فيديو اليوم أعددت برنامجا عربات التي تجرها الدواب دعا buggy1، التي أنا جمعت من ملف المعروفة باسم buggy1.c. كما قد تتوقع، وهذا البرنامج هو في الواقع عربات التي تجرها الدواب. شيء يذهب على نحو خاطئ عندما أحاول وتشغيله. الآن، للأسف، وأنا عن غير قصد حذف ملف buggy1.c بلدي، وذلك من أجل بالنسبة لي لمعرفة ما يحدث الخطأ في هذا البرنامج، أنا ذاهب لديك لاستخدام GDB نوع من عمياء، في محاولة للتنقل من خلال هذا البرنامج ل معرفة بالضبط ما يحدث خطأ. ولكن فقط باستخدام الأدوات تعلمنا بالفعل عن، نستطيع حد كبير شخصية بالضبط ما هو عليه. لذلك دعونا رئيس لأكثر من CS50 IDE وننظر لها. OK، لذلك نحن هنا في بلدي CS50 IDE بيئة، وسوف تكبير قليلا حتى تتمكن من رؤية أكثر من ذلك بقليل. في بلدي نافذة الصالة، إذا أسرد محتويات مدير بلدي الحالي مع ليرة سورية، وسنرى أن أكون لدينا اثنين من الملفات المصدر هنا، بما في ذلك نوقشت سابقا buggy1. ما يجري بالضبط في حين أحاول وتشغيل buggy1. حسنا دعونا معرفة ذلك. أنا اكتب مائل نقطة، عربات التي تجرها الدواب، وأنا هاهنا. تجزئة أخطاء. هذا ليس جيدا. إذا كنت تذكر، ل خطأ تجزئة عادة يحدث عندما كنا الوصول الذاكرة اننا لا يسمح للمس. لقد وصلنا الى حد ما خارج حدود ما البرنامج، مترجم، أعطانا. وهكذا بالفعل هذا هو فكرة أن نأخذ في مربع الأدوات ونحن نبدأ عملية التصحيح. شيء قد ذهب قليلا الخطأ هنا. كل الحق، لذلك دعونا بداية حتى البيئة GDB ونرى اذا كنا نستطيع معرفة بالضبط ما هي المشكلة. انا ذاهب لمسح الشاشة بلدي، وانا ذاهب لكتابة GDB مرة أخرى، لدخول بيئة GDB، واسم البرنامج أريد أن تصحيح، buggy1. نحصل على رسالة قليلا، قراءة حرف من buggy1، القيام به. كل ما يعنيه هو أنه انسحب معا كافة التعليمات البرمجية، والآن قد تم تحميله في GDB، وانها على استعداد للذهاب. الآن، ماذا تريد أن تفعل؟ هل تتذكر ما الخطوة الأولى هي عادة بعد أنا داخل هذه البيئة؟ نأمل، قلت تعيين نقطة فاصل، ل في الواقع هذا هو ما أريد القيام به. الآن، وأنا لم يكن لديك كود المصدر لهذا أمامي، الذي هو على الارجح لم يكن الأمر كذلك استخدام نموذجية، بالمناسبة. وربما كنت سوف. لذلك هذا امر جيد. ولكن على افتراض انك لا، ما هو وظيفة واحدة أن تعرف موجود في كل برنامج واحد C؟ مهما كانت كبيرة أو مدى تعقيد هو، هذه الوظيفة موجود بالتأكيد. الرئيسي، أليس كذلك؟ لذلك فشل كل شيء آخر، يمكننا تعيين نقطة فاصل في الرئيسية. ومرة أخرى، ويمكنني أن اكتب فقط كسر الرئيسي، بدلا من ب. وإذا كنت غريبة، إذا كنت اكتب أي وقت مضى أمر طويل ومن ثم ندرك أن كنت كتابة شيء خاطئ، وتريد التخلص جميع وأنا فعلت، يمكنك السيطرة U، والتي سوف حذف كل شيء، وتجلب لك مرة أخرى إلى بداية خطوط المؤشر. وهناك الكثير أسرع من مجرد عقد أسفل حذف، أو ضربه مرات باقة خلال. ولذا فإننا سوف تعيين نقطة فاصل في الرئيسية. وكما ترون، تقول قمنا تعيين نقطة فاصل في ملف buggy1.c، وعلى ما يبدو السطر الأول من مدونة الرئيسي هو خط سبعة. مرة أخرى، ليس لدينا الملف المصدر هنا، ولكن سوف أفترض أنه تقول لي الحقيقة. وبعد ذلك، أنا فقط أحاول وتشغيل البرنامج، ص. بدء تشغيل البرنامج. كل الحق، لذلك هذه الرسالة غير خفي قليلا. ولكن في الأساس ما هو يحدث هنا هو مجرد تقول لي لقد ضرب كسر بلدي نقطة، وكسر النقطة رقم 1. وبعد ذلك، أن سطر من التعليمات البرمجية، لا يوجد مثل هذا الملف أو الدليل. السبب الوحيد الذي اراه هذه الرسالة لأنني غير قصد حذف ملفي buggy.c. إذا وجدت ملفي buggy1.c في الدليل الحالي، هذا الخط سيكون هناك فعلا الحق قل لي ما سطر من التعليمات البرمجية يقرأ حرفيا. للأسف، وأنا حذفه. ونحن في طريقنا لدينا لنوع من التنقل من خلال هذا أكثر من ذلك بقليل عمياء. حسنا، دعونا نرى ما لا أريد أن أفعل هنا؟ حسنا، أنا أود أن أعرف ما المحلي المتغيرات تتوفر لي ربما. لقد بدأت برنامجي. دعونا نرى ما قد يكون تمت تهيئته بالفعل بالنسبة لنا. أنا اكتب معلومات من السكان المحليين، لا من السكان المحليين. كل الحق، بحيث لا أعطني طن من المعلومات. يمكن أن أحاول وطباعة متغير، لكنني لا أعرف أي أسماء المتغيرات. يمكن أن أحاول تتبع الوراء، ولكن أنا داخل الرئيسي، إذا كنت لا تعرف أنا لم تقدم آخر وظيفة الدعوة الآن. لذلك يبدو لي الخيارات الوحيدة هي لاستخدام ن أو نحو ذلك والبدء في الغوص في. انا ذاهب الى استخدام ن. لذلك أنا اكتب ن. يا إلهي، ما الذي يجري هنا. تلقى برنامج الإشارات، SIGSEGV خطأ تجزئة، ثم مجموعة كاملة من الاشياء. أنا بالفعل طغت. حسنا، هناك في الواقع الكثير الذي يمكن تعلمه هنا. فماذا يقول لنا هذا؟ ما يخبرنا هو، وهذا البرنامج هو على وشك، ولكن لم يحدث ذلك، خطأ ثوانى. وعلى وجه الخصوص، وانا ذاهب لتكبير أبعد من ذلك هنا، انها على وشك SEG خطأ حول شيء يسمى strcmp. الآن، ونحن قد لا يكون مناقشته هذه الوظيفة على نطاق واسع. ولكنه is-- لأننا لن للحديث عن كل وظيفة أن موجود في مستوى C library-- ولكنهم كل ما هو متاح لك، خاصة إذا كنت تأخذ ننظر reference.cs50.net. وstrcmp هي قوية حقا وظيفة موجود داخل من رأس string.h الملف، والذي هو رأس ملف مخصص لوظائف أن العمل مع والتلاعب الجمل. وعلى وجه الخصوص، ما يفعله هو strcmp فإنه يقارن قيم سلسلتين. لذلك أنا على وشك أن الإنقسام خطأ على استدعاء strcmp على ما يبدو. أنا ضربت ن، في واقع الأمر أحصل على الرسالة، برنامج إنهاء إشارة SIGSEGV خطأ تجزئة. وحتى الآن أنا فعلا قد انتقد ثوانى، وبرنامجي لديه جميلة كثيرا نظرا بفعالية تصل. هذه هي نهاية البرنامج. انهارت، تحطمها. لذلك لم يكن الكثير، لكنني فعلا معرفة لا بأس به من هذه التجربة قليلا. ما الذي تعلمته؟ حسنا، تعطل برنامجي على الفور الى حد كبير. تعطل برنامجي على دعوة لstrcmp، ولكن أنا لم يكن لديك أية متغيرات المحلية في بلدي برنامج في الوقت الذي تعطل. فما سلسلة أو سلاسل، يمكن لي ربما تكون المقارنة. لو لم يكن لديك أي المحلية المتغيرات، كنت قد نخلص أنني have-- هناك ربما هو المتغير العالمي، والذي يمكن أن يكون صحيحا. ولكن عموما، على ما يبدو وكأنني مقارنة إلى شيء لا وجود له. لذلك دعونا التحقيق أن أبعد قليلا. لذلك أنا ذاهب لمسح الشاشة بلدي. أنا ذاهب لإنهاء خارج البيئة GDB لفترة ثانية. وأنا أفكر، OK، ولذلك لا يوجد لم المتغيرات المحلية في برنامجي. وأتساءل عما إذا ربما أنا من المفترض أن تمر في سلسلة ك وسيطة سطر الأوامر. لذلك دعونا اختبار هذا لتو. أنا لم تفعل هذا من قبل. دعونا نرى ما اذا كان ربما لو كنت تشغيل هذا البرنامج مع وسيطة سطر الأوامر يعمل. هاه، لا خطأ تجزئة هناك. قال لي مجرد أنني حظيت بها. ولذلك ربما يكون هذا هو الإصلاح هنا. وبالفعل، لو نعود وننظر في شفرة المصدر الفعلي للbuggy1.c، يبدو كما لو أن ما أفعله هو أنا إجراء مكالمة إلى strcmp دون فحص ما إذا كان في الواقع ARGV [1] موجودا. هذا هو في الواقع شفرة المصدر لbuggy1.c. ذلك ما كنت حقا بحاجة ل به هنا لإصلاح برنامجي، على افتراض لدي ملف أمامي، غير لإضافة مجرد الاختيار لجعل تأكد من أن ARGC يساوي 2. لذلك هذا المثال، مرة أخرى، كما قلت، غير مفتعلة قليلا، أليس كذلك؟ كنت عموما لن بطريق الخطأ حذف شفرة المصدر الخاصة بك ومن ثم يجب أن يحاول وتصحيح البرنامج. ولكن نأمل، أعطى لك التوضيح من أنواع الأشياء التي هل يمكن أن يكون التفكير كما كنت تصحيح البرنامج. ما هو الوضع هنا؟ ما هي المتغيرات التي أقوم يكون في متناول لي؟ أين بالضبط هو برنامجي تحطمها، على ما سطر، على ما الدعوة إلى ما وظيفة؟ أي نوع من القرائن لا أن تعطيني؟ وهذا هو بالضبط نوع من التفكير الذي كنت يجب أن يكون الدخول عندما كنت التفكير في تصحيح البرامج الخاصة بك. أنا دوغ ويد. هذا هو CS50.