2011-04-12 18 views
8

मैंने थोड़ी देर में कोई सी ++ नहीं किया है, लेकिन एक बड़ी परियोजना को समाप्त करने का फैसला किया है जिसे मैं किसी के लिए काम कर रहा था। मुझे अब निम्न त्रुटि संदेश मिल रहा है हालांकि ...सी ++ हीप भ्रष्टाचार

HEAP भ्रष्टाचार डिटेक्टेड: सामान्य ब्लॉक (# 1761) 0x17DEB940 पर। सीआरटी ने पाया कि एप्लिकेशन ने हीप बफर के अंत में स्मृति को लिखा था।

मैं उन सभी कार्यों के माध्यम से कदम उठा रहा हूं जो मैंने सोचा था कि ऐसा हो सकता है लेकिन मुझे नुकसान हुआ है। क्या इसका शिकार करने के लिए और अधिक उन्नत डिबगिंग सुविधाओं का उपयोग करने का कोई तरीका है?

+0

क्या मंच? – Potatoswatter

+0

क्षमा करें, एमएसवीसी 2008 –

+0

धन्यवाद। हे, लिनक्स, मैक और अज्ञेय उत्तरों के पहले क्या पोस्ट किए गए थे। – Potatoswatter

उत्तर

4

यह क्लासिक मेमोरी भ्रष्टाचार त्रुटि की तरह लगता है। मंच उपयोगी जानकारी होगी।

  1. मैं एक अनुमान है कि क्रम पुस्तकालय आप अपने कोड से सीधे ढेर सत्यापन कोड के लिए कॉल को जोड़ने के लिए अनुमति होगी बना देंगे: अपने कोड और यह की जटिलता को देखे बिना संभावनाओं के एक जोड़े हैं। मैं को अपने कोड में में ढेर सत्यापन कोड पर कॉल करने का सुझाव दूंगा ताकि आप यह पता लगा सकें कि गलत कहां स्थित है। आपको वह स्थान मिलेगा जहां ढेर खराब हो जाता है और आपको पता चलेगा कि यह पिछले कॉल पर ठीक था। पर उस विंडो को कम करना जारी रखें, आपको समस्या होने पर कोड की समीक्षा करने की आवश्यकता है।

  2. समान चरणों भ्रष्ट वास्तव में स्मृति में एक ही जगह, आप अपने डिबगर उपयोग करने के लिए स्मृति पर एक ब्रेकपाइंट (या watchpoint) स्थापित करने के लिए सक्षम होना चाहिए बदल रही हैं। में से कुछ परिवर्तनों का इरादा हो सकता है, लेकिन आपको पता लगाने में सक्षम होना चाहिए जो कि अपराधी है।

आप दोनों के संयोजन का उपयोग कर सकते हैं यदि आपके कोड विशेष रूप से जटिल है या चरणों इस पुन: पेश करने की जरूरत लंबे समय से कर रहे हैं - कोड का एक वर्ग है कि यह समस्या पैदा करने वाले और उसके बाद स्मृति स्थान पर एक ब्रेकपाइंट जगह को कम कि दूषित हो जाता है

डेविड

1

इंट्रूमेंट्स के साथ इसे पकड़ने का प्रयास करें।

शास्त्रीय सी त्रुटि की तरह थोड़ा लगता है। आप निश्चित हैं कि आप थोड़ी देर में या लूप के लिए एक सी सरणी (जैसे int [xyz]) से अधिक नहीं लिखते हैं? यह किसी भी त्रुटि का कारण नहीं बनता है, लेकिन आपको बहुत सी जगहों पर अजीब प्रभाव पड़ते हैं जिनके पास बग रहता है, जहां उस हिस्से से कुछ लेना देना नहीं है। : पी

2

लिनक्स पर मैं valgrind को एक उपकरण के रूप में अनुशंसा करता हूं जो आपको बताएगा कि वास्तव में क्या गलत हुआ। आप here के लिए कुछ विंडोज विकल्पों को देख सकते हैं।

+0

मैंने विंडोज़ पर सफलता के साथ शुद्धता का उपयोग किया है, लेकिन यह $$$ है। –

1

सामान्य pageheap सक्षम साथ AppVerifier का उपयोग करें। यदि आप प्रक्रिया में एक डीबगर संलग्न करते हैं और कुछ किस्मत के साथ ढेर भ्रष्टाचार करते हैं तो यह उस बिंदु पर तोड़ देगा जहां मेमोरी ब्लॉक दूषित हो जाता है (ब्लॉक द्वारा ओवररन या अंडर्रुन लिखना)। थोड़ा प्रयास के साथ आप कोड के कॉलस्टैक भी प्राप्त कर सकते हैं जो हर ढेर ब्लॉक आवंटित करता है, जो कुछ भी त्रुटि को ट्रैक करने में मदद कर सकता है।

इन त्रुटियों को ट्रैक करना मुश्किल हो सकता है, विस्तृत जानकारी के लिए उन्नत विंडोज डिबगिंग पुस्तक देखें जिसमें विषय के लिए समर्पित एक संपूर्ण अध्याय है।

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