अतिरिक्त सहायता के लिए नालागोडझेन्या जीडीबी। Vyvchaemo vykoristani GDB के साथ बच्चे की प्रक्रिया को कम करना

जी.डी.बी."उचित" कार्यक्रमों तक पहुंचें, जैसे कि वे जो कोड को "समझते" हैं और इसे एक पंक्ति में खोलते हैं, परिवर्तनों के मूल्यों को बदलते हैं, नियंत्रण बिंदु निर्धारित करते हैं और विचार-मंथन करते हैं... एक शब्द में, सब कुछ क्रम में करें डेवलपर को और जांचें कि आपके प्रोग्राम सही ढंग से चल रहे हैं।

जी.डी.बी.समृद्ध यादें यूनिक्स-ऐसे सिस्टम कई प्रोग्रामों की फ़ाइन-ट्यूनिंग भी करते हैं। सी उनमें से है.

संपर्क करें जी.डी.बी.टर्मिनल पर कमांड दर्ज करें

जी.डी.बी

लॉग इन करने के लिए जी.डी.बी.: कमांड दर्ज करें

छोड़ें या सी-डी

अन्य महत्वपूर्ण GDB कमांड

चलाएँ [प्रोग्राम कमांड लाइन तर्क] प्रोग्राम चलाएँ। ब्रेक [पंक्ति संख्या / फ़ंक्शन नाम] अगली पंक्ति या फ़ंक्शन पर प्रोग्राम ब्रेक पॉइंट रखें। अगला, फ़ंक्शन के बीच में गए बिना आक्रामक पंक्ति पर जाएं। स्टेप स्टेपिंग पंक्ति पर जाएँ। यदि पंक्ति में कोई फ़ंक्शन है, तो उस पर जाएँ। सूची प्रोग्राम कोड का एक टुकड़ा दर्ज करें (उस स्थान के चारों ओर कई पंक्तियाँ जहां एक बिंदु डाला गया है) प्रिंट करें [परिवर्तन] स्क्रीन पर परिवर्तन का मूल्य दर्ज करें। जानकारी स्थानीय लूप, फ़ंक्शन आदि के मध्य में सभी स्थानीय परिवर्तनों के सटीक मान दर्ज करें। प्रदर्शन [परिवर्तन] त्वचा की त्वचा पर परिवर्तन का मूल्य दर्ज करें। मदद सभी मौजूदा GDB कमांड की सूची दिखाएं।

आइए सीज़र.सी एप्लिकेशन पर जीडीबी के साथ कैसे काम करें, इस पर आश्चर्य करें, जैसा कि आप, जिन्होंने हर चीज के लिए सब कुछ किया है, पिछले साल ही लिख चुके हैं। हम इसे पुराने संस्करण पर जांचेंगे, इसलिए कार्यान्वयन के आधार पर आपके परिणाम भिन्न हो सकते हैं।

अब, आइए "CS50 वर्चुअल लेबोरेटरी" या CS50 IDE में pset2 फ़ोल्डर पर जाएं (हमें लगता है कि आपको पहले से ही याद है कि इसे कैसे प्राप्त करें)। आदेश दर्ज करें:

जी.डी.बी. /सीज़र

सीज़र प्रोग्राम का एक कार्य है, मुख्य। आइए प्रोग्राम के शुरुआती बिंदु को मुख्य फ़ंक्शन पर सेट करें:

मुख्य तोड़ो

आइए सीज़र प्रोग्राम को तर्क "3" के साथ चलाएं:

भागो 13

मान लीजिए कि हमें argc के मानों की जाँच करने की आवश्यकता है:

Argc प्रिंट करें

अक्ष को टर्मिनल विंडो पर देखा जा सकता है:

अब हम अगले कमांड का उपयोग करके प्रोग्राम को चरण दर चरण पूरा करते हैं। हम कुछ बार देख सकते हैं.

यहां परिवर्तनशील कुंजी अर्थ देती है। आइए देखें कि इस पंक्ति में इसका क्या महत्व है:

पहले क्लिक पर, परिवर्तनीय कुंजी "0" पर सेट हो जाती है। ऐसा क्यों है कि हम संख्या 3 से चूक गए? दाईं ओर यह है कि टीम ने अभी तक विकोनान में प्रवेश नहीं किया है। यदि आप अगली बार और दर्ज करते हैं, तो प्रोग्राम आपको पाठ दर्ज करने के लिए संकेत देता है।

एक बार फिर अगला कमांड दर्ज करने के बाद, हम मानसिक लूप के मध्य में जाएंगे।

कार्यक्रमों का मेटा सुधार - कोड से संशोधन हटाना। आपको, जो सब कुछ जानते हैं, प्रसिद्ध लोगों के शिविर का पता लगाने का अवसर क्यों मिलता है? विकोनैनी का घंटा, यह स्वयं अनुभूति की प्रक्रिया के समान है (उदाहरण के लिए, मानसिक परिवर्तन करना)। यहां नेता हमारा पहला सहायक होता है. बेशक, सी में बिना किसी परेशानी के प्रोग्राम चलाने की बहुत सारी संभावनाएं हैं: एक साधारण प्रिंटफ(3) से लेकर सिसलॉग नेटवर्क पर विशेष लॉगिंग सिस्टम तक। असेंबलर में, ऐसे तरीके अभी भी स्थिर हैं, अन्यथा आपको रजिस्टरों, रैम डंप और अन्य भाषणों के बारे में सावधान रहने की आवश्यकता हो सकती है, जिन्हें एक इंटरैक्टिव संपादक में विकसित करना बहुत आसान है। वैसे, यदि आप असेंबली भाषा में लिखते हैं, तो संपादक के बिना आपका काम चलने की संभावना नहीं है।

