2012-10-03 11 views
14

इसे हल्के ढंग से रखने के लिए मेरे पास एक छोटी मेमोरी समस्या है और कारण को अलग करने के लिए टूल और विचारों से बाहर चल रहा हूं।एक स्टैक स्मैशिंग बग को अलग करने के लिए उपकरण

मेरे पास एक अत्यधिक बहु थ्रेडेड (pthreads) सी/सी ++ प्रोग्राम है जिसने 4.4.4 के बाद और 4.7.1 से पहले जीसीसी के साथ अनुकूलित संकलन के तहत एक स्टैक स्मैशिंग समस्या विकसित की है।

लक्षण यह है कि धागे के निर्माण के दौरान, मुझे केवल% आरआईपी नहीं, बल्कि सभी मूल फ्रेम और अधिकांश रजिस्ट्रार 0x00 या अन्य गैर-ज्ञान पते हैं। कौन सा थ्रेड समस्या को यादृच्छिक रूप से याद करता है, हालांकि लॉग संदेशों द्वारा निर्णय लिया जाता है, यह कोड के समान हंक को अलग किया जाता है, और ऐसा लगता है कि नए धागे के निर्माण में अर्द्ध दोहराने योग्य बिंदु पर आता है।

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

धागा निर्माण कि धागा है कि अंततः ढेर स्मैश बंद होता है:


