2010-07-08 4 views
12

आप किसी भी अन्य कारण एक watchpoint भी कई हार्डवेयर breakpoints/watchpoints के अलावा अन्य सम्मिलित नहीं किया जा सकता है पता है?gdb भी कई watchpoints साथ बंद हो जाता है जब वहाँ केवल एक ही

GNU gdb (GDB) 7.1 
... 
(gdb) watch itrap_t_beg[1][222] 
Hardware watchpoint 1: itrap_t_beg[1][222] 
(gdb) cont 
Continuing. 
... 
Hardware watchpoint 1: itrap_t_beg[1][222] 

... 
(gdb) cont 
Continuing. 
Warning: 
Could not insert hardware watchpoint 1. 
Could not insert hardware breakpoints: 
You may have requested too many hardware breakpoints/watchpoints. 

(gdb) info break 
Num  Type   Disp Enb Address   What 
1  hw watchpoint keep y      itrap_t_beg[1][222] 
     breakpoint already hit 1 time 

आप देख सकते हैं, वहाँ केवल एक ही watchpoint है फिर भी यह ब्रेकप्वाइंट सम्मिलित नहीं कर सकते:

मैं निम्नलिखित डिबग सत्र है।

क्या आप जानते हैं कि मैं इसे कैसे ठीक कर सकता हूं?

+0

'itrap_t_beg' सरणी में ऑब्जेक्ट्स का प्रकार क्या है? –

+0

हाय, यह 7 इंच के साथ एक संरचना है। – Gaston

+0

[जीडीबी समस्या सेटिंग हार्डवेयर वॉचपॉइंट/सॉफ़्टवेयर वॉचपॉइंट सेट करने के तरीके] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3470704/gdb-problem-setting-hardware-watchpoint-how-to-set-software-watchpoint) – Alcaro

उत्तर

12

जहाँ तक मुझे पता के रूप में वस्तु x86 सीपीयू हार्डवेयर टूट जाता है/घड़ियों के समर्थन के लिए चार debug registers उपलब्ध है। यह ऑब्जेक्ट आकार को सीमित करता है जिसे आप देख सकते हैं। ऑब्जेक्ट संरेखण भी यहां खेलता है।

घड़ी के दायरे को एक छोटी वस्तु पर सीमित करने की कोशिश करें जैसे संरचना के पहले और अंतिम सदस्यों की जोड़ी। उपयोग watch -location itrap_t_beg[1][222], या संक्षिप्त रूप watch -l:

+0

हे! इसने काम कर दिया! धन्यवाद। अजीब बात यह है कि मैं पहली घड़ी सेट कर सकता था। शायद, उस बिंदु पर, itrap_t_beg एक char * था और फिर इसे जाल में डाला गया था * (स्रोत कोड बहुत पुराना है और ऐसी चीजें हो सकती हैं)। एक बार फिर धन्यवाद! – Gaston

+0

निश्चित रूप से, खुशी है कि काम किया। –

8

सेट चल कर सकते हैं उपयोग-hw-watchpoints 0

0

शॉट जवाब द्वारा सॉफ्टवेयर breakpoints (जो आकार की सीमा नहीं है) के लिए मजबूर कर सकते हैं।

लांग जवाब: Quoting the GDB manual:

जटिल भाव यह है कि कई चर भी संसाधनों हार्डवेयर की मदद से watchpoints के लिए उपलब्ध कर सकते हैं निकास संदर्भ देखना। ऐसा इसलिए है क्योंकि जीडीबी को अलग-अलग आवंटित संसाधनों के साथ अभिव्यक्ति में प्रत्येक चर को देखने की आवश्यकता है।

जीडीबी सचमुच अभिव्यक्ति को देखता है, जो कुछ भी इंगित करता है वह नहीं। इस मामले में, इसका मतलब है कि ब्रेकपॉइंट मारा जाएगा यदि itrap_t_beg स्वयं बदल गया है जैसे कि itrap_t_beg[1][222] करता है; itrap_t_beg[1][222] के लिए सिर्फ एक घड़ी नहीं है, बल्कि itrap_t_beg के लिए भी एक है। यह उपलब्ध होने से कहीं अधिक हो सकता है।

आपके मामले में, itrap_t_beg 7 ints, 28 बाइट है। एक x86_64 घड़ी बिंदु आठ बाइट तक है, इसलिए जीडीबी को पूरे ढांचे के लिए चार घड़ी बिंदुओं की आवश्यकता है - साथ ही itrap_t_beg के लिए पांचवां हिस्सा। X86 परिवार केवल चार एक साथ घड़ी के बिंदुओं का समर्थन करता है।

कैसे काम watchpoints पर एक अधिक व्यापक उदाहरण:

//set a watchpoint on '*p' before running 
#include <stdio.h> 
int a = 0; 
int b = 0; 
int c = 0; 
int* p = &a; 

int main() 
{ 
    puts("Hi"); // Dummy lines to make the results clearer, watchpoints stop at the line after the change 
    *p = 1; // Breaks: *p was changed from 0 to 1 
    puts("Hi"); 
    a = 2; // Breaks: a is *p, which changed from 1 to 2 
    puts("Hi"); 
    p = &b; // Breaks: p is now b, changing *p from 2 to 0 
    puts("Hi"); 
    p = &c; // Doesn't break: while p changed, *p is still 0 
    puts("Hi"); 
    p = NULL; // Breaks: *p is now unreadable 
    puts("Hi"); 
    return 0; 
} 

सिद्धांत रूप में, यह एक उपयोगी सुविधा है, आप एक जटिल अभिव्यक्ति देख सकते हैं, जैसे ही यह झूठ बोलता है, कुछ हद तक लगातार परीक्षण किए गए दावे की तरह। उदाहरण के लिए, आप उपर्युक्त कार्यक्रम में watch a==b कर सकते हैं।

व्यवहार में, यह अप्रत्याशित है, अक्सर इस मुद्दे से चलाता है, और आमतौर पर आप क्या चाहते हैं नहीं है।

केवल लक्ष्य का पता देखने के लिए, watch -location itrap_t_beg[1][222] का उपयोग करें। (यह जुलाई 2011 में जारी जीडीबी 7.3 के रूप में उपलब्ध है, यदि आप अभी भी 7.1 पर हैं, तो print &itrap_t_beg[1][222] और watch *(itrap_t)0x12345678, या जो भी पता प्रिंट करता है उसका उपयोग करें।)

+1

यह उत्तर ज्यादातर [इस प्रश्न] से क्रॉस-पोस्ट किया गया है (http://stackoverflow.com/questions/3206332/gdb-stops-with-too-many-watchpoints-when-there-is-only-one), चूंकि यह आपके लिए शीर्ष Google हिट है "आपने कई हार्डवेयर ब्रेकपॉइंट्स/वॉचपॉइंट्स का अनुरोध किया होगा।" – Alcaro

+1

कृपया एकाधिक प्रश्नों के लिए एक ही जवाब जोड़ें मत। सर्वश्रेष्ठ का उत्तर दें और शेष को डुप्लीकेट के रूप में फ़्लैग करें। देखें [क्या यह कई प्रश्नों के लिए एक डुप्लिकेट उत्तर जोड़ने के लिए स्वीकार्य है?] (Http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-add-a-duplica te-answer-to- कई-प्रश्न) –

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