2010-02-21 17 views
6

मैंने अपना खुद का संदर्भ गिनती मेमोरी मैनेजर सी ++ (मज़ा के लिए) लिखा है और मुझे यकीन है कि यह सही नहीं है;)। और अब जब मैं इसका उपयोग करने की कोशिश कर रहा हूं तो मुझे यादृच्छिक सिगट्रैप संकेत मिले। अगर मैं उस मेमोरी मैनेजर के संबंध में हर पंक्ति को टिप्पणी करता हूं तो सब ठीक हो जाता है। SIGSEGV के बजाय SIGTRAP-s प्राप्त करना काफी अजीब है। मुझे पता है कि प्रोग्राम ब्रेकपॉइंट हिट करते समय सिगट्रैप फेंक दिया जाता है, लेकिन कोई ब्रेकपॉइंट सेट नहीं होता है। मैंने एक अन्य थ्रेड में पढ़ा है कि एक्सई और डीएल के निर्माण को डीबग करना अद्यतित होना चाहिए। वे अद्यतित हैं और इसलिए यह कारण नहीं है।क्या यादृच्छिक सिगट्रैप संकेत प्राप्त हो रहा है (मिनजीडब्ल्यू-जीडीबी में) स्मृति भ्रष्टाचार का संकेत है?

क्या कोई जानता है कि यह क्यों हो रहा है?

+0

चूंकि आप विंडोज़ पर हैं, तो आप लगभग निश्चित रूप से * नहीं * किसी भी सिगट्रैप्स प्राप्त कर रहे हैं (जो यूनिक्स अवधारणा हैं और विंडोज़ पर बिल्कुल लागू नहीं होते हैं)। आप वास्तव में क्या देखते हैं इसका वर्णन करने के लिए अपने प्रश्न को संपादित क्यों नहीं करते? –

+7

खैर मिनजीडब्ल्यू विंडोज़ के तहत सिगट्रैप भी कहता है। – Calmarius

उत्तर

4

Google पर खोज करने के बाद मुझे एहसास हुआ कि उन सिगट्रिप्स एमएसवीसी ++ में उन चेतावनियों के समान हैं जो कह रहे हैं "विंडोज ने xxxx.exe में ब्रेकपॉइंट ट्रिगर किया है। यह ढेर के भ्रष्टाचार के कारण हो सकता है, और एक बग blahblahblah इंगित करता है "...

तो यह हाँ लगता है, अप्रत्याशित sigtraps स्मृति corrupction संकेत कर सकते हैं (काफी अजीब ...)

और मैं अपने बग भी मिल गया। एमएम एक स्थिर पुस्तकालय में है जो एक डीएलएल से जुड़ा हुआ है। और वह स्थिर lib और dll मेरे exe से जुड़ा हुआ है। तो दो स्मृति प्रबंधक थे, एक मेरे exe में और एक मेरे डीएल में। अगर एमएम की initaialization विधि बुलाओ। इसने एमएम को अपने exe में शुरू किया लेकिन डीएल में नहीं तो डीएल बिना init के चला गया। मैंने उस स्थिर पुस्तकालय के खिलाफ अपने exe को जोड़ने से हल किया।

2

मैं अनुमान लगाता हूं कि आप बेमेल नए/डिलीट या मॉलोक/फ्री कार्यान्वयन को बुला सकते हैं - तो आपके मेमोरी मैनेजर द्वारा कुछ आवंटित किया गया था, लेकिन जब स्मृति जारी की जाती है तो आप डिफ़ॉल्ट डिलीट/फ्री कार्यान्वयन के साथ समाप्त होते हैं ।

सिग्नल पर ब्रेकपॉइंट सेट करें और देखें कि क्या फ्री() या ऑपरेटर स्टैक पर हटा है और क्या वह उस कार्य के कार्यान्वयन को है जिसे आप उम्मीद करेंगे।

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