2009-08-30 10 views
32
  1. अगर मैं वर्तमान क्षेत्र के लिए एक चर स्थानीय के लिए एक watchpoint निर्धारित करते हैं, यह स्वत: हटा दिया जाएगा जब क्षेत्र से बाहर जा रहा है। क्या इसे एक बार सेट करने और इसे एक ही दायरे में प्रवेश करते समय ऑटो को जीवित रखने का कोई तरीका है?मैं स्थानीय रूप से स्कॉप्ड चर पर लगातार और सशर्त घड़ीपटल कैसे सेट करूं?

  2. वहाँ वैसे भी watch var1 if var1==0 तरह सशर्त watchpoint स्थापित करने के लिए, है? मेरे मामले में, हालत काम नहीं करती है। var1 का मूल्य बदल जाता है, var1 == 0 तक की जगह सही होने पर gdb बंद हो जाता है। मेरा जीडीबी जीएनयू जीडीबी 6.8-डेबियन है।

उत्तर

3
  1. मुझे यकीन है कि जो भाषा हमें, उपयोग कर रहे हैं तो सटीक उत्तर अलग-अलग होगा, लेकिन आप चर को बदल सकता है या तो, स्थिर वैश्विक, या गतिशील आवंटित होने के लिए (नहीं कर रहा हूँ और नि: शुल्क नहीं है जब समारोह वापस आता है?)। इस तरह यह कच्चा पता बदल नहीं जाएगा, और जीडीबी इस पर ब्रेकपॉइंट सक्षम हो जाएगा।

  2. मूल्य whe यह एक विशिष्ट मूल्य के बराबर होती है देखने की बजाय

    ; आपको उस लाइन पर एक सशर्त ब्रेक पॉइंट सेट करना चाहिए जहां आप var1 के मान को देखना चाहते हैं। यह प्रभावी रूप से एक ही प्रभाव

उदा।

(gdb) break main.c:123 if (var1 == 0) 
+0

मैं सी ++ का उपयोग कर रहा हूं। मैं ब्रेकपॉइंट पर वॉचपॉइंट का उपयोग करता हूं क्योंकि चर के मान को बदलने वाले कोड में कई जगहें हो सकती हैं। इसलिए प्रत्येक स्थान पर ब्रेकपॉइंट जोड़ने के लिए यथार्थवादी नहीं है। मैं देखना चाहता हूं कि सशर्त दृष्टिकोण निर्धारित करना संभव है या नहीं। – Tim

29

मैं डेव से सहमत हूं कि एक सशर्त ब्रेकपॉइंट जाने का तरीका है।

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

मैं आपके जीडीबी कमांड को एक फाइल में लिखने का सुझाव देता हूं ताकि उन्हें संपादित करना आसान हो और source कमांड के साथ पुनः लोड करना आसान हो। या आप जीडीबी कमांड लाइन पर लोड करने के लिए कमांड फाइल निर्दिष्ट कर सकते हैं या उन्हें स्वचालित रूप से लोड करने के लिए .gdbinit का उपयोग कर सकते हैं।

commands का अच्छा उपयोग का एक उदाहरण:
मान लीजिए कि मैं एक समारोह format कि अन्य कार्यों का एक बहुत द्वारा कहा जाता है। मैं इसे तोड़ना चाहता हूं, लेकिन केवल do_step_3 को फ़ंक्शन के बाद बुलाया गया है।

break do_step_3 
commands 
    break format 
    continue 
end 

आप की तरह कुछ के साथ अपनी समस्या के लिए इसका उपयोग कर सकते हैं:

break func 
commands 
    watch var 
    continue 
end 
+0

उत्कृष्ट अंक! धन्यवाद! – Tim

12

आप एक ही तरीका है कि आप विच्छेदबिंदु के साथ क्या में watchpoints पर स्थिति सेट कर सकते हैं। यह in the documentation है लेकिन स्वीकार्य रूप से यह शायद ही कभी खुद पर ध्यान देता है।

तो watch my_var if my_var > 3 बस ठीक काम करता है, के रूप में condition आदेश करता है।

watchpoint से बनाने के लिए चर यह देख रहा है क्षेत्र से बाहर जाता है, gdb समारोह के शुरू में स्वचालित रूप से एक ब्रेकप्वाइंट का उपयोग कर ऐसा कर चुके हैं Zan वर्णन किया है।

8

आप एक watchpoint कि क्षेत्र से बाहर स्मृति पते पर सेट करके नहीं जाता सेट कर सकते हैं।

(gdb) p &var1 
$1 = (int *) 0x41523c0 
(gdb) watch *(int *)0x41523c0 
Hardware watchpoint 1: *(int *)0x41523c0 

यह अन्य डेटा प्रकारों और पॉइंटर्स के लिए भी काम करता है।

+6

यह उपयोगी हो सकता है, लेकिन यहां काम नहीं करेगा। स्थानीय चर फ़ंक्शन कॉल के बीच एक ही पते को बनाए रखेंगे - लेकिन अन्य स्टैक वैरिएबल उस स्मृति स्थान का उपयोग करने की संभावना है ... – Nick

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

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