आप एक ब्रेकप्वाइंट निर्धारित करके शुरुआत कर सकते हैं, क्योंकि आप पहले से ही जानते हैं कि आपको कोड के किस भाग का पालन करना है। यह सबसे अधिक उपयोग की जाने वाली विधि है: एक बिंदु निर्धारित करें, प्रोग्राम लॉन्च करें और चरण दर चरण आगे बढ़ें, साथ ही आवश्यक परिवर्तनों और रजिस्टरों पर नज़र रखें। आप प्रोग्राम को सर्वोत्तम परिस्थितियों में भी चला सकते हैं और यदि यह विभाजन दोष के कारण क्रैश हो जाता है - तो आप यह पता लगा सकते हैं कि कौन सा निर्देश मेमोरी तक पहुंच को अस्वीकार करने के लिए है, फिर परिवर्तन को देखें, और इसी तरह। अब आप इस कोड का फिर से अनुसरण कर सकते हैं, इसे चरण दर चरण पढ़ सकते हैं, विफलता के क्षण से थोड़ा पहले एक बिंदु लगा सकते हैं।

आइए इसे सरल बनाएं. आइए हेलो वर्ल्ड प्रोग्राम लें और इसे कंपाइलर स्विच -जी का उपयोग करके आवश्यक जानकारी के साथ संकलित करें:

$ जीसीसी -जी हैलो.एस -ओ हैलो $

जीडीबी लॉन्च करें:

$ जीडीबी ./हैलो जीएनयू जीडीबी 6.4.90-डेबियन कॉपीराइट (सी) 2006 फ्री सॉफ्टवेयर फाउंडेशन, इंक. जीडीबी मुफ़्त सॉफ़्टवेयर है जिसे जीएनयू जनरल पब्लिक लाइसेंस के तहत लाइसेंस प्राप्त है, और आप इसे बदलने और/या इसकी प्रतियां अन्य लोगों को वितरित करने का इरादा रखते हैं। शर्तें देखने के लिए "कॉपी दिखाएँ" टाइप करें। यह जीडीबी के लिए बिल्कुल भी वारंटी नहीं है। विवरण के लिए "वारंटी दिखाएं" टाइप करें। इस GDB को "i486-linux-gnu" के रूप में कॉन्फ़िगर किया गया है...होस्ट libthread_db लाइब्रेरी "/lib/tls/libthread_db.so.1" का उपयोग करके। (जीडीबी)

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

(जीडीबी) बी मुख्य ब्रेकप्वाइंट 1 0x8048324 पर: फ़ाइल हेलो.एस, लाइन 17। (जीडीबी)

बी - अल्पावधि ब्रेक. सभी जीडीबी कमांड को छोटा किया जा सकता है क्योंकि वे दोहरे मूल्य वाले डिक्रिप्शन नहीं बनाते हैं। हम प्रोग्राम को रन कमांड के साथ लॉन्च करते हैं। इस कमांड का उपयोग पहले से चल रहे प्रोग्राम को पुनः आरंभ करने के लिए किया जाता है।

(जीडीबी) आर प्रोग्राम प्रारंभ करें: /tmp/hello ब्रेकप्वाइंट 1, मुख्य () hello.s पर:17 17 movl $4, %eax /* सिस्टम नंबर डालें लिखें = 4 वर्तमान भाषा: ऑटो; वर्तमान में एएसएम (जीडीबी)

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

(gdb) n 20 movl $1, %ebx /* पहला पैरामीटर - %ebx */ (gdb) रजिस्टर करने के लिए

अब, पंक्ति 17 के लिए निर्देश लिखे गए हैं, और हम समझते हैं कि %eax रजिस्टर में संख्या 4 है। स्क्रीन पर विभिन्न वायरस प्रदर्शित करने के लिए, प्रिंट कमांड (संक्षिप्त रूप में पी) का उपयोग करें। असेंबलर कमांड को प्रतिस्थापित करते समय, GDB के पास रजिस्टर प्रविष्टि में $replace % चिह्न होता है। आइये देखें %eax रजिस्ट्री में क्या है:

(जीडीबी) पी $ईएक्स $1 = 4 (जीडीबी)

क्रिया 4! GDB सभी अभिव्यक्ति आउटपुट को क्रमांकित करता है। अब हमारे पास पहला वायरस ($1) है, जो 4 से भी पुराना है। अब इस वायरस तक आप इनके लिए आवेदन कर सकते हैं। आप सरल गणनाएँ भी कर सकते हैं:

(जीडीबी) पी $1 $2 = 4 (जीडीबी) पी $1 + 10 $3 = 14 (जीडीबी) पी 0x10 + 0x1एफ $4 = 47 (जीडीबी)

जब हम प्रिंट कमांड के साथ खेल रहे थे, हम पहले ही भूल गए थे कि निर्देश कैसे समाप्त होता है। इन्फो लाइन कमांड कोड की लाइन में निर्देशों के बारे में जानकारी प्रदर्शित करता है। बिना तर्क के, उत्पादन लाइन के बारे में जानकारी प्रदर्शित करें।

(जीडीबी) जानकारी पंक्ति "हैलो.एस" की पंक्ति 20, पते 0x8048329 से शुरू होती है और 0x804832e पर समाप्त होता है . (जीडीबी)

