GDB: यदि वैरिएबल बराबर मान हो तो विराम दें


89

मैं GDB को एक विराम बिंदु बनाना पसंद करता हूं जब एक चर जो मेरे द्वारा सेट किए गए कुछ मूल्य के बराबर होता है, मैंने इस उदाहरण की कोशिश की:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i)
        printf("%d\n", i);

     return 0;
}

GDB से आउटपुट:

(gdb) break if ((int)i == 5)
No default breakpoint address now.
(gdb) run
Starting program: /home/SIFE/run 
0
1
2
3
4
5
6

Program exited normally.
(gdb)

जैसा कि आप देख रहे हैं, GDB ने कोई विराम बिंदु नहीं बनाया, क्या यह GDB के साथ संभव है?

जवाबों:


123

ब्रेकपॉइंट के अंदर नेचुरल वॉचपॉइंट के अलावा आप 'फाइलनेम: लाइन_नंबर' पर एक सिंगल ब्रेकप्वाइंट भी सेट कर सकते हैं और एक कंडीशन का उपयोग कर सकते हैं। मुझे यह कभी-कभी आसान लगता है।

(gdb) break iter.c:6 if i == 5
Breakpoint 2 at 0x4004dc: file iter.c, line 6.
(gdb) c
Continuing.
0
1
2
3
4

Breakpoint 2, main () at iter.c:6
6           printf("%d\n", i);

अगर मेरी तरह आप लाइन नंबर बदलते हुए थक जाते हैं, तो आप एक लेबल जोड़ सकते हैं, इसलिए लेबल पर ब्रेकपॉइंट सेट करें जैसे:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i) {
       looping:
        printf("%d\n", i);
     }
     return 0;
}

(gdb) break main:looping if i == 5

30

आप इसके लिए एक घड़ी का उपयोग कर सकते हैं (कोड के बजाय डेटा पर एक ब्रेकपॉइंट)।

आप उपयोग करके शुरू कर सकते हैं watch i
फिर इसका उपयोग करने के लिए एक शर्त निर्धारित करेंcondition <breakpoint num> i == 5

आप उपयोग करके ब्रेकपॉइंट नंबर प्राप्त कर सकते हैं info watch


3
(gdb) watch i No symbol "i" in current context.
SIFE

2
आपको उस कोड में एक जगह पर होना है जहाँ iमौजूद है। प्रयास करें break main, run, c, sउत्तर पर आदेश (कदम वाकई घोषणा पिछले प्राप्त करने के लिए), और फिर। -gध्वज के साथ अपने कार्यक्रम को संकलित करना सुनिश्चित करें । (यानी डिबग जानकारी के साथ)
imreal

निष्पादन शुरू होने से पहले, आपके मुख्य निष्पादन योग्य के खिलाफ लिंक की गई अन्य संकलन इकाइयां / फाइलें अभी तक लोड नहीं की जा सकती हैं। एक निफ्टी विकल्प तब उपयोग करना है start <args>, जो पसंद है tb main, जैसे run <args>। इससे प्रोग्राम शुरू हो जाएगा, जिससे आप ब्रेक / वॉच पॉइंट को अधिक आसानी से सेट कर पाएंगे।
JWCS

9

सबसे पहले, आपको अपने कोड को उपयुक्त झंडे के साथ संकलित करने की आवश्यकता है, जिससे कोड में डिबग सक्षम हो सके।

$ gcc -Wall -g -ggdb -o ex1 ex1.c

तो बस आप अपने पसंदीदा डिबगर के साथ कोड चलाते हैं

$ gdb ./ex1

मुझे कोड दिखाओ।

(gdb) list
1   #include <stdio.h>
2   int main(void)
3   { 
4     int i = 0;
5     for(i=0;i<7;++i)
6       printf("%d\n", i);
7   
8     return 0;
9   }

लाइनों पर तोड़ 5 और लग रहा है अगर मैं == 5।

(gdb) b 5
Breakpoint 1 at 0x4004fb: file ex1.c, line 5.
(gdb) rwatch i if i==5
Hardware read watchpoint 5: i

ब्रेकप्वाइंट की जाँच करना

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fb in main at ex1.c:5
    breakpoint already hit 1 time
5       read watchpoint keep y                      i
    stop only if i==5

कार्यक्रम चला रहा है

(gdb) c
Continuing.
0
1
2
3
4
Hardware read watchpoint 5: i

Value = 5
0x0000000000400523 in main () at ex1.c:5
5     for(i=0;i<7;++i)

4

हार्डवेयर और सॉफ्टवेयर वॉचपॉइंट हैं। वे पढ़ने के लिए और एक चर लिखने के लिए हैं। आपको एक ट्यूटोरियल से परामर्श करने की आवश्यकता है:

http://www.unknownroad.com/rtfm/gdbtut/gdbwatch.html

वॉचपॉइंट सेट करने के लिए, सबसे पहले आपको कोड को एक ऐसी जगह पर तोड़ने की ज़रूरत है, जहाँ पर्यावरण में मौजूद varianle, और वॉचपॉइंट सेट करें।

watchकमांड का उपयोग लिखने के लिए, जबकि rwatchपढ़ने के लिए, और awatchपढ़ने / लिखने के लिए वॉचपोइंट सेट करने के लिए किया जाता है ।

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