2012-06-12 13 views
24

मैं जीडीबी में एक प्रोग्राम डीबग कर रहा हूं और मैं प्रोग्राम को रोकना चाहता हूं जब स्मृति क्षेत्र 0x08049000 से 0x0804a000 तक पहुंचा जा सके। जब मैं मैन्युअल ब्रेकपॉइंट्स मैन्युअल रूप से सेट करने का प्रयास करता हूं, तो gdb एक समय में दो से अधिक स्थानों का समर्थन नहीं करता है।जीडीबी में मेमोरी रेंज देखें?

(gdb) awatch *0x08049000 
Hardware access (read/write) watchpoint 1: *0x08049000 
(gdb) awatch *0x08049001 
Hardware access (read/write) watchpoint 2: *0x08049001 
(gdb) awatch *0x08049002 
Hardware access (read/write) watchpoint 3: *0x08049002 
(gdb) run 
Starting program: /home/iblue/git/some-code/some-executable 
Warning: 
Could not insert hardware watchpoint 3. 
Could not insert hardware breakpoints: 
You may have requested too many hardware breakpoints/watchpoints. 

वहां पहले से ही एक सवाल जहां इस लिए कहा गया है और जवाब था, कि यह valgrind साथ ऐसा करना संभव हो सकता है। दुर्भाग्य से उत्तर में वाल्ग्रिंड मैनुअल के लिए कोई उदाहरण या संदर्भ नहीं है, इसलिए यह बहुत प्रबुद्ध नहीं था: How can gdb be used to watch for any changes in an entire region of memory?

तो: मैं पूरे मेमोरी क्षेत्र को कैसे देख सकता हूं?

+0

दिलचस्प तथ्य यह है के लिए the Valgrind user manual on gdb integration देखें http://stackoverflow.com/questions/ 13410 9 41/सेट-ब्रेकपॉइंट-ऑन-हर-लाइन-इन-जीडीबी/31658056 # 31658056 –

+0

x86 8 बाइट तक छोटी घड़ी श्रेणियों का समर्थन करता है: https://en.wikipedia.org/wiki/X86_debug_register –

उत्तर

23

यदि आप Valgrind 3.7.0 के साथ GDB 7.4 का उपयोग करते हैं, तो आपके पास असीमित "नकली" हार्डवेयर घड़ी बिंदु हैं।

वेलग्रिंड के तहत अपने कार्यक्रम शुरू

, तर्क --vgdb=full --vgdb-error=0 दे रही है तो यह (target remote | vgdb) से कनेक्ट करने GDB का उपयोग करें। फिर आप उदास कर सकते हैं PowerPC लेकर है breakpoints (? लेकिन नहीं watchpoints): watch या awatch या rwatch rwatch (char[100]) *0x5180040

करके एक स्मृति सीमा अधिक जानकारी के

+2

बेहतर भाग लेने के बाद 'mprotect' के साथ झुकाव और SIGSEV हैंडलर को स्मृति पहुंच को तोड़ने के लिए दुर्व्यवहार करने के दिन, मैंने कोशिश की। यह पूरी तरह से काम करता है। आपने मेरा दिन बचाया धन्यवाद! – iblue

+0

हां, +1 भी। मैं महीनों के लिए इस तरह की एक सुविधा के लिए शिकार कर रहा हूँ। – Crashworks

+0

तो, वाल्ग्रिंड द्वारा शुरू की गई प्रक्रिया के लिए एक ढेर पता कैसे निर्धारित करता है? मैं आमतौर पर */proc/[pid]/maps * के माध्यम से ऐसा करता हूं लेकिन जब मैं इस valgrind कमांड के माध्यम से पायथन शुरू करता हूं, तो मैप्स फ़ाइल में ** [heap] ** द्वारा पहचाना जाने वाला एंट्री नहीं है जैसा कि मुझे खोजने के लिए उपयोग किया जाता है । –

10

सुविधा है जब एक स्मृति पता बदल गया है a hardware breakpoint कहा जाता है, और यह वास्तव में सीपीयू — स्मृति नियंत्रक जब एक विशिष्ट पते पर पहुंचने पर पता चलता है कि अंदर एक रजिस्टर की एक विशेषता है, और एक डिबगर तोड़ बाधा से चलाता है का पता लगाता है कि। दुर्भाग्य से the x86 architectureonly has four such registers और यही कारण है कि आप सेट कर सकते हैं मेमोरी घड़ी ब्रेकपॉइंट्स की संख्या में सीमित हैं।

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