सूची कमांड (संक्षिप्त रूप में एल) आपके प्रोग्राम का आउटपुट कोड स्क्रीन पर प्रदर्शित करता है। तर्क कैसे पारित किये जा सकते हैं:

  • पंक्ति नंबर- प्रवाह फ़ाइल की पंक्ति संख्या;
  • फ़ाइल: row_number- निर्दिष्ट फ़ाइल के लिए पंक्ति संख्या;
  • उनके_कार्य- उनके पास बिना किसी अस्पष्टता के कार्य हैं;
  • फ़ाइल: function_name- निर्दिष्ट फ़ाइल के लिए फ़ंक्शन हैं;
  • *पते- स्मृति में पते, उसके बाद आवश्यक निर्देश।

यदि आप एक तर्क पारित करते हैं, तो सूची कमांड एक ही स्थान पर आउटपुट कोड की 10 पंक्तियाँ उत्पन्न करता है। दो तर्क पारित करके, आप शुरुआत में पंक्ति और सूची के अंत में पंक्ति निर्दिष्ट करते हैं।

(जीडीबी) एल मुख्य 12 इस फ़ाइल की सीमाओं के पीछे */ 13 .प्रकार मुख्य, @फ़ंक्शन /* मुख्य - फ़ंक्शन (डेटा नहीं) */ 14 15 16 मुख्य: 17 movl $4, %eax /* की संख्या डालें सिस्टम कॉल 18 लिखें = 4 रजिस्टर में %eax */ 19 20 movl $1, %ebx /* रजिस्टर 21 %ebx में पहला पैरामीटर रखें; फ़ाइल डिस्क्रिप्टर संख्या 22 stdout = 1 */ (gdb) l *$eip 0x8048329 hello.s:20 पर है। 15 16 मुख्य: 17 movl $4, %eax /* सिस्टम कॉल नंबर 18 लिखें = 4 को रजिस्टर में रखें %eax */ 19 20 20 movl $1, %ebx /* रजिस्टर 21 %ebx में पहला पैरामीटर रखें; फ़ाइल डिस्क्रिप्टर नंबर 22 stdout = 1 */ 23 movl $hello_str, %ecx /* रजिस्टर 24 %ecx में एक और पैरामीटर रखें; प्रति पंक्ति सूचक */ (जीडीबी) एल 20, 25 20 movl $1, %ebx /* रजिस्टर 21 %ebx में पहला पैरामीटर रखें; फ़ाइल डिस्क्रिप्टर नंबर 22 stdout = 1 */ 23 movl $hello_str, %ecx /* रजिस्टर 24 %ecx में एक और पैरामीटर रखें; प्रति पंक्ति सूचक */25 (जीडीबी)

इस आदेश को याद रखें: सूची $eip. इसकी सहायता से आप बाद में एक ही बार में लिखे गए निर्देशों के आगे आउटपुट कोड को देख सकते हैं। आइए अपने कार्यक्रम को अंतिम रूप दें:

(gdb) n 23 movl $hello_str, %ecx /* रजिस्टर %ecx में एक और पैरामीटर रखें (gdb) n 26 movl $hello_str_length, %edx /* रजिस्टर %edx (gdb) में तीसरा पैरामीटर रखें

यह सच नहीं है, मैं धक्का देकर थक गया हूँ? यदि आप बस Enter दबाते हैं, तो GDB शेष कमांड दोहराएगा:

(जीडीबी) 29 पूर्णांक $0x80 /* विक्लिकति पेरेरीवन्न्या 0x80 */ (जीडीबी) नमस्कार, विश्व! 31 movl $1, %eax /* सिस्टम विकी नंबर निकास = 1 */ (gdb)

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

(जीडीबी) जानकारी रजिस्टर eax 0xe 14 ecx 0x804955c 134518108 edx 0xe 14 ebx 0x1 1 esp 0xbfabb55c 0xbfabb55c ebp 0xbfabb5a8 0xb0 1208566592 eip 0x804833a 0x80 4 833ए ईफ्लैग्स 0x246 [पीएफ जेडएफ आईएफ] सीएस 0x73 115 एसएस 0x7बी 123 डीएस 0x7बी 123 ईएस 0x7बी 123 एफएस 0x0 0 जीएस 0x33 51 (जीडीबी) जानकारी रजिस्टर 0xe 14 ecx 0x804955c 134518108 edx 0x ई 14 ebx 0x1 1 esp 0xbfabb55c 0xbfabb55c ebp 0xbfabb5a8 0xbfabb5a8 esi 0x0 0 edi 0xb7f6bcc0 -1208566592 eip 0x804833a 0x804 ईफ्लैग्स 0x246 [पीएफ जेडएफ आईएफ] (जीडीबी)

तो, रजिस्टरों के अलावा, हमारे पास भी है

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

शायद आप सभी ने रिपेयरमैन, जीडीबी जैसे भाषण के बारे में सुना होगा - यह फिक्सर के समान ही है। जीडीबी-जीएनयू
डिबगर. यह विंडोज़ के लिए SoftICE के समान है (उन लोगों के लिए जो नहीं जानते, यह सबसे लोकप्रिय है और, मेरी राय में, सबसे उपयोगी बन गया है), केवल इसके अंतर्गत
लिनक्स सिस्टम. दाईं ओर, इस भाषण के कार्य को प्रदर्शित करने के लिए इतने सारे दस्तावेज़ नहीं हैं और मैंने स्वयं इसमें महारत हासिल की है। ओत्जे,
दस्तावेज़ मूल gdb कमांड का वर्णन करेगा। सब कुछ उदाहरण पर दिखाया जाएगा. और अंतत: मैंने कार्यक्रम को हां में लेने का निर्णय लिया। जो लोग नहीं जानते हैं, उनके लिए यह प्रोग्राम केवल 'y' प्रतीक को तब तक प्रिंट करता है जब तक कि यह अंतहीन न हो जाए, इसलिए मैंने यह सीखने का फैसला किया कि इस प्रतीक को नहीं, बल्कि पंक्ति 'XAKEP' को कैसे प्रिंट किया जाए, जो अधिक मजेदार होगा।

