2012-08-22 19 views
11

जीडीबी डीबगिंग सी ++ कोड में: मेरे पास 15 ब्रेकपॉइंट्स रणनीतिक रूप से सेट हैं, लेकिन मैं नहीं चाहता कि उनमें से कोई भी सक्रिय हो जाए जब तक कि मैंने ब्रेकपॉइंट # 2 को मारा न हो। क्या कोई रन-टू-ब्रेकपॉइंट- एन जीडीबी में कमांड है?जीडीबी: विशिष्ट ब्रेकपॉइंट तक चलाएं

मुझे लगता है अपने आप को कर के बजाय दो चीजों में से एक:

  1. अन्य सभी breakpoints हटाएं ताकि # 2 वह सब मौजूद है, चला, सभी breakpoints फिर से जोड़ है, या

  2. रन और बार-बार continue सभी ब्रेक के पीछे जब तक कि मैं # 2 पर पहला ब्रेक नहीं देखता।

मैं run-until 2 की तरह कुछ है कि # 2 को छोड़कर अन्य सभी breakpoints पर ध्यान नहीं देगा, लेकिन उन्हें नष्ट नहीं करना चाहता। क्या यह अस्तित्व में है? क्या किसी और के पास इससे निपटने का बेहतर तरीका है?

उत्तर

11

संस्करण 7.0 के रूप में जीडीबी पायथन स्क्रिप्टिंग का समर्थन करता है। मैंने एक साधारण स्क्रिप्ट लिखी है जो निर्दिष्ट नंबर वाले एक को छोड़कर सभी सक्षम ब्रेकपॉइंट्स को अस्थायी रूप से अक्षम कर देगी और जीडीबी run कमांड निष्पादित करेगी।

.gdbinit फाइल करने के लिए निम्न कोड जोड़ें:

python 
import gdb 

class RunUntilCommand(gdb.Command): 
    """Run until breakpoint and temporary disable other ones""" 

    def __init__ (self): 
     super(RunUntilCommand, self).__init__ ("run-until", 
               gdb.COMMAND_BREAKPOINTS) 

    def invoke(self, bp_num, from_tty): 
     try: 
      bp_num = int(bp_num) 
     except (TypeError, ValueError): 
      print "Enter breakpoint number as argument." 
      return 

     all_breakpoints = gdb.breakpoints() or [] 
     breakpoints = [b for b in all_breakpoints 
         if b.is_valid() and b.enabled and b.number != bp_num and 
         b.visible == gdb.BP_BREAKPOINT] 

     for b in breakpoints: 
      b.enabled = False 

     gdb.execute("run") 

     for b in breakpoints: 
      b.enabled = True 

RunUntilCommand() 
end 
+0

ग्रेट, यह बहुत उपयोगी है (और हैकबल)। धन्यवाद एलेक्स! – sligocki

+0

यह बहुत अच्छा है। एक 'जारी रखने तक' संस्करण अधिक उपयोगी होगा। –

3

अन्य सभी ब्रेकपॉइंट्स को हटाने से थोड़ा कम दर्दनाक disable होगा। इस तरह आपको इसे वापस लाने के लिए ब्रेकपॉइंट से जुड़े सभी सामानों को पुन: प्रस्तुत करने की आवश्यकता नहीं है, बस enable इसे फिर से संख्या से।

2

gdb ब्रेकपॉइंट हटाए जाने के बजाय अक्षम किया जा सकता है। तब आपको बस इतना करना होगा जब आवश्यक हो।

11

आप enable और disable ब्रेकपॉइंट्स कर सकते हैं, और ये आदेश रेंज स्वीकार करेंगे। कार्यक्रम के निष्पादन के दौरान रणनीतिक बिंदुओं पर, एक श्रेणी के साथ, इन आदेशों का उपयोग करें।

मुझे लगता है कि जब आप ब्रेकपॉइंट # 2 का उल्लेख करते हैं तो आप ब्रेकपॉइंट्स के जीडीबी नंबरिंग का जिक्र कर रहे हैं। यहां एक साधारण उदाहरण जीडीबी सत्र है:

(gdb) info breakpoints 
Num Type   Disp Enb Address What 
1 breakpoint  keep y 0x00001ddb in main at example.c:34 
2 breakpoint  keep y 0x00001e00 in main at example.c:39 
3 breakpoint  keep y 0x00001e15 in main at example.c:40 
(gdb) disable 1-3 
(gdb) enable 2 
(gdb) info breakpoints 
Num Type   Disp Enb Address What 
1 breakpoint  keep n 0x00001ddb in main at example.c:34 
2 breakpoint  keep y 0x00001e00 in main at example.c:39 
3 breakpoint  keep n 0x00001e15 in main at example.c:40 
(gdb) 

अब केवल ब्रेकपॉइंट # 2 सक्षम है। कार्यक्रम चलाने के लिए और जब # 2 पर निष्पादन टूटता है, एक सीमा के साथ अपने वांछित breakpoints के सभी को पुन: सक्षम: तुम भी ब्रेकप्वाइंट संख्या मिश्रण कर सकते हैं

(gdb) enable 1-3 
(gdb) info breakpoints 
Num Type   Disp Enb Address What 
1 breakpoint  keep y 0x00001ddb in main at example.c:34 
2 breakpoint  keep y 0x00001e00 in main at example.c:39 
3 breakpoint  keep y 0x00001e15 in main at example.c:40 

और पर्वतमाला:

(gdb) disable 1 4 6-7 
(gdb) info breakpoints 
Num Type   Disp Enb Address What 
1 breakpoint  keep n 0x00001ddb in main at example.c:34 
2 breakpoint  keep y 0x00001e00 in main at example.c:39 
3 breakpoint  keep y 0x00001e15 in main at example.c:40 
4 breakpoint  keep n 0x00001e4f in main at example.c:43 
5 breakpoint  keep y 0x00001e4f in main at example.c:44 
6 breakpoint  keep n 0x00001e5e in main at example.c:45 
7 breakpoint  keep n 0x00001e5e in main at example.c:46 
+0

धन्यवाद pb2q, मैं सक्षम करने और अक्षम करने के बारे में पता नहीं था। – sligocki

+0

और सभी ब्रेकपॉइंट्स को अक्षम करने के लिए बस 'अक्षम' करें। –

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