जीडीबी - त्वरित गाइड

डिबगर एक ऐसा प्रोग्राम है, जो अन्य प्रोग्राम चलाता है, जिससे उपयोगकर्ता इन कार्यक्रमों पर नियंत्रण रख सकता है, और समस्या उत्पन्न होने पर वेरिएबल्स की जांच कर सकता है।

GNU डिबगर, जिसे कहा भी जाता है gdb, UNIX सिस्टम के लिए C और C ++ प्रोग्राम डिबग करने के लिए सबसे लोकप्रिय डिबगर है।

GNU डिबगर आपको निम्नलिखित के बारे में जानकारी प्राप्त करने में मदद करता है:

  • यदि एक कोर डंप हुआ, तो कार्यक्रम किस कथन या अभिव्यक्ति पर दुर्घटनाग्रस्त हुआ?

  • यदि किसी फ़ंक्शन को निष्पादित करते समय कोई त्रुटि होती है, तो प्रोग्राम की किस पंक्ति में उस फ़ंक्शन को कॉल होता है, और पैरामीटर क्या हैं?

  • कार्यक्रम के निष्पादन के दौरान एक विशेष बिंदु पर कार्यक्रम चर के मूल्य क्या हैं?

  • एक कार्यक्रम में एक विशेष अभिव्यक्ति का परिणाम क्या है?

कैसे GDB डिबग?

जीडीबी आपको प्रोग्राम को एक निश्चित बिंदु तक चलाने की अनुमति देता है, फिर उस बिंदु पर कुछ चर के मूल्यों को रोकें और प्रिंट करें, या एक समय में प्रोग्राम एक पंक्ति के माध्यम से कदम बढ़ाएं और प्रत्येक पंक्ति को निष्पादित करने के बाद प्रत्येक चर के मूल्यों को प्रिंट करें।

GDB एक साधारण कमांड लाइन इंटरफ़ेस का उपयोग करता है।

नोट करने के लिए अंक

  • भले ही GDB आपको मेमोरी लीकेज संबंधित बग्स का पता लगाने में मदद कर सकता है, लेकिन यह मेमोरी लीकेज का पता लगाने का उपकरण नहीं है।

  • GDB का उपयोग उन प्रोग्रामों के लिए नहीं किया जा सकता है जो त्रुटियों के साथ संकलन करते हैं और यह उन त्रुटियों को ठीक करने में मदद नहीं करता है।

स्थापना के लिए जाने से पहले, जांच लें कि क्या आपके पास पहले से ही निम्न कमांड जारी करके अपने यूनिक्स सिस्टम पर gdb स्थापित है:

$gdb -help

यदि GDB स्थापित है, तो यह आपके GDB के भीतर सभी उपलब्ध विकल्पों को प्रदर्शित करेगा। यदि GDB स्थापित नहीं है, तो एक नए इंस्टॉलेशन के लिए आगे बढ़ें।

आप नीचे चर्चा किए गए सरल चरणों का पालन करके अपने सिस्टम पर GDB स्थापित कर सकते हैं।

step 1: सुनिश्चित करें कि आपके पास gbb स्थापित करने के लिए आवश्यक शर्तें हैं:

  • एक एएनएसआई-अनुपालन सी संकलक (जीसीसी की सिफारिश की जाती है - ध्यान दें कि जीडीबी अन्य संकलक द्वारा उत्पन्न कोड डीबग कर सकता है)

  • जिस विभाजन पर आप gdb बनाने जा रहे हैं, उस पर 115 एमबी मुक्त डिस्क स्थान आवश्यक है।

  • जिस डिस्क पर आप gdb स्थापित करने जा रहे हैं, उस पर 20 एमबी मुक्त डिस्क स्थान आवश्यक है।

  • GNU का अपघटन कार्यक्रम, gzip

  • make उपयोगिता - जीएनयू संस्करण एक समस्या के बिना काम करने के लिए जाना जाता है, अन्य संभवतः भी करते हैं।

step 2: से gdb स्रोत वितरण डाउनलोड करें ftp.gnu.org/gnu/gdb. (हमने इस्तेमाल किया gdb-6.6.tar.gz इन निर्देशों के लिए।) वितरण फ़ाइलों को अपनी बिल्ड निर्देशिका में रखें।

