2011-03-05 11 views
5

मैं कोड है कि इस तरह दिखता है डिबगिंग रहा से बचने के लिए:डिबगिंग जुड़ी प्रक्रिया कैसे एक पाश

while (true){ 
    // do something ... 
    size_t i = foo(); // <- bp set here 
    if (flag_set) break; 
} 

// More code follows here ... 

मैं foo() फ़ंक्शन कॉल में तोड़ने के लिए चाहते हैं, यह कुछ समय के आह्वान और उसके बाद थोड़ी देर के लूप से पूरी तरह से कूदें (मान लीजिए कि हमें गारंटी है कि ध्वज सेट किया जाएगा - इसलिए हम लूप से बाहर निकल सकते हैं।

मैं लूप से पूरी तरह से कैसे टूट सकता हूं? बस खत्म हो जाता है अगली पुनरावृत्ति। मैं जो करना चाहता हूं वह वर्तमान "कोड खंड" से बाहर निकलना है (इस मामले में, जबकि लूप)

+0

क्या आप सचमुच लूप से बाहर निकलना चाहते हैं (जैसे कि आपके पास 'कोड' था, आपके कोड में स्टेटमेंट था)? या बस जीडीबी को तब तक रुकने के निर्देश देने के लिए जब तक यह लूप से बाहर न हो जाए? – thkala

उत्तर

2

आप अग्रिम कमांड चाहते हैं, जो ब्रेक कमांड के समान तर्क लेता है। एक उदाहरण के रूप में अपने कोड का उपयोग करना (लेकिन लाइन नंबर जोड़ा के साथ):

10 while (true){ 
11 // do something ... 
12 size_t i = foo(); // <- bp set here 
13 if (flag_set) break; 
14 } 
15 
16 // More code follows here ... 
17 someFunction(); 

कहो लाइन 12 पर अपने मूल ब्रेकप्वाइंट ब्रेकप्वाइंट 1 था, और कई बार आप 17 लाइन को छोड़ करना चाहता था तोड़ने के बाद, आप कुछ टाइप करेंगे जैसे:

अक्षम 1

अग्रिम 17

जो ब्रेकप्वाइंट को निष्क्रिय होगा 1 (इसलिए यह लूप के आराम के लिए मारा नहीं प्राप्त करता है) और फिर कार्यक्रम को क्रियान्वित करने, जब तक यह लाइन 17 हिट रहते हैं।

+0

ठीक वही है जो मैं करना चाहता हूं - धन्यवाद! – oompahloompah

0

लूप के बाद दूसरा ब्रेकपॉइंट सेट करें। लूप के अंदर ब्रेकपॉइंट disablecontenable ब्रेकपॉइंट फिर से।

मुझे किसी भी आसान तरीके से पता नहीं है।

0

jump कमांड का उपयोग करने का प्रयास करें। प्रति कम से कम इस सिस्टम पर gdb मदद,:

jump -- Continue program being debugged at specified line or address 
+0

नहीं, नहीं - वह भौतिक रूप से प्रोग्राम काउंटर बदलता है! मुझे यह भी नहीं पता कि वे इस सुविधा को क्यों प्रदान करते हैं, यह इतना खतरनाक है। – TonyK

+0

लेकिन यही है कि @oompahloompah ने पूछा: "थोड़ी देर के लूप से पूरी तरह से कूदें (मान लीजिए कि हमें गारंटी है कि ध्वज सेट किया जाएगा - इसलिए हम लूप से बाहर निकल सकते हैं।" – geekosaur

+1

क्या oompahloompah चाहता है हर बार ब्रेकपॉइंट पर रुकने के बिना शेष पुनरावृत्तियों को निष्पादित करें। कम से कम, मैंने इसे पढ़ा है। समाधान के लिए मेरा उत्तर देखें। – TonyK

1

पाश से पहले एक ब्रेकपाइंट सेट करें। फिर foo() कॉल पर कर्सर, और Debug|Run to Line का उपयोग करें। यह इतना उपयोगी है कि मैंने इसे एक फ़ंक्शन कुंजी समर्पित कर दी है।

0

आपको कमांड की आवश्यकता है। लूप के माध्यम से कदम उठाने से बचने का यह सबसे आसान तरीका है। gdb manual से:

वर्तमान स्टैक फ्रेम में वर्तमान लाइन के पीछे एक स्रोत रेखा तक चलना जारी रखें, पहुंच गया है। यह आदेश एक लूप के माध्यम से एक से अधिक कदम से बचने के लिए प्रयोग किया जाता है। यह अगली कमांड की तरह है, सिवाय इसके कि जब तक मुकाबला नहीं हो जाता है, तब तक यह स्वचालित रूप से निष्पादन जारी रहता है जब तक कि कार्यक्रम काउंटर कूद के पते से अधिक न हो।