2013-01-17 10 views
66

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

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

    return 0; 
} 

आउटपुट:

(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) 

जैसा कि आप देखते हैं, जीडीबी ने कोई ब्रेक प्वाइंट नहीं बनाया है, क्या यह जीडीबी के साथ संभव है?

उत्तर

91
एक watchpoint एक ब्रेकपाइंट भी एक भी ब्रेकप्वाइंट सेट कर सकते हैं अंदर नेस्टेड के अलावा

और एक शर्त का उपयोग करें। मुझे इसे कभी-कभी आसान लगता है।

(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 
23

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

आप watch i का उपयोग कर शुरू कर सकते हैं।
तो आप info watch

+0

'(gdb) मैं को देख कोई प्रतीक" मैं "वर्तमान संदर्भ में। – SIFE

+0

आपको कोड में एक जगह पर होना चाहिए जहां मैं मौजूद हूं। 'ब्रेक मेन ',' रन', 'सी',' एस '(यह सुनिश्चित करने के लिए चरण कि आप घोषणा को पार करते हैं), और उसके बाद उत्तर पर आदेश आज़माएं। अपने कार्यक्रम को '-g' ध्वज के साथ संकलित करना सुनिश्चित करें। (यानी डीबग जानकारी के साथ) – imreal

3

हैं हार्डवेयर और सॉफ्टवेयर watchpoints का उपयोग करके ब्रेकप्वाइंट संख्या प्राप्त कर सकते हैं यह condition <breakpoint num> i == 5

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

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

एक watchpoint के लिए, पहले आप एक जगह है जहाँ varianle मैं वातावरण में मौजूद है में कोड को तोड़ने की जरूरत है, और watchpoint निर्धारित किया है।

watch आदेश जबकि पढ़ने के लिए rwatch, और awatch पढ़ने/लिखने के लिए, लिखने के लिए एक watchpoit सेट करने के लिए प्रयोग किया जाता है। 'फ़ाइल नाम: line_number'

7
$ 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 } 
    (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)