step 3:अपनी बिल्ड डायरेक्टरी में, gdb-6.6.tar.gz को डीकंप्रेस करें और आर्काइव से सोर्स फाइल्स निकालें। एक बार फाइलें निकालने के बाद, अपनी वर्किंग डायरेक्टरी को gdb-6.6 डाइरेक्टरी में बदलें जो कि आपके बिल्ड डायरेक्टरी में अपने आप बन गई थी।

$ build> gzip -d gdb-6.6.tar.gz 
$ build> tar xfv gdb-6.6.tar 
$ build> cd gdb-6.6

step 4: अपने प्लेटफ़ॉर्म के लिए स्रोत ट्री को कॉन्फ़िगर करने के लिए कॉन्फ़िगर स्क्रिप्ट चलाएँ।

$ gdb-6.6> .⁄configure

step 5: का उपयोग कर gdb बनाएँ make उपयोगिता।

$ gdb-6.6> make

step 6: रूट के रूप में लॉगिन करें और निम्न कमांड का उपयोग करके जीडीबी स्थापित करें।

$ gdb-6.6> make install

step 7: यदि आवश्यक हो, तो डिस्क स्पेस को जीडीबी बिल्ड डायरेक्टरी और इंस्टॉलेशन के पूरा होने के बाद आर्काइव फाइल को डिलीट करके रिकवर किया जा सकता है।

$ gdb-6.6> cd .. 
$ build> rm -r gdb-6.6 
$ build> rm gdb-6.6.tar

अब आपके पास आपके सिस्टम पर gdb इंस्टॉल हो गया है और यह उपयोग के लिए तैयार है।

Debugging Symbol Tableसंकलित बाइनरी प्रोग्राम में मैप्स निर्देशों को उनके संबंधित चर, फ़ंक्शन, या स्रोत कोड में लाइन। यह मानचित्रण कुछ इस तरह हो सकता है:

  • कार्यक्रम निर्देश ⇒ आइटम का नाम, आइटम प्रकार, मूल फ़ाइल, लाइन नंबर परिभाषित।

प्रतीक तालिकाओं को प्रोग्राम में एम्बेड किया जा सकता है या एक अलग फ़ाइल के रूप में संग्रहीत किया जा सकता है। इसलिए यदि आप अपने प्रोग्राम को डिबग करने की योजना बनाते हैं, तो एक प्रतीक तालिका बनाना आवश्यक है, जिसमें प्रोग्राम को डीबग करने के लिए आवश्यक जानकारी होगी।

हम प्रतीक तालिकाओं के बारे में निम्नलिखित तथ्यों का अनुमान लगा सकते हैं:

  • एक प्रतीक तालिका कार्यक्रम के एक विशेष संस्करण के लिए काम करती है - यदि कार्यक्रम बदलता है, तो एक नई तालिका बनाई जानी चाहिए।

  • डिबग बिल्ड अक्सर खुदरा (गैर-डीबग) बिल्ड से बड़ा और धीमा होता है; डिबग बिल्ड में प्रतीक तालिका और अन्य सहायक जानकारी होती है।

  • यदि आप एक द्विआधारी कार्यक्रम को डीबग करना चाहते हैं जो आपने खुद को संकलित नहीं किया था, तो आपको लेखक से प्रतीक तालिकाओं को प्राप्त करना होगा।

GDB को प्रतीक तालिका से लाइन द्वारा वह सभी सूचना रेखा पढ़ने में सक्षम बनाने के लिए, हमें इसे थोड़ा अलग ढंग से संकलित करने की आवश्यकता है। आम तौर पर हम अपने कार्यक्रमों को संकलित करते हैं:

gcc hello.cc -o hello

ऐसा करने के बजाय, हमें नीचे दिखाए गए -g ध्वज के साथ संकलन करने की आवश्यकता है:

gcc -g hello.cc -o hello

