Wednesday, 15 June 2011

c++ - Debugging an assertion with gdb shows weird std::string size -


मुझे सी ++ प्रोग्राम में एक अभियोग के साथ समस्या है।

  HA_Archive & amp; HA_Archive :: ऑपरेटर & lt; & lt; (कॉन्स्ट स्ट्रिंग & स्ट्र) {बफर [wcursor] = HA_TYPE_STRING; wcursor ++; अहस्ताक्षरित आकार = str.size (); कैसर ((बफर साइज़ & gt; विकर्स + आकार), "बफर अधिकतम से अधिक है");  

CASSERT एक सरल जोर है, और समस्या है।

इस प्रोग्राम ने एक कोर डंप छोड़ा है जिसे मैंने जीडीबी के साथ डिबग किया है, और मुझे कुछ अजीब बात है। / P>

  प्रोग्राम सिग्नल 6 के साथ समाप्त हो गया, निरस्त # 0 __kernel_vsyscall में 0xb7766424 () (gdb) # 0 0xb7766424 __kernel_vsyscall में () # 1 0xb6cd1cb1 बढ़ाने में () bt /lib/libc.so.6 # से 2 0xb6cd33e8 /lib/libc.so.6 से बीच में बंद करें () में # 3 0xb6ccb58c में __assert_fail () से /lib/libc.so.6 # 4 0x086c6dbd में HA_Archive :: ऑपरेटर & lt; & lt; (यह = 0xb2610fb8, str = @ 0xb49e1f08) HA_Archive.cxx पर: 94 # 5 0x0849b4d3 PortDriver में :: serialize (यह = 0xb49e1ed8, ए आर = @ 0xb2610fb8) PortDriver.cxx पर: 624 # 6 0x0838ed80 PortSession में :: serialize (इस = 0xb49e1630, ए आर = @ 0xb2610fb8) PortSession / PortSession.h पर: 71 (gdb) फ्रेम 4 # 4 0x086c6dbd HA_Archive में :: ऑपरेटर के & lt; & lt; (यह = 0xb2610fb8, str = 0xb49e1f08) पर HA_Archive.cxx: 94 94 HA_Archive.cxx: ऐसा कोई फ़ाइल या निर्देशिका नहीं है में HA_Archive.cxx (gdb) प्रिंट str $ 1 = (स्थिरांक स्ट्रिंग & amp;) @ 0xb49e1f08: {स्थिर एनपीओ = 4294967295, _M_dataplus = {& LT; std :: संभाजक & LT; चार & gt; & gt; = {& Lt; __ gnu_cxx :: नया_ऑलोकेटर & lt; char & gt; & gt; = {& LT; कोई डेटा क्षेत्रों & gt;} & lt; कोई डेटा क्षेत्रों & gt;}, _M_p = 0xb322f9b4 "नहीं-सेट"}} (gdb) प्रिंट wcursor $ 2 = 180 (gdb) प्रिंट bufferSize $ 3 = 4096 (gdb) प्रिंट आकार $ 4  स्ट्र  प्रिंट करना मैं देख सकता हूं कि इसमें  "NOT-SET"  है और वह ठीक है, लेकिन जब मैं प्रिंट करता हूँ वैरिएबल  आकार  जो  str.size ()  है वह बड़ा बड़ा है! जाहिर है कारण यह है कि इस बात पर ज़ोर विफल रहता है, क्योंकि bufferSize 4096 और wcursor केवल 180 है बनाते हैं।  

मैं बहुत दूर हूँ हो सकता है और gdb में विशेषज्ञ करने के लिए तो मेरा पहला सवाल है, तो है मैंने कुछ गलत तिनका यह कर रहा हूँ । शायद आकार रनटाइम पर वास्तविक मान नहीं है?

मेरा दूसरा प्रश्न यह है: अगर जीडीबी आकार का सही मूल्य दिखा रहा है, तो मैं इसे मुद्रित करते समय स्ट्रिंग "NOT-SET" को सही तरीके से क्यों देख रहा हूं, लेकिन आकार बहुत बड़ा है?

धन्यवाद!

कुछ तरीके हैं यह हो सकता है।

स्ट्रिंग वास्तव में उस आकार का हो सकता है, लेकिन सामग्री में स्ट्रेट [7] पर एक नूल अक्षर हो सकता है, जिससे जीडीबी इसे प्रिंट करना बंद कर देगी।

या हो सकता है कि कुछ आपके ढेर पर लिखा गया है और उस मेमोरी स्थान को ओवरराइट कर दिया है जो स्ट्रिंग के आकार को संग्रहीत करता है, यद्यपि सामग्री अभी भी केवल 7 बाइट्स लंबे आकार के सदस्य को कचरे के साथ ओवरराइट कर दी गई है।

या Str एक लंपट संदर्भ हो सकता है और "code-_m_p" द्वारा इंगित करने वाली मेमोरी में अभी भी "NOT-SET" स्ट्रिंग शामिल है लेकिन मेमोरी में आकार वाले सदस्य को कुछ और के लिए पुनः उपयोग किया गया है

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


No comments:

Post a Comment