gdb: करेंट लाइन को कैसे प्रिंट करें या करेंट लाइन नंबर कैसे पता करें?


94

list कमांड लाइनों के एक सेट को प्रिंट करता है, लेकिन मुझे एक सिंगल लाइन की आवश्यकता है, जहां मैं हूं और जहां एक त्रुटि शायद हुई है।


23
backtraceया where, यहां तक ​​कि info lineया बस bt(बैकट्रेस के लिए)। dirac.org/linux/gdb एक gdb ट्यूटोरियल के लिए
dwalter

btया backtraceया whereफ़ंक्शन कॉल के ढेर प्रिंट, fया frameनिष्पादित करने के लिए अगली पंक्ति मुद्रित करें।
एरिक वांग

जवाबों:


21

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

-g3किसी भी अनुकूलन ध्वज को निकालने का प्रयास करें । तब यह काम कर सकता है। HTH!


1
आह, इसलिए हालांकि मेरे कार्यक्रम को -gडिबग जानकारी शामिल करने के लिए संकलित किया गया था , मैं वर्तमान में एक स्टैक फ्रेम में हूं, जिसे साझा पुस्तकालयों में से एक से लिया गया है, जो स्पष्ट रूप से लाइन की जानकारी शामिल करने के लिए संकलित नहीं किया गया था। धन्यवाद, कुमार।
बोरिस बुर्कोव

104

'फ़्रेम' कमांड आपको वह चीज़ देगा जो आप खोज रहे हैं। (इसे संक्षिप्त रूप में 'f' कहा जा सकता है)। यहाँ एक उदाहरण है:

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

एक तर्क के बिना, 'फ्रेम' आपको बताता है कि आप कहां हैं (एक तर्क के साथ यह फ्रेम बदलता है)। फ़्रेम कमांड के बारे में अधिक जानकारी यहां पाई जा सकती है


21

ध्यान रखें कि जीडीबी निम्न स्तर के निर्देशों का एक शक्तिशाली कमांड-योग्य है- इसलिए यह विधानसभा अवधारणाओं से बंधा है।

आप जो देख रहे हैं उसे डी इंस्ट्रक्शन पॉइंटर कहा जाता है, अर्थात:

इंस्ट्रक्टर पॉइंटर, मैमोरी एड्रेस को इंगित करता है जिसे प्रोसेसर अगली बार निष्पादित करने का प्रयास करेगा। निर्देश सूचक को 16-बिट मोड में आईपी , 32-बिट मोड में ईआईपी और 64-बिट मोड में रिप कहा जाता है।

यहाँ और अधिक विस्तार

gdb निष्पादन पर उपलब्ध सभी रजिस्टर निम्न के साथ दिखाए जा सकते हैं:

(gdb) info registers

इसके साथ आप पा सकते हैं कि आपका प्रोग्राम किस मोड पर चल रहा है (इन रजिस्टरों में से कौन सा मौजूद है)

तब (यहां आजकल सबसे आम रजिस्टर रिप का उपयोग करते हुए , यदि आवश्यक हो तो ईप या बहुत कम आईपी ​​के साथ बदलें ):

(gdb)info line *$rip

आपको लाइन नंबर और फ़ाइल स्रोत दिखाएगा

(gdb) list *$rip

आपको पहले और बाद में वह लाइन दिखाएगा

लेकिन शायद

(gdb) frame

कई मामलों में पर्याप्त होना चाहिए।


2
जीडीबी 16-बिट मोड का समर्थन करता है, जो मुझे विश्वास है, इसलिए ipयहां कभी उपयोग नहीं किया जाता है। इसके अलावा, प्रोग्राम काउंटर के नाम को स्पष्ट रूप से वर्तनी के बजाय, आप इसके लिए GDB के उपनाम का उपयोग कर सकते हैं $pc:। तो x/10i $pcवास्तुकला की परवाह किए बिना वर्तमान निर्देश सूचक पर 10 निर्देशों को इकट्ठा करेगा - यह i386, x86_64, एआरएम आदि पर काम करेगा ..
रुस्लान

18

कमान जहां या फ्रेम का उपयोग किया जा सकता है। जहां कमांड फ़ंक्शन के नाम के साथ अधिक जानकारी देगा


2

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.