GDB आदेशों की एक बड़ी सूची प्रदान करता है, हालांकि निम्नलिखित आदेश सबसे अधिक बार उपयोग किए जाने वाले हैं:

  • b main - कार्यक्रम की शुरुआत में एक ब्रेकपॉइंट डालता है

  • b - वर्तमान लाइन पर एक ब्रेकपॉइंट डालता है

  • b N - लाइन एन पर एक ब्रेकपॉइंट डालता है

  • b +N - एक ब्रेकपॉइंट एन लाइनों को वर्तमान लाइन से नीचे डालता है

  • b fn - फ़ंक्शन "fn" की शुरुआत में एक ब्रेकपॉइंट डालता है

  • d N - हटाए गए बिंदु संख्या N को हटाता है

  • info break - सूची ब्रेकप्वाइंट

  • r - एक ब्रेकपॉइंट या त्रुटि तक कार्यक्रम चलाता है

  • c - अगले ब्रेकपॉइंट या त्रुटि तक प्रोग्राम को चालू रखना

  • f - वर्तमान फ़ंक्शन समाप्त होने तक चलता है

  • s - कार्यक्रम की अगली पंक्ति चलाता है

  • s N - कार्यक्रम की अगली एन लाइनें चलाता है

  • n - एस की तरह, लेकिन यह कार्यों में कदम नहीं रखता है

  • u N - चालू लाइन के सामने एन लाइन्स मिलने तक चलाएं

  • p var - चर "var" के वर्तमान मूल्य को प्रिंट करता है

  • bt - एक स्टैक ट्रेस प्रिंट

  • u - स्टैक में एक स्तर ऊपर जाता है

  • d - स्टैक में एक स्तर नीचे चला जाता है

  • q - जीडीबी छोड़ता है

प्रारंभ करना: प्रारंभ करना और रोकना

  • gcc -g myprogram.c

    • डीबगिंग विकल्प (-g) के साथ myprogram.c को संकलित करता है। आप अभी भी a.out प्राप्त करते हैं, लेकिन इसमें डीबगिंग जानकारी है जो आपको GDB के अंदर चर और फ़ंक्शन नामों का उपयोग करने देती है, बजाय कच्चे मेमोरी लोकेशन के (मजेदार नहीं)।

  • gdb a.out

    • फ़ाइल a.out के साथ GDB खोलता है, लेकिन प्रोग्राम नहीं चलाता है। आपको एक संकेत (gdb) दिखाई देगा - सभी उदाहरण इस संकेत से हैं।

  • r

  • r arg1 arg2

  • r <file1

    • पहले लोड किए गए "a.out" को चलाने के तीन तरीके। आप इसे सीधे (आर), पास तर्क (आर arg1 arg2), या किसी फ़ाइल में फ़ीड कर सकते हैं। आप आमतौर पर चलने से पहले ब्रेकपॉइंट सेट करेंगे।

  • help

  • एच ब्रेकप्वाइंट

    • सूचियाँ विषयों (हेल्प) की मदद करती हैं या किसी विशिष्ट विषय (h ब्रेकप्वाइंट) पर सहायता प्राप्त करती हैं। GDB अच्छी तरह से प्रलेखित है।

  • Q - GDB से बाहर निकलें

कोड के माध्यम से कदम

कदम रखने से आप अपने प्रोग्राम का पथ ट्रेस कर सकते हैं, और उस कोड पर शून्य कर सकते हैं जो दुर्घटनाग्रस्त हो रहा है या अमान्य इनपुट लौटा रहा है।

  • l

  • एल 50

  • एल myfunction

    • वर्तमान लाइन (l), एक विशिष्ट लाइन (l 50), या फ़ंक्शन (l myfunction) के लिए स्रोत कोड की 10 पंक्तियों को सूचीबद्ध करता है।

  • आगे

    • अगली पंक्ति तक कार्यक्रम चलाता है, फिर रुक जाता है। यदि वर्तमान रेखा एक फ़ंक्शन है, तो यह पूरे फ़ंक्शन को निष्पादित करता है, फिर रुक जाता है।next जल्दी से अपने कोड के माध्यम से चलने के लिए अच्छा है।

  • कदम

    • अगला निर्देश चलाता है, रेखा नहीं। यदि वर्तमान निर्देश एक चर सेट कर रहा है, तो यह उसी के समान हैnext। यदि यह एक फ़ंक्शन है, तो यह फ़ंक्शन में कूद जाएगा, पहले स्टेटमेंट को निष्पादित करेगा, फिर रोक देगा।step आपके कोड के विवरण में गोता लगाने के लिए अच्छा है।

  • समाप्त

    • वर्तमान फ़ंक्शन को निष्पादित करता है, फिर विराम दें (इसे स्टेप आउट भी कहा जाता है)। उपयोगी है अगर आप गलती से एक समारोह में कदम रखा।

