2008-12-22 20 views
6

मेरे पास एमएस वीसी ++ 6.0 में कुछ कोड है जो मैं डिबगिंग कर रहा हूं। किसी कारण से, इस निश्चित बिंदु पर जहां मैं कुछ गतिशील रूप से आवंटित स्मृति को हटाने की कोशिश कर रहा हूं, यह टूट जाता है और मुझे एक पॉप अप संदेश बॉक्स मिलता है जिसमें कहा गया है कि "ब्ला ब्लाह पर कोड से बुलाया गया उपयोगकर्ता ब्रेकपॉइंट" .. फिर Disassembly विंडो पॉप अप और मैं देखकहीं भी उपयोगकर्ता ब्रेकपॉइंट

*memory address* int  3 

अजीब बात है, वहाँ कोड है कि मैं इस तरह एक विधानसभा अनुदेश बोल रहा हूँ में कहीं नहीं है (मैं एएसएम लगता है 3 int x86 के लिए एक हार्डवेयर को तोड़ने आदेश है?) ..

क्या यह कारण हो सकता है?

संपादित करें: उत्तर: मेरा कोड एक सरणी के "अंत से बाहर निकलना" था, लेकिन केवल 0xFDFDFDFD के साथ विजुअल स्टूडियो डीबग द्वारा चिह्नित स्थानों में, जिसे नोमैन लैंड बाड़ कहा जाता है .. मुझे लगता है कि इसे एक भी कहा जाता है। एक-एक-एक त्रुटि .. यह सरणी उस बिंदु से असंबंधित थी जहां त्रुटि उत्पन्न होने पर मैं स्मृति को मुक्त कर रहा था। कौन सा यह मुश्किल को पहचानना बनाया .. :(

+0

बस उत्सुक - क्या आपको यह पता लगाने के लिए असेंबली निर्देशों को एक-एक करके कदम मिला कि डीबग ढेर को कुछ अन्य टूल/तकनीक किस तरह पसंद नहीं आया या नहीं? –

+0

मैंने इस साइट को देखा http://www.highprogrammer.com/alan/windev/visualstudio.html जो कहता है: कि 0xFDFDFDFD एक स्मृति मान था कि MSVC++ डीबगर एक सरणी में सीमा को इंगित करने के लिए उपयोग किया जाता है ताकि ऑफ-बाय- एक गलती .. मैंने अपने पॉइंटर्स की जांच की और एकल में पुनरावृत्तियों के माध्यम से कदम रखा .. – krebstar

+0

स्रोत कोड और पाया कि मैंने अपने सरणी में से एक को ठीक से बाध्य नहीं किया है .. तो मुझे लगता है कि यह मेरे पॉइंटर्स को सही तरीके से जांचने की आवश्यकता है :) – krebstar

उत्तर

8

आप शायद डिबग ढेर दिनचर्या कि ढेर भ्रष्टाचार पाया है में कोड कम पड़ रहा है।

क्या करता है जब आप इंट 3 पर पहुंच जाते हैं की तरह कॉल स्टैक नज़र ?

संपादित करें: अपनी टिप्पणी में स्टैक ट्रेस के आधार पर, दिनचर्या _CrtIsValidHeapPointer() कह रही है कि सूचक मुक्त कर दिया जा रहा है बुरा है यहाँ MSVC के DBGHEAP.C स्रोत से कोड का स्निपेट है:।

/* 
    * If this ASSERT fails, a bad pointer has been passed in. It may be 
    * totally bogus, or it may have been allocated from another heap. 
    * The pointer MUST come from the 'local' heap. 
    */ 
    _ASSERTE(_CrtIsValidHeapPointer(pUserData)); 

pUserData हैं वैल बनो जिस सूचक को आप हटा रहे हैं उसके कारण।

+0

एनटीडीएलएल! 7c90120e() एनटीडीएलएल! 7c95d454() एनटीडीएलएल! 7c96c5cf() एनटीडीएलएल! 7c9603b0() केरनेल 32! 7c85f8d7() – krebstar

+0

_CrtIsValidHeapPointer (स्थिरांक शून्य * 0x04880068) लाइन 1697 _free_dbg_lk (शून्य * 0x04880068, पूर्णांक 1) लाइन 1044 + 9 बाइट्स _free_dbg (शून्य * 0x04880068, पूर्णांक 1) लाइन 1001 + 13 बाइट्स ऑपरेटर हटाना (शून्य * 0x04880068) लाइन 351 + 11 बाइट – krebstar

+0

कुछ ऐसी चीज ... – krebstar

3

(मुझे लगता है कि एएसएम पूर्णांक 3 एक्स 86 के लिए एक हार्डवेयर तोड़ आदेश है?

यह है। यह "हार्डवेयर ब्रेकप्वाइंट" कहा जाता है। आप के साथ वी.एस. डिबगर उपयोग कर रहे हैं प्रोजेक्ट सोर्स कोड, यह ब्रेकपॉइंट की तरह है (लेकिन कोड में)। चूंकि आपका आवेदन किसी भी डीबगर के बिना लॉन्च किया गया है, तो एप्लिकेशन बस क्रैश हो जाएगा, जैसे कि यह एक अप्रबंधित अपवाद लॉन्च करता है।

बहुत सारे कंपनियों नहीं, कोड में उस ब्रेकपॉइंट को जोड़ने के लिए उपयोग किया जाने वाला एक सरल मैक्रो है। यही कारण है कि जगह ले सकता है इस बात पर ज़ोर और कुछ (हार्ड और दुर्लभ) मामलों में अपवाद:

#define BREAKPOINT __asm { int 3; } 

BREAKPOINT; 

देखें:

तो मैं कुछ मैक्रो या वस्तु रखने का सुझाव ऐसा कर रहा है, या शायद यह एक मॉड्यूल (डीएलएल/lib) में संलग्न है कि आपके पास कोड नहीं है?

+0

हां प्रोग्राम में खोला गया कुछ डीएल/lib है, और मेरे पास इसके लिए स्रोत कोड नहीं है। हालांकि मुझे नहीं लगता कि यह कारण है .. माइकल बुर की अधिक संभावना है .. वैसे भी धन्यवाद :) – krebstar

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