शॉट जवाब द्वारा सॉफ्टवेयर 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
, या जो भी पता प्रिंट करता है उसका उपयोग करें।)
'itrap_t_beg' सरणी में ऑब्जेक्ट्स का प्रकार क्या है? –
हाय, यह 7 इंच के साथ एक संरचना है। – Gaston
[जीडीबी समस्या सेटिंग हार्डवेयर वॉचपॉइंट/सॉफ़्टवेयर वॉचपॉइंट सेट करने के तरीके] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3470704/gdb-problem-setting-hardware-watchpoint-how-to-set-software-watchpoint) – Alcaro