ब्रेकपॉइंट या वॉचपॉइंट

ब्रेकपॉइंट डिबगिंग में महत्वपूर्ण भूमिका निभाते हैं। जब वे एक निश्चित बिंदु पर पहुंचते हैं तो वे एक कार्यक्रम को रोकते हैं (तोड़ते हैं)। आप चर को फिर से जाँच और बदल सकते हैं और निष्पादन को फिर से शुरू कर सकते हैं। यह तब सहायक होता है जब कुछ इनपुट विफलता होती है, या इनपुट का परीक्षण किया जाना होता है।

  • तोड़ ४५

  • तोड़ना

    • 45, या myfunction पर एक ब्रेकपॉइंट सेट करता है। जब यह ब्रेकपॉइंट तक पहुंच जाएगा तो कार्यक्रम रुक जाएगा।
  • घड़ी x == 3

    • एक वॉचपॉइंट सेट करता है, जो एक स्थिति बदलने पर प्रोग्राम को रोक देता है (जब x == 3 बदलता है)। वॉचपॉइंट हर फ़ंक्शन कॉल पर ब्रेक किए बिना कुछ इनपुट (myPtr! = NULL) के लिए बहुत अच्छे हैं ।

  • जारी रखें

    • ब्रेकपॉइंट / वॉचपॉइंट द्वारा रोक दिए जाने के बाद निष्पादन को फिर से शुरू करें। कार्यक्रम तब तक जारी रहेगा जब तक कि यह अगले ब्रेकपॉइंट / वॉचपॉइंट को हिट न कर दे।

  • हटाएं N

    • हटाए गए ब्रेकप्वाइंट एन (ब्रेकपॉइंट को बनाए जाने पर गिने जाते हैं)।

चर सेट करना

रनवे पर चर देखना और बदलना डिबगिंग का एक महत्वपूर्ण हिस्सा है। समस्याओं के मूल कारण का पता लगाने के लिए फ़ंक्शन या अन्य परीक्षण मामलों को चलाने के लिए अमान्य इनपुट प्रदान करने का प्रयास करें। आमतौर पर, आप प्रोग्राम को रोक दिए जाने पर चर को देखेंगे / सेट करेंगे।

  • प्रिंट एक्स

    • चर x का वर्तमान मूल्य प्रिंट करता है। मूल चर नामों का उपयोग करने में सक्षम होने के कारण (-g) ध्वज की आवश्यकता है; नियमित रूप से संकलित कार्यक्रमों से यह जानकारी हटा दी जाती है।

  • x = 3 सेट करें

  • x = y सेट करें

    • X को सेट मान (3) या दूसरे चर (y) पर सेट करता है
  • कॉल myfunction ()

  • कॉल myotherfunction (x)

  • कॉल स्ट्रलेन (रहस्य)

    • उपयोगकर्ता-परिभाषित या सिस्टम फ़ंक्शन को कॉल करता है। यह अत्यंत उपयोगी है, लेकिन छोटी गाड़ी के कार्यों को कॉल करने से सावधान रहें।

  • प्रदर्शन एक्स

    • लगातार चर x का मान प्रदर्शित करता है, जो हर चरण या ठहराव के बाद दिखाया जाता है। उपयोगी यदि आप एक निश्चित मूल्य के लिए लगातार जाँच कर रहे हैं।

  • अविवादित एक्स

    • प्रदर्शन कमांड द्वारा प्रदर्शित चर के निरंतर प्रदर्शन को हटाता है।

बैकट्रेस और चेंजिंग फ्रेम्स

