2013-06-10 3 views
13

मैं for लूप में एक रहस्यमय इटरेटर समस्या को ट्रैक करने का प्रयास कर रहा हूं। मुझे इटरेटर के operator!= में एक त्रुटि मिलती है जिसका आम तौर पर मतलब है कि तुलना करने वाले इटरेटर्स एक ही कंटेनर से संबंधित नहीं हैं। पुस्तकालय के माइक्रोसॉफ्ट के कार्यान्वयन में ट्रेसिंग, operator!= कॉल operator== जहां इस परीक्षण सत्य है:घटनाओं का असंभव अनुक्रम

मैंने लिखा और अधिक जानकारी प्राप्त करने की कोशिश में इस छोटे से समारोह for पाश में मेरी != को बदलने के लिए:

template<typename iter> 
bool bang_equal(const iter & left, const iter & right) 
{ 
    static int count = 0; 
    auto p1 = left._Getcont(); 
    auto p2 = right._Getcont(); 
    ATLTRACE("Iterator comparison left _Getcont()=%p right _Getcont()=%p %d\n", p1, p2, ++count); 
    MemoryBarrier(); 
    bool b = left != right; 
    MemoryBarrier(); 
    auto p3 = left._Getcont(); 
    auto p4 = right._Getcont(); 
    ATLTRACE("     left _Getcont()=%p right _Getcont()=%p %d\n", p3, p4, ++count); 
    return b; 
} 

यहां वह दिलचस्प है जहां यह दिलचस्प हो जाता है। मुझे अभी भी left != right अभिव्यक्ति में त्रुटि मिलती है और डीबगर वहां रुक जाता है, लेकिन पहले ATLTRACE को छोड़ दिया गया है या दूसरा समय से पहले चला गया है! डीबगर आउटपुट में दोनों लाइनें हैं, और count का मान डीबगर द्वारा दिखाए गए अनुसार आउटपुट की अंतिम पंक्ति से मेल खाता है।

Iterator comparison left _Getcont()=07D0B2C8 right _Getcont()=07D0B2C8 2984 
        left _Getcont()=07D0B2C8 right _Getcont()=07D0B2C8 2985 
Myprog.exe has triggered a breakpoint. 

डिस्सेप्लिब्स विंडो को देखते हुए अपेक्षित क्रम में निर्देश दिखाते हैं। मैं उलझन में हूं। क्या हो रहा है?

+1

वह कोड दिखाएं जहां आप उपयोग कर रहे हैं! =। अजीब त्रुटियों में 99.9% या अधिक उपयोगकर्ता त्रुटियां हैं, कार्यान्वयन त्रुटियों नहीं। –

+0

मार्क, मुझे पता है कि हमें आपके साथ मूल बातें शुरू करने की आवश्यकता नहीं है, लेकिन मुझे हास्य है। मुझे आपके कोड में कोई स्पष्ट ब्रेकपॉइंट दिखाई नहीं देता है, इसलिए मुझे लगता है कि यह एक ब्रेकपॉइंट है जिसे आपने डीबगर के साथ जोड़ा था। क्या आपने "सभी को पुनर्निर्माण" करने का प्रयास किया है? और क्या आप इसे डीबग या रिलीज बिल्ड पर कर रहे हैं? –

+1

मुझे बल में एक अशांति का पता लगाना है, जैसे कि एक सरणी से घिरा हुआ डेटा के समूह की चिल्लाती है और फिर अचानक चुप हो जाती है। मेरा अनुमान है कि आपके पास इस कोड के कारण आपके कोड में स्मृति भ्रष्टाचार बग है :) –

उत्तर

3

मेरा अंतर्ज्ञान मुझे बताता है कि ओकम का रेज़र यहां सबसे अधिक संभावित स्पष्टीकरण है: विशेष रूप से आप पुनरावृत्ति के दौरान पुनरावर्तक को अमान्य कर रहे हैं। तथ्य यह है कि आपके पास लूप में ++iter नहीं है और आगे यह जोर देता है कि यह प्रत्येक तत्व पर सीधे ऊपर नहीं है।

यह शायद लूप के अंदर सीधे नहीं है, लेकिन कंटेनर को लूप बॉडी से कॉल कॉल श्रृंखला के भीतर कहीं भी अलियोजित किया जाता है - यह बहुत आसान गलतियों को बनाने के लिए और पूरी तरह क्रूर करने के लिए क्रूर हैं। आपको कम से कम प्रत्येक पुनरावृत्ति पर कंटेनर के आकार को मुद्रित करना चाहिए।

यदि आपके पास लिनक्स तक पहुंच है और कोड का एक छोटा सा हिस्सा है जो समस्या को पुन: उत्पन्न करता है तो आप इसे कम करने में मदद करने के लिए वालग्रिंड का उपयोग कर सकते हैं।

+0

या आप केवल हार्डवेयर ब्रेकपॉइंट सेट कर सकते हैं जो आपकी रुचि रखने वाली मेमोरी बदल जाती है;) –

+0

@ निक बुगलिस ओपी ने संकेत दिया कि प्रश्न में तत्व प्रत्येक रन को बदलता है, इसलिए मुझे नहीं लगता कि डेटा ब्रेकपॉइंट होगा यहां सहायक –

12

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

+2

आह ... मुझे यह पता लगाना चाहिए था। मुझे इससे पहले काटा गया है। माइक्रोसॉफ्ट के हिस्से पर भयानक डिजाइन। –

+0

मुझे याद है कि अब एक ही स्थिति में ... एक से अधिक बार। – Dialecticus

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