extern "C" 
{ 
static ThreadReturnVal ThreadAPI WriterThread(void *act) 
{ 
    Recorder  *rec = reinterpret_cast (act); 
    xuint64  writebytes; 
    LoggerHandle m_logger = XXGetLogger("WriterThread"); 

    if (SetThreadAffinity(rec->m_cpu_mask)) 
    { ... } 
    SetThreadPrio((xint32)rec->m_thread_priority); 

    while (true) 
    { 
    ... poll a ring buffer ... Hard Spin 100% use on a single core, this is that sort of crazy code. 
    } 
} 

मैं एक डीबग बिल्ड की कोशिश की है, लेकिन लक्षण बनाता है, -O2 या बेहतर अनुकूलित में ही मौजूद है। मैं वेलग्रिंड/Memcheck और DRD की कोशिश की है, लेकिन दोनों किसी भी मुद्दे को खोजने के लिए इससे पहले कि ढेर उड़ा रहा है (और 12hr के बारे में लेता है विफलता तक पहुँचने के लिए)

एक -O2 -Wstack-रक्षक के साथ संकलन विफल कुछ भी गलत नहीं देखता है, हालांकि -स्टैक-रक्षक के साथ एक बिल्ड-सब मुझे बग से बचाता है, लेकिन कोई त्रुटि नहीं निकलता है।

इलेक्ट्रिक-बाड़ भी जाल, लेकिन केवल ढेर के बाद ही चला गया।

प्रश्न: अपमानजनक अनुभाग को कम करने में अन्य उपकरण या तकनीक उपयोगी कैसे होंगी?

बहुत धन्यवाद, --Bill

+0

ठीक है। मैं काट दूंगा ... कौन सा ढेर टूट जाता है? –

+1

यदि यह निर्माण धागे का ढेर है, तो कुछ कोड अच्छा हो सकता है - आप नए थ्रेड/एस के पैरामीटर के रूप में क्या गुजर रहे हैं? –

+2

बस स्पष्टता के लिए, क्या आप कह रहे हैं कि यह g ++ 4.4.2 और 4.8 पर ठीक काम करता है या उन संस्करणों का परीक्षण नहीं किया गया है? –

उत्तर

4

समस्या की इस तरह के करीब पहुंच के लिए विकल्पों में से एक जोड़े:

आप एक ढेर पते पर एक हार्डवेयर ब्रेकपाइंट सेट करने से पहले भ्रष्टाचार होता है और कोशिश कर सकते आशा डिबगर टूट जाता है काफी पहले भ्रष्टाचार में एक अस्पष्ट उपयोगी डिबगिंग प्रदान करने के लिए राज्य। यहां का मुश्किल हिस्सा सही स्टैक पता चुन रहा है; इस बात पर निर्भर करता है कि अपमानजनक धागे की 'पसंद' कितनी यादृच्छिक है, यह व्यावहारिक नहीं हो सकती है। लेकिन आपकी टिप्पणियों में से एक ऐसा लगता है कि यह अक्सर नव निर्मित धागा होता है जो टूट जाता है, इसलिए यह करने योग्य हो सकता है। थ्रेड सृजन के दौरान तोड़ने की कोशिश करें, धागे के ढेर स्थान को पकड़ें, कुछ जंगली अनुमानों से ऑफसेट करें, हार्डवेयर बीपी सेट करें, और जारी रखें। इस पर आधारित है कि आप बहुत जल्दी, बहुत देर हो चुकी हैं, या बिल्कुल नहीं, अपने ऑफ़सेट को समायोजित करें, कुल्लाएं और दोहराएं। यह मूल रूप से उन्नत अनुमान है और जांच करता है, और यदि भ्रष्टाचार पैटर्न बहुत यादृच्छिक है, तो यह अत्यधिक बाधा या पूरी तरह से अप्रत्याशित हो सकता है, लेकिन यह आश्चर्य की बात है कि यह कितनी बार अर्ध-सुगम स्टैक और सफल डिबगिंग प्रयासों का कारण बन सकता है।

एक और विकल्प क्रैश डंप एकत्र करना शुरू करना होगा।क्रैश डंप के बीच पैटर्न देखने की कोशिश करें जो आपको भ्रष्टाचार के स्रोत के करीब लाने में मदद कर सकता है। शायद आप भाग्यशाली हो जाएंगे और क्रैश डंप में से एक 'स्रोत' के करीब 'तेज'/'क्रैश करेगा।

दुर्भाग्य से, इन दोनों तकनीकों में विज्ञान की अधिक कला है; वे गैर-निर्धारक हैं, भाग्य की स्वस्थ खुराक पर भरोसा करते हैं, आदि (कम से कम मेरे अनुभव में .. कहा जा रहा है कि वहां ऐसे लोग हैं जो क्रैश डंप के साथ अद्भुत चीजें कर सकते हैं, लेकिन इसमें काफी समय लगता है कौशल के उस स्तर तक पहुंचने के लिए)।

एक और पक्ष नोट: जैसा कि अन्य ने इंगित किया है, अनियमित स्मृति डीबग बनाम रिलीज मतभेदों का एक बहुत ही सामान्य स्रोत है, और आसानी से यहां आपकी समस्या हो सकती है। हालांकि, ध्यान में रखने की एक और संभावना समय अंतर है। ऑर्डर जो धागे निर्धारित होते हैं, और कितनी देर तक, डीबग बनाम रिलीज में अक्सर नाटकीय रूप से भिन्न होता है, और आसानी से सिंक्रनाइज़ेशन बग को एक में मुखौटा कर सकता है लेकिन दूसरे नहीं। ये अंतर केवल निष्पादन गति भिन्नता के कारण हो सकते हैं, लेकिन मुझे लगता है कि कुछ रनटाइम्स जानबूझकर डीबग वातावरण में थ्रेड शेड्यूलिंग के साथ गड़बड़ करते हैं।

+0

धन्यवाद सभी आपके उत्तरों और इनपुट के लिए, मैं इसे उत्तर के रूप में स्वीकार कर रहा हूं, लेकिन यदि आपके पास अधिक विचार या विचार हैं तो मैं अधिक इनपुट का स्वागत करता हूं क्योंकि मैं इस बग को अलग करने की कोशिश कर रहा हूं। –

+0

मैं उल्लेख करना भूल गया, लेकिन एक और चाल मुझे समस्याओं के इस प्रकार के लिए उपयोगी पाई गई है, यदि कोड बेस अनुमति देता है: अधिकतम थ्रेड को बदलना। बग को विश्वसनीय रूप से पुनर्निर्मित करने के लिए जरूरी समवर्ती धागे की न्यूनतम संख्या होने के कारण आम तौर पर एक दोस्ताना डिबगिंग परिदृश्य होता है। आदर्श रूप में, आप इसे दो धागे तक ले जा सकते हैं (या कभी-कभी, आप इसे एक थ्रेड के साथ दोबारा तैयार करते हैं और वास्तव में एक सिंचो बग भी नहीं है; इसे हमेशा शासन करने के लिए अच्छा है)। – WeirdlyCheezy

2

आप, शायद पाया त्रुटियों में से एक कुछ sutble त्रुटियों के लिए जाँच करने के लिए अपने बग के कारण हो सकता है एक स्थिर विश्लेषण उपकरण का उपयोग कर सकते हैं। आप इन उपकरणों पर here पर कुछ जानकारी पा सकते हैं।

+0

अच्छा प्वाइंट, मैंने इसे खोजने का प्रयास करने के लिए लिंट इत्यादि नहीं माना था। –