खैर, अब सब कुछ क्रम में है। संपादक स्वयं इस प्रकार प्रारंभ होता है:

यदि आप विभिन्न पैरामीटर दर्ज कर सकते हैं, तो हमारे पास प्रोग्राम का अनुसरण करने का एक तरीका होगा:

# gdb /usr/bin/हाँ

आप मुख्य फ़ाइलें देख सकते हैं, जिसके लिए आपको निम्नलिखित दर्ज करना होगा:

# gdb /usr/bin/yes कोर

आपको इसके बजाय रजिस्टरों को देखने के लिए एक कमांड की भी आवश्यकता हो सकती है:

(जीडीबी) जानकारी रजिस्टर

या तो (लघु संस्करण)

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

(जीडीबी) ब्रेक फ़ंक्शन - फ़ंक्शन में प्रवेश करने से पहले जुपिनिटी
(जीडीबी) ब्रेक *एड्रेस - पते पर निर्देशों का पालन करने से पहले सबमिट करें।

इंस्टालेशन के बाद, आप सभी बिंदुओं को देख सकते हैं, जिसके लिए कमांड का उपयोग करें:

(जीडीबी) जानकारी विराम

और फिर आप इन बिंदुओं को हटा सकते हैं:

(जीडीबी) स्पष्ट ब्रेकपॉइंट - डी ब्रेक ब्रेक पॉइंट का नाम है
(उदाहरण के लिए, फ़ंक्शन या पता)

एक अन्य महत्वपूर्ण विशेषता प्रोग्राम समाप्त होने पर विभिन्न मानों को स्वचालित रूप से प्रदर्शित करने की क्षमता है। डिस्प्ले कमांड का उद्देश्य क्या है:

(जीडीबी) डिस्प्ले/प्रारूप मूल्य, जहां प्रारूप प्रदर्शन का प्रारूप है, और मूल्य वह प्रारूप है जिसे प्रदर्शित करने की आवश्यकता है।

छवियों के साथ काम करने के लिए निम्नलिखित आदेश दिए गए हैं:

(जीडीबी) जानकारी डिस्प्ले - डिस्प्ले के बारे में जानकारी प्रदर्शित करता है
(जीडीबी) संख्या हटाएं - संख्या हटाएं - सूचकांक के साथ तत्व हटाएं
संख्या

यह मुख्य विचार को समझने के लिए टीमों की ओर से एक छोटी सी मार्गदर्शिका होगी।
आगे बट पर मैं थोड़ा और प्रदर्शित करना चाहूँगा। और याद रखें - यहां मैंने जीडीबी की सभी संभावनाओं का केवल एक छोटा सा हिस्सा दिया है, वास्तव में उनमें से सैकड़ों गुना अधिक हैं, इसलिए पढ़ें और शुरू करें।
जैसा कि मुझे पता है, हमें हाँ कार्यक्रम की आवश्यकता नहीं होगी। आपकी कार का रास्ता मेरे साथ टाला नहीं जा सकता है, सब कुछ उस ऑपरेटिंग सिस्टम में होगा जिसका आप उपयोग कर रहे हैं, यदि आप खोज (कमांड) द्वारा गति बढ़ाते हैं
खोजो)।

# gdb /usr/bin/हाँ

लॉन्च के बाद आपको विस्तृत जानकारी मिलेगी.

जीएनयू जीडीबी 19991004




यह जीडीबी के लिए बिल्कुल भी वारंटी नहीं है। विवरण के लिए "वारंटी दिखाएं" टाइप करें।
Tsei GDB buv को "i386-redhat-linux" की तरह संशोधित किया गया...
(कोई डिबगिंग प्रतीक नहीं मिला)...

चूँकि हाँ, हम अनंत संख्या में प्रतीक प्रदर्शित कर सकते हैं, बेहतर होगा कि हम उन्हें संपादक से डाउनलोड न करें, लेकिन फिर से
प्रोग्रामों को दूसरे कंसोल पर निर्देशित किया जा सकता है। एक नया टर्मिनल खोलें, who is i टाइप करें और कंसोल नाम खोलें। बाहर निकलना आपकी गलती है
आइए चित्र देखें:

धुरी अब बस इससे जुड़ी हुई है।

(जीडीबी) ट्टी /देव/पीटीएस/1

और अब आइए पुट() फ़ंक्शन पर एक बिंदु डालें, और आपके लिए फ़ंक्शन के बारे में मैन-जानकारी को समझना आसान बनाएं (मैन कमांड)
डालता है)

#शामिल करना
int डालता है (const char * s);
पुट () स्ट्रिंग एस लिखता है और एसटीडी के लिए नई पंक्ति का अनुसरण करता है
बाहर।

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

(जीडीबी) ब्रेक पुट
0x8048698 पर ब्रेकप्वाइंट 1

І प्रोग्राम को स्वयं लॉन्च करें, ताकि आप जीडीबी डॉक की जांच कर सकें और फ़ंक्शंस पर क्लिक करना न भूलें।

(जीडीबी)आर
आरंभिक कार्यक्रम: /usr/bin/yes
0x4006d585 पर ब्रेकप्वाइंट 1: फ़ाइल ioputs.c, पंक्ति 32।

