डौग लॉयड: सभी अधिकार GDB। हकीकत में यह क्या है? जो खड़ा है तो GDB, जीएनयू डिबगर के लिए, वास्तव में एक भयानक उपकरण है कि हम कर सकते है हमारे कार्यक्रमों डिबग हमें मदद करने के लिए उपयोग करते हैं, या चीजों रहे हैं, जहां यह पता लगाना हमारे कार्यक्रमों में गलत हो रहा है। GDB, आश्चर्यजनक शक्तिशाली है लेकिन इसके साथ उत्पादन और बातचीत एक छोटा सा गुप्त हो सकता है। यह आमतौर पर एक कमांड लाइन उपकरण है, और यह आप पर संदेशों की एक बहुत फेंक सकते हैं। और यह किस तरह की मेहनत करने के लिए कर सकते हैं हो रहा है कि क्या वास्तव में पार्स। सौभाग्य से, हम ले लिया है कदम आप इस समस्या को दूर करने के लिए आप CS50 के माध्यम से काम करते हैं। आप चित्रमय का उपयोग नहीं कर रहे हैं, डिबगर, जो मेरे सहयोगी दान Armandarse काफी बात की है एक वीडियो में के बारे में एक सा है कि यहाँ पर होना चाहिए अब ठीक है, आप की जरूरत हो सकती है इन कमांड लाइन का उपयोग करने के लिए उपकरण GDB के साथ काम करने के लिए। आप CS50 में काम कर रहे हैं आईडीई, आप ऐसा करने की जरूरत नहीं है। लेकिन अगर तुम नहीं हो CS50 आईडीई में काम कर रहे, शायद एक संस्करण का उपयोग CS50 उपकरण की, या एक और लिनक्स ऑपरेटिंग GDB के साथ प्रणाली, उस पर स्थापित आप का उपयोग करने के लिए आवश्यकता हो सकती है इन कमांड लाइन उपकरण। और जब से तुम हो सकता है यह है, कि क्या करना है बस कैसे समझने के लिए उपयोगी GDB कमांड लाइन से काम करता है। लेकिन फिर, आप कर रहे हैं CS50 आईडीई का उपयोग कर, आप चित्रमय डिबगर का उपयोग कर सकते हैं कि आईडीई में बनाया गया है। तो चीजों के साथ जा पाने के लिए GDB, डिबगिंग शुरू करने के लिए एक विशेष की प्रक्रिया कार्यक्रम, तुम सब करने की ज़रूरत है GDB पीछा टाइप कार्यक्रम के नाम से। तो उदाहरण के लिए, अपने कार्यक्रम है, तो हैलो, आप GDB हैलो टाइप करेंगे। यदि आप ऐसा करते हैं, आप जा रहे हैं GDB पर्यावरण को खींचने के लिए। आपके शीघ्र बदलने के लिए, और होगा बदले जा रहा है की आम तौर पर क्या यह आप चीजों को लिखते समय है आदेश line-- रास में, अपने ठेठ के सभी cd-- लिनक्स, आपके शीघ्र आदेशों , शायद, कुछ करने के लिए बदल जाएगा कोष्ठकों तरह GDB कोष्ठक। ऐसा इसलिए है क्योंकि अपने नए GDB शीघ्र है आप GDB पर्यावरण के अंदर हो। एक बार है कि पर्यावरण के अंदर, दो प्रमुख कमानों रहे है आप शायद का उपयोग करेंगे इस क्रम में। पहले बी, जो है ब्रेक के लिए छोटा है। और अगर आप ख, आप आमतौर पर टाइप करने के बाद एक समारोह का नाम टाइप करें, या आप को पता होगा कि अगर क्या लाइन नंबर के आसपास अपने कार्यक्रम शुरू कर रहा है एक अजीब सा व्यवहार करने के लिए, आप एक पंक्ति टाइप कर सकते हैं नंबर वहाँ के रूप में अच्छी तरह से। क्या बी, या तोड़ने करता है, है यह अपने कार्यक्रम की अनुमति देता है एक निश्चित बिंदु तक चलाने के लिए, समारोह के नाम से, नाम आपके द्वारा निर्दिष्ट या लाइन कि आपके द्वारा निर्दिष्ट संख्या। और उस बिंदु पर, यह निष्पादन फ्रीज होगा। इस वजह से, एक बहुत अच्छी बात है निष्पादन जमे हुए किया गया है एक बार, आप बहुत धीरे धीरे शुरू कर सकते हैं अपने कार्यक्रम के माध्यम से कदम। आप किया गया है जो आम तौर पर चल रहा है, अपने कार्यक्रमों, वे बहुत कम कर रहे हैं। आमतौर पर, आप डॉट स्लेश टाइप जो कुछ भी अपने कार्यक्रम के नाम, हिट दर्ज है और आप पलक कर सकते हैं, इससे पहले कि आपके कार्यक्रम के पहले ही समाप्त हो गया है। यह वास्तव में कोशिश करने के लिए समय की एक बहुत कुछ नहीं है और गलत क्या हो रहा है यह पता लगाने। यह वास्तव में चीजें धीमी गति से करने में सक्षम हो तो नीचे बी के साथ एक ब्रेक अंक की स्थापना करके, और उसके बाद में निकलते। आप अपने को तोड़ने की स्थापना की है तो एक बार बिंदु, आप प्रोग्राम चला सकते हैं। और अगर आप किसी भी कमांड लाइन तर्क, आप उन्हें यहाँ निर्दिष्ट नहीं जब आप अपने कार्यक्रम के नाम GDB लिखें। आप सभी कमांड लाइन निर्दिष्ट आर, या रन लेने के द्वारा तर्क, और फिर जो भी कमांड लाइन तर्क आप अपने प्रोग्राम के अंदर की जरूरत है। अन्य की एक संख्या वास्तव में कर रहे हैं महत्वपूर्ण और उपयोगी आदेशों सकल घरेलू उत्पाद पर्यावरण के अंदर। तो बस जल्दी से मुझे दो उनमें से कुछ पर चलते हैं। पहला, अगले के लिए कम है जो एन, है और आप अगले बजाय n के टाइप कर सकते हैं दोनों काम करेगा। और यह सिर्फ आशुलिपि है। और आप शायद पहले से ही मिल गया है के रूप में चीजों को टाइप करने में सक्षम किया जा रहा है, के लिए इस्तेमाल किया कम आम तौर पर बेहतर है। और क्या यह करना होगा कि यह जाएगा कोड के आगे एक ब्लॉक कदम। तो यह आगे बढ़ना होगा एक समारोह कॉल जब तक। और फिर बजाय का उस समारोह में गोताखोरी और कहा कि कार्यों के सभी के माध्यम से जा रहा कोड, यह सिर्फ समारोह होगा। समारोह में बुलाया जाएगा। यह अपने काम है जो कुछ भी करना होगा। यह एक मूल्य के लिए वापस आ जाएगी यह कहा जाता है कि समारोह। और फिर आप के लिए कदम होगा कि बुला समारोह की अगली पंक्ति। आप कदम चाहते हैं समारोह के अंदर, बजाय सिर्फ होने का यह विशेष रूप से, अमल आप समस्या यह है कि अगर आपको लगता उस समारोह के अंदर झूठ हो सकता है, आप निश्चित रूप से, एक ब्रेक तैयार कर सकती है अंदर उस समारोह का इशारा करते हैं। आप पहले से ही चल रहे हैं या, यदि आप कर सकते हैं कोड के आगे एक लाइन करने के लिए कदम रों का उपयोग करें। तो इस में कदम होगा और कार्यों में गोता, के बजाय सिर्फ निष्पादित और समारोह में जारी रखने पर आप डिबगिंग के लिए कर रहे हैं। यदि आप कभी भी जानना चाहते हैं एक चर के मूल्य, आप पी, या प्रिंट टाइप कर सकते हैं, और फिर चर नाम। और कहा कि, आप के लिए बाहर प्रिंट होगा GDB पर्यावरण के अंदर, चर का नाम, कि you-- me-- चर के मूल्य बहाना आप नामित किया है। आप हर के मूल्यों को जानना चाहते हैं जहां से स्थानीय चर सुलभ आप वर्तमान में कर रहे हैं अपने कार्यक्रम आप की जानकारी स्थानीय लोगों को टाइप कर सकते हैं। की तुलना में यह एक बहुत तेज है तो पी टाइपिंग और जो कुछ भी, बाहर के सभी लिस्टिंग आप पता होता है कि चर। आप की जानकारी स्थानीय लोगों को टाइप करें, और यह कर सकते हैं आप के लिए सब कुछ बाहर प्रिंट होगा। अगले ऊपर है, जो बीटी है वापस ट्रेस के लिए कम। अब, आम तौर पर, विशेष रूप से जल्दी CS50 में, आप वास्तव में अवसर नहीं होगा बीटी, या वापस ट्रेस का उपयोग करने के लिए, आप कार्यों नहीं कर रहे हैं, क्योंकि कि अन्य कार्यों कहते हैं। आप मुख्य कॉल एक हो सकता है समारोह, लेकिन लगता है कि शायद यह बात है। आपको लगता है कि अन्य समारोह में नहीं है एक अन्य समारोह, बुला जो एक अन्य समारोह में कहता है, और इतने पर। लेकिन अपने कार्यक्रमों को और अधिक पाने के रूप में जटिल है, और विशेष रूप से आप काम शुरू करते समय प्रत्यावर्तन के साथ वापस ट्रेस आप यह बताने के लिए एक बहुत उपयोगी तरीका हो सकता है तरह का है, जहां के लिए कुछ प्रसंग मिलता है मैं अपने कार्यक्रम में हूँ। तो अगर आप अपने कोड लिखा है कहते हैं, और आप मुख्य एक समारोह कॉल जानते हैं कि एक समारोह में जो कॉल च, एक समारोह एच कहता है जो जी,। इसलिए हम कई परतें हैं घोंसले के शिकार के यहां चल रहा है। आप के अंदर कर रहे हैं अपने GDB पर्यावरण, और आप अपने अंदर पता घंटा की, लेकिन आप भूल जाते हैं आप जहां तक ​​तुम्हारे पास क्या है के बारे में आप बीटी, या वापस ट्रेस टाइप कर सकते हैं are--, और यह, एच, जी बाहर मुख्य च प्रिंट होगा कुछ अन्य जानकारी के साथ-साथ जो आप एक संकेत देता है कि, ठीक मुख्य कहा जाता च कहा जाता है, जी एफ, जी, एच बुलाया और कहा कि जहां मैं वर्तमान में मेरे कार्यक्रम में हूँ। तो यह वास्तव में उपयोगी हो सकता है विशेष रूप से GDB का गुप्त सत्ता के रूप में करने के लिए, एक छोटे से भारी हो जाता है बातें कर रहे हैं वास्तव में, जहां यह पता लगाना। अंत में, अपने कार्यक्रम किया जाता है, जब आप कर रहे हैं या इसे डिबगिंग और तुम दूर कदम चाहते हैं GDB वातावरण से, यह इसे से बाहर निकलने के लिए कैसे पता करने के लिए मदद करता है। आप क्यू टाइप करें, या बाहर निकलने के लिए, छोड़ सकते हैं। अब, आज के वीडियो से पहले मैं एक छोटी गाड़ी कार्यक्रम तैयार मैं संकलित जो कहा जाता buggy1, buggy1.c के रूप में जाना जाता है एक फ़ाइल से। यदि आप इस उम्मीद कर सकते हैं कार्यक्रम तथ्य छोटी गाड़ी में है। कुछ गलत हो जाता है जब मैं कोशिश करते हैं और इसे चलाते हैं। अब, दुर्भाग्य से, मैं अनजाने , मेरे buggy1.c फ़ाइल को नष्ट इसलिए क्रम में मुझे बाहर निकालने के लिए क्या, इस कार्यक्रम के साथ गलत हो रहा है मैं का उपयोग करने के लिए जा रहा हूँ GDB तरह की आँख बंद करके की कोशिश कर रहा करने के लिए इस कार्यक्रम के माध्यम से नेविगेट करने के लिए गलत हो रहा है कि क्या वास्तव में यह पता लगाने की। लेकिन सिर्फ उपकरणों का उपयोग हम पहले से ही के बारे में सीखा है हम बहुत ज्यादा समझ सकते हैं यह है कि क्या वास्तव में बाहर। तो चलो के लिए सिर पर चलो CS50 आईडीई और एक नजर है। ठीक है, तो हम में यहाँ कर रहे हैं मेरी CS50 आईडीई पर्यावरण, और मैं एक छोटा सा में ज़ूम करता हूँ इसलिए यदि आप एक छोटे से अधिक देख सकते हैं। मेरी टर्मिनल विंडो में, मैं इस सूची में यदि मेरे वर्तमान निदेशक की सामग्री रास के साथ, हम है कि जब मैं देखता हूँ स्रोत फ़ाइलों की एक जोड़ी है यहाँ, सहित पहले से buggy1 पर चर्चा की। क्या वास्तव में जब पर चला जाता है मैं कोशिश करते हैं और buggy1 चलाते हैं। खैर चलो पता करते हैं। मैं डॉट स्लेश टाइप छोटी गाड़ी है, और मैं हिट दर्ज करें। विभाजन के दोष। यह अच्छा नहीं है। यदि आपको याद है, एक विभाजन गलती आम तौर पर हम स्मृति का उपयोग तब होता है जब हम छूने की अनुमति नहीं कर रहे हैं। हम किसी भी तरह पहुँच गए हैं सीमा से बाहर का क्या कार्यक्रम है, संकलक, हमें दिया है। और तो पहले से ही है कि एक सुराग उपकरण बॉक्स में रखने के लिए हम डिबगिंग प्रक्रिया शुरू करते हैं। कुछ यहाँ एक छोटे से गलत हो गया है। ठीक है, तो चलो शुरुआत GDB पर्यावरण अप हम समझ सकते हैं और देखते हैं वास्तव में क्या समस्या है। मैं अपने स्क्रीन स्पष्ट करने के लिए जा रहा हूँ और मैं GDB टाइप करने के लिए जा रहा हूँ फिर, GDB वातावरण में प्रवेश करने के लिए, और इस कार्यक्रम का नाम मैं buggy1 डीबग करना चाहते हैं। हम पढ़ने, एक छोटे से संदेश मिलता है buggy1 से प्रतीकों, किया। इसका मतलब है कि सभी इसे खींच लिया है एक साथ कोड के सभी, और अब इसे में लोड किया गया है GDB, और उसे जाने के लिए तैयार है। अब, मैं क्या करना चाहते हैं? आप क्या याद है पहले कदम के लिए आम तौर पर है मैं इस माहौल के अंदर हूँ के बाद? उम्मीद है, आप लगा दी एक ब्रेक अंक, क्योंकि वास्तव में है कि मैं क्या करना चाहते है। अब, मैं नहीं है इस के लिए स्रोत कोड मेरे सामने, जो शायद है नहीं विशिष्ट उपयोग के मामले में, जिस तरह से। आप शायद होगा। तो यह अच्छी बात है। लेकिन यह सोचते हैं कि आप नहीं, क्या करना क्या आप जानते हैं कि एक समारोह हर एक सी कार्यक्रम में मौजूद है? कोई बात नहीं कितना बड़ा या कितनी जटिल यह है, इस समारोह में निश्चित रूप से मौजूद है। मुख्य, है ना? तो और, हम कर सकते हैं नाकाम रहने मुख्य पर एक ब्रेक अंक निर्धारित किया है। और फिर, मैं सिर्फ टाइप कर सकते हैं बजाय ख की, मुख्य टूट गया। और अगर आप उत्सुक हैं, तो आप यदि कभी एक लंबे आदेश बाहर प्रकार और फिर आप महसूस करते हैं कि गलत बात टाइप, और आप छुटकारा पाने के लिए चाहते हैं के सभी मैं बस के रूप में किया, आप जो होगा, नियंत्रण यू ले जा सकते हैं सब कुछ हटा सकते हैं और आप को वापस लाने के कर्सर लाइनों की शुरुआत करने के लिए। बस नीचे पकड़ से एक बहुत तेजी हटाने के लिए, या यह एक गुच्छा बार मार खत्म हो गया। इसलिए हम मुख्य में एक ब्रेक अंक निर्धारित करेंगे। और आप देख सकते हैं, यह हम है कहते हैं फ़ाइल buggy1.c में एक ब्रेक अंक निर्धारित करते हैं, और जाहिरा तौर पर पहली पंक्ति मुख्य संहिता की लाइन सात है। फिर, हमारे पास नहीं है यहाँ स्रोत फ़ाइल, लेकिन मुझे लगता है कि यह मान लेंगे मुझे सच कह रही। और फिर, मैं सिर्फ कोशिश कर रहा हूँ और आर, कार्यक्रम चलाते हैं। कार्यक्रम शुरू। ठीक है, तो इस संदेश एक छोटी सी गहरी है। लेकिन मूल रूप से क्या है यहाँ क्या हो रहा है कि यह सिर्फ है मैं अपने को तोड़ने मारा है मुझे बता रहा है बिंदु, ब्रेक प्वाइंट नंबर 1। और फिर, कोड की है कि लाइन, ऐसी कोई फ़ाइल या डायरेक्टरी नहीं है। एक ही कारण है कि मैं उस संदेश को देख रहा हूँ मैं अनजाने क्योंकि मेरी buggy.c फ़ाइल नष्ट कर दिया। मेरी buggy1.c फ़ाइल अस्तित्व में हैं वर्तमान निर्देशिका में, वहाँ वास्तव में होता यह है कि लाइन सही मुझे बताओ कि क्या कोड की लाइन सचमुच पढ़ता है। दुर्भाग्य से, मैं इसे नष्ट कर दिया। हम किस तरह का नेविगेट करने के लिए जा रहे हैं अधिक आँख बंद करके इस एक छोटे से के माध्यम से। ठीक है, तो चलो देखते हैं, क्या मैं यहाँ क्या करना चाहते हैं? खैर, मैं स्थानीय जानते हैं कि क्या करना चाहते हैं चर शायद मेरे लिए उपलब्ध हैं। मैं अपने कार्यक्रम शुरू कर दिया है। का हो सकता है देखते हैं क्या पहले से ही हमारे लिए initialized। मैं जानकारी स्थानीय लोगों को, कोई स्थानीय लोगों लिखें। ठीक है, कि नहीं करता है तो मुझे जानकारी का एक टन देना। मैं कोशिश करते हैं और एक चर बाहर प्रिंट कर सकता है, लेकिन मैं किसी भी चर नाम पता नहीं है। मैं एक वापस ट्रेस करने की कोशिश कर सकता है, लेकिन मैं मुख्य के अंदर हूँ, इसलिए मुझे लगता है मैं नहीं किया है पता है ठीक है अब एक और समारोह कॉल। मेरी ही विकल्प हैं जैसे तो लग रहा है n या इतनी का उपयोग करें और में गोता लगाने के लिए शुरू करने के लिए। मैं n का उपयोग करने के लिए जा रहा हूँ। तो मैं n टाइप करें। हे भगवान, क्या यहाँ पर जा रहा है। कार्यक्रम का संकेत प्राप्त किया, SIGSEGV विभाजन गलती है, और फिर सामान की एक पूरी गुच्छा। मैं पहले से ही अभिभूत हूँ। खैर, वहाँ वास्तव में एक बहुत यहाँ सीखा होगा। तो यह हमें क्या बताता है? क्या यह हमें बताता है इस कार्यक्रम है, है के बारे में है, लेकिन अभी तक नहीं है, SEG गलती है। और विशेष रूप से, मैं जा रहा हूँ आगे भी यहां ज़ूम करने के लिए, इसके बारे में गलती SEG तक के बारे में है कुछ strcmp बुलाया। अब, हम चर्चा नहीं हो सकता है बड़े पैमाने पर इस समारोह। हम नहीं जा रहे हैं लेकिन क्योंकि यह है- हर कार्य के बारे में बात करने के लिए कि सी मानक में मौजूद library-- लेकिन वे सब आप के लिए उपलब्ध हो आप एक लेने के लिए विशेष रूप से अगर reference.cs50.net को देखो। और strcmp एक बहुत शक्तिशाली है अंदर मौजूद है कि समारोह स्ट्रिंग हेडर की एक शीर्षक है जो फ़ाइल, कार्यों के लिए समर्पित है कि फ़ाइल साथ कि काम और तार में हेरफेर। और विशेष रूप से, क्या strcmp करता है यह दो तारों के मूल्यों की तुलना। इसलिए मैं गलती विभाजन के बारे में हूँ एक कॉल पर ऐसा लगता है strcmp करने के लिए। , मैं n मारा, और वास्तव में मैं संदेश मिलता है कार्यक्रम संकेत SIGSEGV के साथ समाप्त विखंडन दोष। तो अब मैं वास्तव में SEG गलती की है, और मेरा कार्यक्रम बहुत है ज्यादा प्रभावी ढंग से छोड़ दिया। इस कार्यक्रम का अंत है। यह खराब हो गई है, यह दुर्घटनाग्रस्त हो गया। तो एक बहुत कुछ नहीं था, लेकिन मैं वास्तव में काफी कुछ सीख किया इस छोटे से अनुभव से। मैं क्या सीखा है? खैर, मेरे कार्यक्रम दुर्घटनाओं तुरंत बहुत ज्यादा। मेरे कार्यक्रम पर दुर्घटनाओं एक strcmp करने के लिए कहते हैं, लेकिन मैं में किसी भी स्थानीय चर नहीं है मेरी यह विमान दुर्घटनाग्रस्त उस समय कार्यक्रम। तो क्या स्ट्रिंग, या तार, मैं संभवतः की तुलना हो सकती है। मैं किसी भी स्थानीय नहीं है, तो चर, तुम हो सकता है हो सकता है एक है कि मैं वहाँ have-- कि शंका सच हो सकता है, जो वैश्विक चर,। लेकिन आम तौर पर, ऐसा लगता है जैसे मैं तुलना कर रहा हूँ मौजूद नहीं है कि कुछ करने के लिए। तो चलो की जांच एक छोटे से आगे है। इसलिए मैं अपने स्क्रीन स्पष्ट करने के लिए जा रहा हूँ। मैं से बाहर छोड़ने के लिए जा रहा हूँ एक पल के लिए GDB वातावरण। और मैं ठीक है, सोच रहा हूँ, इसलिए वहाँ मेरे कार्यक्रम में कोई स्थानीय चर। मैं पारित करने के लिए माना जाता रहा हूँ हो सकता है अगर मुझे आश्चर्य है एक कमांड लाइन तर्क के रूप में एक स्ट्रिंग में। तो चलो बस इस परीक्षण से बाहर जाने। मैंने पहले ऐसा नहीं किया है। मैं इस कार्यक्रम को चलाने हो सकता है अगर है, तो चलो देखते हैं एक कमांड लाइन तर्क के साथ यह काम करता है। हं, वहाँ कोई विभाजन गलती। यह सिर्फ मैं यह समझ से बाहर है कि मुझे बताया था। इसलिए हो सकता है कि तय यहाँ है। मैं वापस जाने के लिए और यदि और वास्तव में, पर देखो buggy1.c के लिए वास्तविक स्रोत कोड, मैं क्या कर रहा हूँ के रूप में हालांकि ऐसा लगता है मैं बिना strcmp के लिए एक फोन कर रहा हूँ वास्तव में argv [1] से मौजूद है कि क्या जाँच। यह वास्तव में है buggy1.c के लिए स्रोत कोड। इसलिए मैं वास्तव में क्या करने की जरूरत अपने कार्यक्रम तय करने के लिए यहां करते हैं, यह मानते हुए कि मेरे पास है है, मेरे सामने दाखिल सिर्फ बनाने के लिए एक जांच में जोड़ने के लिए सुनिश्चित करें कि argc 2 के बराबर है। तो इस उदाहरण, फिर मैं ने कहा, जैसे ठीक है, एक छोटा सा काल्पनिक है? आप आम तौर पर करने के लिए नहीं जा रहे हैं गलती से अपने स्रोत कोड को नष्ट और उसके बाद की कोशिश है और कार्यक्रम डिबग। लेकिन उम्मीद है, यह दिया आप एक उदाहरण चीजों की तरह की है कि आप के बारे में सोच किया जा सकता है के रूप में आप अपने प्रोग्राम डिबगिंग रहे हैं। यहां मामलों के राज्य क्या है? क्या चर मुझे क्या करना है मेरे लिए सुलभ है? वास्तव में, जहां मेरे प्रोग्राम है क्या लाइन पर, दुर्घटनाग्रस्त, क्या कार्य करने के लिए क्या कॉल पर? सुराग किस तरह का है कि मुझे देता है? और कहा कि ठीक है मानसिकता की तरह है कि आप जब तुम में हो रही किया जाना चाहिए अपने कार्यक्रमों डीबगिंग के बारे में सोच रही है। मैं डौग लॉयड हूँ। इस CS50 है।