2010-09-17 10 views
7

मैं सी ++ में लिखे गए एक प्रोग्राम को डीबग करने का प्रयास कर रहा हूं। यहां कोड है:जीडीबी चरण पर फ़ंक्शन (अगला) काम नहीं करता

void a() { } 
void b() { a(); } 
int main() { b(); return 0; } 

मैंने इसका उपयोग करके संकलित किया: g++ -g3 -O0 -o cards.exe cards.cpp

(gdb) b main 
Breakpoint 1 at 0x401421: file cards.cpp, line 10. 
(gdb) r 
Starting program: C:\workspace\Cards\src/cards.exe 
[New thread 1624.0xa28] 
Breakpoint 1, main() at cards.cpp:10 
10 int main() 
(gdb) n 
12  b(); 
(gdb) n 
b() at cards.cpp:5 5 
void b() 
(gdb) n 
7  a(); 
(gdb) quit 
The program is running. Exit anyway? (y or n) 

मेरा प्रश्न है, क्यों gdb करने के लिए एक अगले आदेश भेजने के लिए अभी भी एक समारोह में कदम है है: यहाँ मेरी gdb सत्र के उत्पादन में है? मैं जी ++ 4.2.1-एसजेएलजे और जीडीबी 6.8 का उपयोग कर रहा हूं।

+0

क्या आपने कुछ और जटिल कोशिश की है? – stefanB

+0

दरअसल हां, मैंने एक() को लूप किए गए आमंत्रण करने का प्रयास किया है। अभी भी काम नहीं करेगा। मैंने __attribute __ ((noinline) के साथ इनलाइनिंग को अक्षम करने का भी प्रयास किया है, लेकिन इसका कोई फायदा नहीं हुआ है। मैंने अपने हैकिंटोश पर यह कोशिश की है और यह काम किया है। –

उत्तर

0

'एन' अगला कथन है और फ़ंक्शन में कदम नहीं उठाएगा।

फ़ंक्शन में कदम उठाने के लिए, 's' का उपयोग करें। वह कदम है।

+0

संख्या। 'n' फ़ंक्शन में कदम उठाता है। यही समस्या है ओपी संबोधित कर रहा है। – Blauhirn

5

step और next आदेशों एक समय में एक स्रोत लाइन काम करते हैं, इसलिए जब सब कुछ एक पंक्ति में सभी है एक भी next मुझे main() के अंत करने के लिए सही लगता है।

3 int main() { b(); return 0; } 
(gdb) n 
0x00001faa in start() 
स्वरूपित कम घनी मैं अभी भी परिणाम देखना चाहते हैं नहीं दिख रहा है कोड के साथ

। मैंने एक बार में एक पर कदम उठाने के लिए gdb प्राप्त करने के लिए फ़ंक्शन कॉल को अलग-अलग पंक्तियों पर रखा। यहाँ मैं तो प्राप्त होते हैं:

jkugelman$ cat cards.cpp 
void a() { 
} 

void b() { 
    a(); 
} 

int main() { 
    b(); 
    return 0; 
} 
jkugelman$ g++ -g3 -O0 -o cards cards.cpp 
jkugelman$ gdb ./cards 
GNU gdb 6.3.50-20050815 (Apple version gdb-960) (Sun May 18 18:38:33 UTC 2008) 
<snip> 
Reading symbols for shared libraries .... done 

(gdb) b main 
Breakpoint 1 at 0x1ff2: file cards.cpp, line 9. 
(gdb) r 
Starting program: /Users/jkugelman/Development/StackOverflow/cards 
Reading symbols for shared libraries +++. done 

Breakpoint 1, main() at cards.cpp:9 
9  b(); 
(gdb) n 
10  return 0; 
(gdb) n 
11 } 
(gdb) n 
0x00001faa in start() 

मैं एक जवाब नहीं है, लेकिन मैं तो बस साझा करने के लिए कि gdb मेरी iMac पर उम्मीद के रूप में व्यवहार करना चाहता था। किसी भी मामले में जीडीबी ने एक निर्देश के रूप में b() पर कॉल का इलाज किया और कभी भी फ़ंक्शन कॉल में प्रवेश नहीं किया।

+0

मैंने आपके कोड का उपयोग करने की कोशिश की लेकिन अभी भी कदम पर काम नहीं करता है। शायद क्योंकि हम जीडीबी के विभिन्न संस्करणों का उपयोग कर रहे हैं? –

+0

आपकी मशीन पर 'अगली सहायता' और 'सहायता चरण' क्या कहें? –

+0

(gdb) अगली चरण प्रोग्राम, सबराउटिन कॉल के माध्यम से आगे बढ़ने में सहायता करें। "चरण" कमांड की तरह जब तक subroutine कॉल नहीं होती है; जब वे करते हैं, तो कॉल को एक निर्देश के रूप में माना जाता है। तर्क एन का मतलब यह एन बार करता है (या जब तक प्रोग्राम किसी अन्य कारण से बंद नहीं हो जाता)। (gdb) सहायता चरण प्रोग्राम जब तक यह एक अलग स्रोत रेखा तक नहीं पहुंच जाता है। तर्क एन का मतलब यह एन बार करता है (या जब तक प्रोग्राम किसी अन्य कारण से बंद नहीं हो जाता)। –

संबंधित मुद्दे