ब्रेकपॉइंट 1, 0x4006d585 _IO_puts में (str=0x8048e59 "y") ioputs.c:32 पर
32 ioputs.c: ऐसी कोई फ़ाइल या निर्देशिका नहीं।
1: x/i $eip 0x4006d585<_IO_puts+21>: mov 0x8(%ebp),%esi

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

(जीडीबी) सेट (चार)0x8048e59='एक्स'
(जीडीबी) सेट (char)0x8048e5a='ए'
(जीडीबी) सेट (char)0x8048e5b='K'
(जीडीबी) सेट (char)0x8048e5c='E'
(जीडीबी) सेट (चार)0x8048e5d='पी'

खैर, अब आइए हमारे विटविर पर आश्चर्य करें। स्मृति में क्या छिपा है:

(जीडीबी) x/3sw 0x8048e59
0x8048e59<_IO_stdin_used+437>: "XAKEP\004\b"
0x8048e61<_IO_stdin_used+445>: ""
0x8048e62<_IO_stdin_used+446>: ""

अब हम अपना ब्रेकप्वाइंट देख सकते हैं:

(जीडीबी) जानकारी विराम
संख्या प्रकार डिस्प एनबी पता क्या
1 ब्रेकप्वाइंट y 0x4006d585 को ioputs.c:32 पर _IO_puts में रखें
ब्रेकप्वाइंट पहले ही 1 बार हिट हो चुका है
(जीडीबी) स्पष्ट रखता है
हटाया गया ब्रेकप्वाइंट 1

मैं परिणाम का आनंद लेने के लिए विकनी जारी रखता हूं:

बस इतना ही। जाहिरा तौर पर।

(जीडीबी)क्यू
प्रोग्राम चल रहा है. फिर भी बाहर निकलें? (y या n)y

जब अभ्यास समाप्त हो जाए, तो स्वयं निर्णय लें और याद रखें कि आपके जीवन में समस्या ही सब कुछ है।
रोबोट की धुरी हैं:

इस प्रक्रिया से पहले पावती:

// जीडीबी लॉन्च करें
हैक@शोषण:~ > जीडीबी
जीएनयू जीडीबी 4.18
कॉपीराइट 1998 फ्री सॉफ्टवेयर फाउंडेशन, इंक.
जीडीबी मुफ़्त सॉफ़्टवेयर है, जो जीएनयू जनरल पब्लिक लाइसेंस के अधीन है, और
कुछ शर्तों के तहत इसे बदलने और/या इसकी प्रतियां वितरित करने के लिए आपका स्वागत है।
शर्तें देखने के लिए "कॉपी दिखाएँ" टाइप करें।
यह जीडीबी के लिए बिल्कुल भी वारंटी नहीं है। इसके लिए "शो वारंटी" टाइप करें
विवरण।
Qia GDB को "i386-suse-linux" के रूप में कॉन्फ़िगर किया गया था।
(जीडीबी) "पिड" संलग्न करें
(जीडीबी) 1127 // उदाहरण संलग्न करें

स्मृति खोजें:

(जीडीबी) एक्स/डी या एक्स "पता" दशमलव दिखाता है
(जीडीबी) x/100s "पता" अगले 100 दशमलव दिखाता है
(जीडीबी) x 0x0804846c 0x0804846c पर दशमलव दिखाएं
(जीडीबी) एक्स/एस "पता" पते पर स्ट्रिंग दिखाता है
(जीडीबी) x/105 0x0804846सी 0x0804846सी पर 105 स्ट्रिंग्स दिखाता है
(जीडीबी) x/x "पता" हेक्साडेसिमल पता दिखाता है
(जीडीबी) x/10x 0x0804846सी 0x0804846सी पर 10 पते दिखाता है
(जीडीबी) एक्स/बी 0x0804846सी
(जीडीबी) x/10b 0x0804846c-10 0x0804846c-10 पर बाइट दिखाएं
(जीडीबी) x/10b 0x0804846c+20 0x0804846c+20 पर बाइट दिखाएं
(जीडीबी) x/20i 0x0804846c पते पर 20 असेंबलर निर्देश दिखाएं

संकलित फ़ाइल में सभी अनुभागों की सूची:

(जीडीबी) रखरखाव जानकारी अनुभाग // या
(जीडीबी) माई आई एस