स्टैक वर्तमान फ़ंक्शन कॉल की एक सूची है - यह आपको दिखाता है कि आप कार्यक्रम में कहां हैं। एक फ़्रेम एकल फ़ंक्शन कॉल का विवरण संग्रहीत करता है, जैसे कि तर्क।

  • बीटी

    • Backtracesया वर्तमान फ़ंक्शन स्टैक को यह दिखाने के लिए प्रिंट करता है कि आप वर्तमान प्रोग्राम में कहां हैं। यदि मुख्य कॉल फंक्शन (), जिसे बी कहते हैं (), जिसे सी कहते हैं (), बैकट्रेस है

  • c <= current location 
    b 
    a 
    main
  • up

  • नीचे

    • फ़ंक्शन स्टैक में ऊपर या नीचे अगले फ्रेम पर जाएं। अगर आप अंदर हैंc, आप आगे बढ़ सकते हैं b या a स्थानीय चरों की जांच करना।

  • वापसी

    • वर्तमान फ़ंक्शन से लौटता है।

सिग्नल संभालना

सिग्नल कुछ घटनाओं के बाद फेंके जाने वाले संदेश हैं, जैसे टाइमर या त्रुटि। जब यह एक संकेत का सामना करता है तो GDB विराम दे सकता है; आप इसके बजाय उन्हें अनदेखा करना चाह सकते हैं।

  • संभाल [सिग्नलनाम] [क्रिया]

  • SIGUSR1 नॉस्टॉप संभालें

  • SIGUSR1 noprint को संभालें

  • SIGUSR1 को अनदेखा करें

    • GDB को एक निश्चित संकेत (SIGUSR1) को अनदेखा करने का निर्देश दें। अनदेखी के अलग-अलग स्तर हैं।

किसी प्रोग्राम को डीबग करने की प्रक्रिया को समझने के लिए निम्नलिखित उदाहरणों के माध्यम से जाएं और डंप किया गया कोर।

  • डिबगिंग उदाहरण 1

    यह उदाहरण दर्शाता है कि आप एक त्रुटि को कैसे पकड़ेंगे जो शून्य से विभाजित करते समय उठाए गए अपवाद के कारण हो रहा है।

  • डिबगिंग उदाहरण 2

    यह उदाहरण एक प्रोग्राम को प्रदर्शित करता है जो गैर-प्रारंभिक मेमोरी के कारण कोर को डंप कर सकता है।

दोनों कार्यक्रम C ++ में लिखे गए हैं और विभिन्न कारणों से कोर डंप उत्पन्न करते हैं। इन दो उदाहरणों के माध्यम से जाने के बाद, आपको अपने सी या सी ++ प्रोग्राम को डीबग करने की स्थिति में होना चाहिए।

इस ट्यूटोरियल के माध्यम से जाने के बाद, आपको GNU डीबगर का उपयोग करके C या C ++ प्रोग्राम डिबग करने की अच्छी समझ प्राप्त हुई होगी। अब आपके लिए अन्य डीबगर्स की कार्यक्षमता सीखना बहुत आसान होना चाहिए क्योंकि वे जीडीबी के बहुत समान हैं। यह अत्यधिक अनुशंसा की जाती है कि आप अन्य डीबगर्स से गुजरें और साथ ही उनकी विशेषताओं से परिचित हों।

बाजार में कुछ अच्छे डिबगर्स उपलब्ध हैं:

  • DBX Debugger- यह डीबगर जहाज सन सोलारिस के साथ है और आप डीबीएक्स के मैन पेज यानी मैन डीबीएक्स का उपयोग करके इस डीबगर के बारे में पूरी जानकारी प्राप्त कर सकते हैं ।

  • DDD Debugger- यह dbx का एक चित्रमय संस्करण है और लिनक्स पर स्वतंत्र रूप से उपलब्ध है। पूर्ण विवरण के लिए, डीडी के मैन पेज का उपयोग करें, अर्थात, मैन डीडीडी

आप निम्न लिंक से GNU डीबगर के बारे में एक विस्तृत विवरण प्राप्त कर सकते हैं: GDB के साथ डिबगिंग