2009-05-07 25 views
7

मैंने "ए" ए "कमांड द्वारा" int a "के परिवर्तन को देखने की कोशिश की। हालांकि, कार्यक्रम तब नहीं रुकता है जब यह 12 में बदल जाता है। क्यों?मैं "घड़ी" जीडीबी का उपयोग कैसे कर सकता हूं?

/* FILE: test.c */ 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char** argv){ 
    printf("Hello world\n"); 

    int a = 12; 
    a = 10;                                          
    return 0; 
} 
+0

क्या आपने डीबग जानकारी (-g) के साथ संकलित किया था और क्या आप सुनिश्चित हैं कि आप इसका उपयोग कर रहे हैं डीबग संस्करण? – dirkgently

उत्तर

11

यह आपके प्लेटफॉर्म, जीडीबी के संस्करण, और आपके द्वारा उपयोग किए जाने वाले जीडीबी कमांड के सटीक अनुक्रम को निर्दिष्ट करने में मदद कर सकता है।

यहाँ मैं क्या देख रहा है (GDB ठीक काम करने के लिए प्रकट होता है):

$ gcc -g test.c 

$ gdb a.out 
GNU gdb (GDB) 6.8.50.20090430-cvs 
Copyright (C) 2009 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-unknown-linux-gnu". 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>... 
(gdb) list 
1  #include <stdio.h> 
2  #include <stdlib.h> 
3 
4  int main(int argc, char** argv){ 
5   printf("Hello world\n"); 
6 
7   int a = 12; 
8   a = 10;                                          
9   return 0; 
10  } 
11 
(gdb) b 5 
Breakpoint 1 at 0x4004a7: file test.c, line 5. 
(gdb) r 

Breakpoint 1, main (argc=1, argv=0x7fffffffdb28) at test.c:5 
5   printf("Hello world\n"); 
(gdb) watch a 
Hardware watchpoint 2: a 
(gdb) c 
Hello world 
Hardware watchpoint 2: a 

Old value = 0 
New value = 12 
main (argc=1, argv=0x7fffffffdb28) at test.c:8 
8   a = 10;                                          
(gdb) c 
Hardware watchpoint 2: a 

Old value = 12 
New value = 10 
main (argc=1, argv=0x7fffffffdb28) at test.c:9 
9   return 0; 
(gdb) c 

Watchpoint 2 deleted because the program has left the block in 
which its expression is valid. 
0x00007ffff7ab3033 in exit() from /lib/libc.so.6 
(gdb) c 

Program exited normally. 
(gdb) q 
1

संकलक 12 आवंटित करने के लिए "एक", यह एक अच्छा विचार एकत्रित न करने के लिए तैयार किए गए कोड की पुष्टि करने के लिए किया जाएगा और भी कोड जनरेट नहीं की संभावना है। इसे करने के लिए आपको शायद थोड़ा और जटिल परीक्षण की आवश्यकता है।

3

(ले मैं यह है कि आप जीसीसी का उपयोग कर रहे आप एक प्रोग्राम आप हमेशा -O0 -g3 साथ बनाने चाहिए डिबग करने के लिए चाहते हैं, यदि आप नहीं हैं तो आपका कंपाइलर ऑप्टिमाइज़ेशन को बंद करने और डीबग जानकारी को सक्षम करने के लिए अन्य ध्वजों का समर्थन करेगा)।

मेरे सिस्टम पर (x86_64 जेनेटू जीएनयू/लिनक्स चल रहा है) मैं 'int a = 12' लाइन पर नहीं पहुंच पा रहा हूं, जब मैं किसी भी अनुकूलन को अधिक या बराबर के रूप में उपयोग करता हूं क्योंकि संकलक dead code elimination लागू करेगा। (here से लिया गया है, यह -ओ अनुभाग में -fdce ध्वज है)

जब आप डिबगिंग करते हैं तो हमेशा इसे ध्यान में रखें! Objdump -D के साथ इसे अलग करके अपने कोड को सत्यापित करें या अपने कंपाइलर को जेनरेटेड असेंबली (जीएससी पर -एस ध्वज के साथ) दिखाने के लिए बताएं

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