निष्पादनीय फाइल:
`/home/hack/homepage/challenge/buf/basic", फ़ाइल प्रकार
योगिनी32-i386.
0x080480f4->0x08048107 0x000000f4 पर: .interp ALLOC

0x08048108->0x08048128 0x00000108 पर: .note.ABI-टैग
एलोक लोड रीड ओनली डेटा में_सामग्री है
0x08048128->0x08048158 0x00000128 पर: .हैश ALLOC
केवल पढ़ने के लिए डेटा में सामग्री लोड करें
0x08048158->0x080481c8 0x00000158 पर: .dynsym ALLOC
केवल पढ़ने के लिए डेटा में सामग्री लोड करें
0x080481c8->0x08048242 0x000001c8 पर: .dynstr ALLOC
केवल पढ़ने के लिए डेटा में सामग्री लोड करें
0x08048242->0x08048250 0x00000242 पर: .gnu.version
केवल पढ़ने के लिए डेटा आवंटित करें
इसमें_सामग्री है

पते पर श्ल्युब:

(जीडीबी) मुख्य को अलग करें
फ़ंक्शन मुख्य के लिए असेंबलर कोड का डंप:
0x8048400

: पुश %ebp
0x8048401 : mov %esp,%ebp
0x8048403 : उप $0x408,%esp
0x8048409 : $0xffffff8,%esp जोड़ें
0x804840c : mov 0xc(%ebp),%eax
0x804840f : $0x4,%eax जोड़ें
0x8048412 : mov (%eax),%edx
0x8048414 : पुश %edx
0x8048415 : lea 0xfffffc00(%ebp),%eax
...

(जीडीबी) ब्रेक *0x8048414 // उदाहरण
0x8048414 पर ब्रेकप्वाइंट 1
(जीडीबी) ब्रेक मेन // उदाहरण
0x8048409 पर ब्रेकप्वाइंट 2
(जीडीबी)

जीएनयू डिबगर जीएनयू प्रोजेक्ट के लिए एक पोर्टेबल टूल है जो कई यूनिक्स-जैसे सिस्टम पर चलता है और सी, सी++, एडा और फोरट्रान सहित सॉफ्टवेयर प्रोग्रामों की एक विस्तृत श्रृंखला चलाता है। जीएनयू डिबगर एक सॉफ्टवेयर प्रोग्राम है जिसे जीएनयू जनरल पब्लिक लाइसेंस के तहत लाइसेंस प्राप्त है।

1988 में रिचर्ड स्टॉलमैन द्वारा लिखित जीएनयू डिबगर पर आधारित। यह DBX संपादक पर आधारित था जो BSD वितरण के साथ आया था। 1990 से 1993 तक धमाल मचाया। सिग्नस सॉल्यूशंस में अपने शुरुआती करियर के दौरान इस परियोजना का नेतृत्व जॉन गिलमोर ने किया था। विकास का समन्वय वर्तमान में फ्री सॉफ्टवेयर फाउंडेशन की सहयोगी कंपनी जीडीबी संचालन समिति द्वारा किया जा रहा है।

जीएनयू डिबगर का तकनीकी विवरण

  • विशेषताएँ

जीएनयू डिबगर कंप्यूटर में सॉफ्टवेयर प्रोग्राम के नियंत्रण के लिए बेहतरीन सुविधाएँ प्रदान करता है। उपयोगकर्ता मूल प्रोग्राम व्यवहार से स्वतंत्र रूप से आंतरिक प्रोग्राम और कॉल फ़ंक्शंस को बदल सकते हैं। GNU डिबगर a.out, COFF प्रारूप (Windows स्वरूपित फ़ाइलों सहित), ECOFF, XCOFF, ELF, SOM में संपीड़ित फ़ाइलों का विश्लेषण कर सकता है और स्टैब, COFF, ECOFF, DWARF, DWARF2 प्रारूपों से उपयोगी जानकारी निकाल सकता है। DWARF2 प्रारूप सुधार की सबसे बड़ी संभावना प्रदान करता है।

जीएनयू डिबगर सक्रिय रूप से विकसित किया गया है। उदाहरण के लिए, संस्करण 7.0 में एक "परिक्रामी क्रेडिट" सुविधा जोड़ी गई है, जो आपको डिकंस्ट्रक्शन की प्रक्रिया को देखने की अनुमति देती है कि क्या हुआ। इसके अलावा संस्करण 7.0 में स्क्रिप्टिंग के लिए अतिरिक्त समर्थन जोड़ा गया था।

जीएनयू डिबगर के साथ काम करने के लिए, अन्य विकास उपकरण बनाए गए, उदाहरण के लिए, मेमोरी सेंसर।

  • नई प्रणालियों के लिए मल्टीप्लेटफ़ॉर्म और समर्थन

जीएनयू डिबगर को कई प्लेटफार्मों के लिए कार्यक्रमों का समर्थन करने और एक चालू सत्र के दौरान उनके बीच कूदने के लिए संकलित किया जा सकता है। जीएनयू डिबगर (2003) द्वारा समर्थित प्रोसेसर: अल्फा, एआरएम, एच8/300, सिस्टम/370, सिस्टम/390, x86 और x86-64, आईए-64 (इटेनियम), मोटोरोला 68000, एमआईपीएस, पीए-आरआईएससी, पावरपीसी, सुपरएच , SPARC, VAX, A29K, ARC, AVR, CRIS, D10V, D30V, FR-30, FR-V, Intel i960, M32R, 68HC11, Motorola 88000, MCORE, MN10200, MN10300, NS32K, NS32K। (उनमें से किसी का भी समर्थन करने वाली अब कोई नई रिलीज़ नहीं होगी।) सभी प्लेटफ़ॉर्म जिन पर जीएनयू डिबगर नहीं चल सकता है, जब तक कि सिस्टम स्थापित है, एक अंतर्निहित सिम्युलेटर (एआरएम, एवीआर प्रोसेसर) के उपयोग का समर्थन कर सकते हैं, या उनके लिए ऐड की को रिटेलर के कंप्यूटर पर चलने वाले जीएनयू डिबगर के तहत उत्कृष्ट प्रदर्शन सुनिश्चित करने के लिए विशेष उपप्रोग्राम के साथ संकलित किया जा सकता है। सुधार के लिए इनपुट फ़ाइल, एक नियम के रूप में, फ्लैश की जा रही डबल फ़ाइल नहीं है, बल्कि एक प्रारूप में एक फ़ाइल है जो उपयोगी जानकारी, विशेष रूप से ईएलएफ का समर्थन करती है, जिसमें से दो को फर्मवेयर के लिए विशेष उपयोगिता कोड की मदद से जोड़ा जाता है।

  • आस-पास

जब दूरस्थ रूप से कॉन्फ़िगर किया जाता है, तो GNU डिबगर एक मशीन पर चलता है, और संशोधित किया जा रहा प्रोग्राम दूसरी मशीन पर चलता है। सीरियल पोर्ट या टीसीपी/आईपी के माध्यम से एक विशेष प्रोटोकॉल का उपयोग करके संचार किया जाता है। डिबगर के साथ इंटरैक्शन के लिए प्रोटोकॉल जीएनयू डिबगर के लिए विशिष्ट है, और आवश्यक उपप्रोग्राम के आउटपुट कोड डिबगर अभिलेखागार में शामिल हैं। एक विकल्प के रूप में, लक्ष्य प्लेटफ़ॉर्म gdbserver प्रोग्राम चला सकता है, जो GNU डिबगर पैकेज के समान प्रोटोकॉल का उपयोग करता है, जो इंस्टॉलेशन बिंदु और रजिस्ट्रियों और यादों तक पहुंच के लिए निम्न-स्तरीय फ़ंक्शन प्रदान करता है। यति।

यह मोड अंतर्निहित Linux KGDB कर्नेल सुविधाओं के साथ इंटरैक्ट करने के लिए डिज़ाइन किया गया है। इसकी सहायता से, डेवलपर कर्नेल को प्राथमिक प्रोग्राम के रूप में अनुकूलित कर सकता है: मेमोरी पॉइंट स्थापित करें, विकी कोड के माध्यम से काम करें, और परिवर्तनों की समीक्षा करें। एप्लिकेशन मैनेजर में ईथरनेट या एक सीरियल केबल के माध्यम से जुड़ी दो मशीनें होती हैं, एक जीएनयू डिबगर चलाती है, और दूसरी विकसित की जा रही कर्नेल चलाती है।

  • कोरिस्टुवलनित्सकी इंटरफ़ेस

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

DDD, cgdb, GDBtk/Insight और GUD मोड जैसे इंटरफेस बनाए गए थे। निम्नलिखित IDE GNU डिबगर के साथ इंटरैक्ट कर सकते हैं:

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

उपयोगी जानकारी उत्पन्न करने का अनुरोध करने के लिए, कंपाइलर शुरू करते समय `-g' स्विच दर्ज करें।

