list
कमांड लाइनों के एक सेट को प्रिंट करता है, लेकिन मुझे एक सिंगल लाइन की आवश्यकता है, जहां मैं हूं और जहां एक त्रुटि शायद हुई है।
bt
या backtrace
या where
फ़ंक्शन कॉल के ढेर प्रिंट, f
या frame
निष्पादित करने के लिए अगली पंक्ति मुद्रित करें।
list
कमांड लाइनों के एक सेट को प्रिंट करता है, लेकिन मुझे एक सिंगल लाइन की आवश्यकता है, जहां मैं हूं और जहां एक त्रुटि शायद हुई है।
bt
या backtrace
या where
फ़ंक्शन कॉल के ढेर प्रिंट, f
या frame
निष्पादित करने के लिए अगली पंक्ति मुद्रित करें।
जवाबों:
डिबगिंग करते समय मुझे वही जानकारी मिलती है। हालांकि नहीं, जबकि मैं स्टैक्ट्रेस की जांच कर रहा हूं। सबसे अधिक शायद आपने सोचा होगा कि मैंने अनुकूलन ध्वज का उपयोग किया है। इस लिंक को देखें - कुछ संबंधित।
-g3
किसी भी अनुकूलन ध्वज को निकालने का प्रयास करें । तब यह काम कर सकता है। HTH!
-g
डिबग जानकारी शामिल करने के लिए संकलित किया गया था , मैं वर्तमान में एक स्टैक फ्रेम में हूं, जिसे साझा पुस्तकालयों में से एक से लिया गया है, जो स्पष्ट रूप से लाइन की जानकारी शामिल करने के लिए संकलित नहीं किया गया था। धन्यवाद, कुमार।
'फ़्रेम' कमांड आपको वह चीज़ देगा जो आप खोज रहे हैं। (इसे संक्षिप्त रूप में 'f' कहा जा सकता है)। यहाँ एक उदाहरण है:
(gdb) frame
\#0 zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139 int rc = fq.recv (msg_);
(gdb)
एक तर्क के बिना, 'फ्रेम' आपको बताता है कि आप कहां हैं (एक तर्क के साथ यह फ्रेम बदलता है)। फ़्रेम कमांड के बारे में अधिक जानकारी यहां पाई जा सकती है ।
ध्यान रखें कि जीडीबी निम्न स्तर के निर्देशों का एक शक्तिशाली कमांड-योग्य है- इसलिए यह विधानसभा अवधारणाओं से बंधा है।
आप जो देख रहे हैं उसे डी इंस्ट्रक्शन पॉइंटर कहा जाता है, अर्थात:
इंस्ट्रक्टर पॉइंटर, मैमोरी एड्रेस को इंगित करता है जिसे प्रोसेसर अगली बार निष्पादित करने का प्रयास करेगा। निर्देश सूचक को 16-बिट मोड में आईपी , 32-बिट मोड में ईआईपी और 64-बिट मोड में रिप कहा जाता है।
यहाँ और अधिक विस्तार
gdb निष्पादन पर उपलब्ध सभी रजिस्टर निम्न के साथ दिखाए जा सकते हैं:
(gdb) info registers
इसके साथ आप पा सकते हैं कि आपका प्रोग्राम किस मोड पर चल रहा है (इन रजिस्टरों में से कौन सा मौजूद है)
तब (यहां आजकल सबसे आम रजिस्टर रिप का उपयोग करते हुए , यदि आवश्यक हो तो ईप या बहुत कम आईपी के साथ बदलें ):
(gdb)info line *$rip
आपको लाइन नंबर और फ़ाइल स्रोत दिखाएगा
(gdb) list *$rip
आपको पहले और बाद में वह लाइन दिखाएगा
लेकिन शायद
(gdb) frame
कई मामलों में पर्याप्त होना चाहिए।
ip
यहां कभी उपयोग नहीं किया जाता है। इसके अलावा, प्रोग्राम काउंटर के नाम को स्पष्ट रूप से वर्तनी के बजाय, आप इसके लिए GDB के उपनाम का उपयोग कर सकते हैं $pc
:। तो x/10i $pc
वास्तुकला की परवाह किए बिना वर्तमान निर्देश सूचक पर 10 निर्देशों को इकट्ठा करेगा - यह i386, x86_64, एआरएम आदि पर काम करेगा ..
कमान जहां या फ्रेम का उपयोग किया जा सकता है। जहां कमांड फ़ंक्शन के नाम के साथ अधिक जानकारी देगा
backtrace
याwhere
, यहां तक किinfo line
या बसbt
(बैकट्रेस के लिए)। dirac.org/linux/gdb एक gdb ट्यूटोरियल के लिए