इसे हल्के ढंग से रखने के लिए मेरे पास एक छोटी मेमोरी समस्या है और कारण को अलग करने के लिए टूल और विचारों से बाहर चल रहा हूं।एक स्टैक स्मैशिंग बग को अलग करने के लिए उपकरण
मेरे पास एक अत्यधिक बहु थ्रेडेड (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
ठीक है। मैं काट दूंगा ... कौन सा ढेर टूट जाता है? –
यदि यह निर्माण धागे का ढेर है, तो कुछ कोड अच्छा हो सकता है - आप नए थ्रेड/एस के पैरामीटर के रूप में क्या गुजर रहे हैं? –
बस स्पष्टता के लिए, क्या आप कह रहे हैं कि यह g ++ 4.4.2 और 4.8 पर ठीक काम करता है या उन संस्करणों का परीक्षण नहीं किया गया है? –