अधिकांश C कंपाइलर एक ही समय में `-g" और `-O" स्विच को संसाधित नहीं कर सकते हैं। ऐसे कंपाइलरों के साथ, आप बहुमूल्य जानकारी रखने के लिए अनुकूलित फ़ाइलें नहीं बना सकते हैं।

GCC, GNU C कंपाइलर, अनुकूलित कोड को बेहतर बनाने के लिए `-g" को `-O" के साथ या उसके बिना प्रोत्साहित करता है। हम अनुशंसा करते हैं कि आप सबसे पहलेआपने प्रोग्राम संकलित करते समय `-g' का उपयोग किया है। आप सोच सकते हैं कि आपका प्रोग्राम सही है, लेकिन सफलता की कोई भावना नहीं है।

यदि आप अपना प्रोग्राम किसी विंडो के मध्य में चलाते हैं जो प्रक्रियाओं का समर्थन करता है, तो रन एक हल्की प्रक्रिया बनाता है, और वह प्रक्रिया आपके प्रोग्राम को समाप्त कर देती है। (उन प्रणालियों के लिए जो प्रक्रियाओं का समर्थन नहीं करते हैं, रन आपके प्रोग्राम की शुरुआत में जाएगा।)

विकोनैनी कार्यक्रम सूचना के रूप में होते हैं, जो उन्हें उत्पन्न करने वाली प्रक्रिया से प्राप्त होता है। जीडीबी आपके द्वारा उत्पन्न की जाने वाली जानकारी को निर्दिष्ट करने के तरीके प्रदान करता है पहलेकार्यक्रम का शुभारंभ. (आप इन्हें स्टार्टअप के बाद बदल सकते हैं, अन्यथा ऐसे परिवर्तन आपके प्रोग्राम पर तभी लागू होंगे जब आप शुरू करेंगे।) इस जानकारी को निम्नलिखित श्रेणियों में विभाजित किया जा सकता है: पैरामीटरवे पैरामीटर निर्दिष्ट करें जिन्हें आपके प्रोग्राम को पास करने की आवश्यकता है, जैसे रन कमांड के पैरामीटर। चूँकि आपके सिस्टम में एक शेल है, इसका उपयोग मापदंडों को पारित करने के लिए किया जाता है, इसलिए उनका वर्णन करते समय, आप अन्य चीजों का उपयोग कर सकते हैं (जैसे कि टेम्पलेट खोलना या स्थानापन्न को प्रतिस्थापित करना)। यूनिक्स सिस्टम पर, आप नियंत्रित कर सकते हैं कि SHELL मिडलवेयर के लिए कौन सा शेल प्रतिस्थापित किया जाए। धारा 4.3 आपके कार्यक्रम के लिए तर्क। सेरेडा.सुनिश्चित करें कि आपका प्रोग्राम GDB में अपना कोर बनाता है, या आप इसमें प्रवाहित कोर की मात्रा को बदलने के लिए GDB सेट वातावरण और अनसेट पर्यावरण कमांड का उपयोग कर सकते हैं। अनुभाग 4.4 आपके प्रोग्राम का कार्यशील मध्य। कार्य निर्देशिकाआपका प्रोग्राम अपनी कार्यशील निर्देशिका को GDB में डंप कर देता है। आप सीडी कमांड का उपयोग करके जीडीबी कार्यशील निर्देशिका सम्मिलित कर सकते हैं। अनुभाग 4.5 आपके प्रोग्राम की कार्यशील निर्देशिका। मानक परिचय और प्रदर्शन.सुनिश्चित करें कि आपका प्रोग्राम मानक इनपुट और आउटपुट के लिए GDB के समान उपकरणों का उपयोग करता है। आप अपने इनपुट को रन कमांड पर रीडायरेक्ट कर सकते हैं, या अपने प्रोग्राम के लिए एक अलग डिवाइस इंस्टॉल करने के लिए tty कमांड का उपयोग कर सकते हैं। खंड 4.6 कार्यक्रमों का परिचय और विमोचन। अग्रिम रूप से:यदि आप चाहते हैं कि इनपुट और आउटपुट पुनर्निर्देशन काम करे, तो आप अन्य प्रोग्राम चलाने वाले प्रोग्राम से आउटपुट डेटा संचारित करने के लिए चैनलों का चयन नहीं कर सकते हैं; यदि आप यह प्रयास करते हैं, तो आप संपूर्ण GDB से तब तक गुजरेंगे जब तक कि आप गलत प्रोग्राम इंस्टॉल नहीं कर लेते।

जब आप रन कमांड जारी करते हैं, तो आपका प्रोग्राम क्रैश होने लगता है। प्रभाग. अनुभाग 5. कार्यक्रम का विकास और निरंतरता, अपने कार्यक्रम को बेहतर बनाने के तरीके पर चर्चा करना। जैसे ही आपका प्रोग्राम प्रोग्राम हो जाता है, आप प्रिंट या कॉल कमांड का उपयोग करके प्रोग्राम फ़ंक्शन को कॉल कर सकते हैं। अनुभाग 8. डेटा अनुवर्ती.

जब आपकी प्रतीक फ़ाइल संशोधित की जाती है, तो जैसे ही जीडीबी प्रतीकों को पढ़ना शुरू करता है, यह अपनी प्रतीक तालिका को देखता है और उन्हें फिर से पढ़ता है। इस तरह, GDB आपके सटीक डेटा बिंदुओं को सहेजने का प्रयास करता है।

4.3 आपके कार्यक्रम के लिए तर्क

पहली बात यह है कि जीडीबी को तैयारी के बाद तब तक काम करना चाहिए जब तक कि निर्दिष्ट प्रक्रिया स्थापित न हो जाए - यह गलत है। यदि आप रन का उपयोग करके प्रक्रियाएं चलाते हैं, तो आप उपलब्ध जीडीबी कमांड का उपयोग करके निष्पादन प्रक्रिया की निगरानी और बदलाव कर सकते हैं। आप एंकर पॉइंट सम्मिलित कर सकते हैं; आप प्रोग्राम को एक-एक करके छोड़ सकते हैं और मूल छोड़ना जारी रख सकते हैं, और आप डेटा क्षेत्रों को बदल सकते हैं। यदि आप नए GDB में शामिल होने के बाद संपादन प्रक्रिया जारी रखना चाहते हैं, तो आप जारी रखें कमांड का उपयोग कर सकते हैं। अलग करें एक बार जब आप अधिग्रहण प्रक्रिया की स्थापना पूरी कर लेते हैं, तो आप इसे जीडीबी से कनेक्ट करने के लिए अलग कमांड का उपयोग कर सकते हैं। उनकी जीत के साथ यह सिलसिला जारी है. डिटैच कमांड के बाद, यह प्रक्रिया और जीडीबी फिर से पूरी तरह से स्वतंत्र हो जाती है, और आप रन का उपयोग करके किसी अन्य प्रक्रिया में शामिल होने या लॉन्च करने के लिए तैयार हैं। यदि आप कमांड छोड़ने के बाद दोबारा RET टाइप करते हैं तो डिटैच दोहराया नहीं जाता है।

यदि आप GDB से बाहर निकलते हैं या नई प्रक्रिया चलने के दौरान रन कमांड का उपयोग करते हैं, तो आप पूरी प्रक्रिया को समाप्त कर देंगे। पदोन्नति के लिए, यदि आप इनमें से किसी एक भाषण को पूरा करने का इरादा रखते हैं तो जीडीबी पुष्टिकरण मांगेगा; आप सेट कन्फ़र्म कमांड (धारा 15.6 अनावश्यक अग्रिम सूचना) का उपयोग करके नियंत्रित कर सकते हैं कि आपको पुष्टि की आवश्यकता है या नहीं।

4.8 बाल प्रक्रियाओं का अभाव

किल उस चाइल्ड प्रक्रिया को ढूंढें जिसमें आपका प्रोग्राम GDB के अंतर्गत स्थापित है।

यदि आप मेमोरी डंप को सुधारना चाहते हैं, न कि सहेजी जा रही प्रक्रिया को, तो यह कमांड उपयोगी है। प्रोग्राम के बाहर निकलने के दौरान GDB किसी भी मेमोरी डंप को अनदेखा कर देता है।

कुछ ऑपरेटिंग सिस्टम पर, प्रोग्राम को GDB में तब तक इंस्टॉल नहीं किया जा सकता जब तक आपके पास व्यवस्थापक द्वारा इसमें इंस्टॉल किए गए नोड हों। इस स्थिति में, आप व्यवस्थापक द्वारा अपने प्रोग्राम को समाप्त करने की अनुमति देने के लिए किल कमांड का उपयोग कर सकते हैं।

यदि आप अपने प्रोग्राम को पुन: संकलित और पुनः लिंक करना चाहते हैं तो किल कमांड भी उपयोगी है, क्योंकि समृद्ध सिस्टम पर प्रक्रिया के अंत में संकलित की जा रही फ़ाइल को संशोधित करना संभव नहीं है। इस मामले में, जब आप अगली बार रन दर्ज करेंगे, तो जीडीबी नोट करेगा कि फ़ाइल बदल गई है और प्रतीक तालिका को फिर से पढ़ेगा (आपके अंक सहेजने का प्रयास करते समय)।