2008-12-15 12 views
6

मैं एक अपाचे मॉड्यूल में dlopen() का उपयोग कर रहा हूं जिसे मैं लिख रहा हूं ताकि मेरे मॉड्यूल के लिए प्लगइन सिस्टम हो। मैंने पाया है कि अगर मैं अपने मॉड्यूल को संकलित करता हूं, मेरी प्लगइन संकलित करता हूं, और अपाचे शुरू करता हूं, तो सब कुछ peachy-उत्सुक काम करता है।_dl_close Assertion विफलता

यदि, हालांकि, मैंने यह सब करने के बाद, मैं अपनी प्लगइन को दोबारा जोड़ता हूं, (प्लगइन कोड में एक छोटा बदलाव या दो बना देता हूं), मेरे अगले पृष्ठ लोड से अपाचे को segfault का कारण बन जाएगा। प्रत्येक अनुवर्ती अनुरोध फिर से ठीक काम करता है। इस प्रकार, यह संकलन के तुरंत बाद पहला पृष्ठ लोड होता है जो segfault का कारण बनता है।

मैं और आज (मैं सी डिबगिंग में महान नहीं कर रहा हूँ) कुछ दिनों के लिए इस से निपटने की कोशिश कर रहा हूँ, मैं अपने अपाचे त्रुटि लॉग में इस पर ध्यान:

Inconsistency detected by ld.so: dl-close.c: 719: _dl_close: Assertion `map->l_init_called' failed! 

किसी को भी किसी भी विचार क्या है चल रहा? क्या इसका मतलब यह मेरा कोड नहीं है और मैं एक प्रेत बग शिकार कर रहा हूं? मुझे काफी विश्वास है कि मैं प्रत्येक कॉल के लिए dlopen() को dlcose() कहते हैं। हालांकि, यह विशेष बग/segfault तब होता है जब मैं एकल प्रक्रिया मोड में अपाचे चलाता हूं और पृष्ठ को तुरंत रीफ्रेश करना प्रारंभ करता हूं।

उत्तर

5

कुछ विचार:

  1. शायद आप dlopen() अधिक तो एक बार कहते हैं? dl पुस्तकालय संदर्भ काउंटरों जो हर dlopen() तो dlclose() पर वृद्धि की जाती है पुस्तकालय ही अगर काउंटर == 0.

  2. आप RTLD_NODELETE झंडा dlopen() के लिए निर्दिष्ट किया उतारना होगा रखता है (यह मानते हुए आप लिनक्स पर कर रहे हैं)? यदि हां, dlclose() आपकी लाइब्रेरी को अनलोड नहीं करेगा।

क्या आपने strace के साथ सिस्कोल डीबग करने का प्रयास किया था? अपाचे शुरू करें, strace -p<pid> पर कॉल करके अपने सिड को ढूंढें और सभी सिस्को का पता लगाएं अपाचे करता है। शायद यह आपको कुछ विचार देगा कि क्या हो रहा है।

+0

प्रतिक्रिया के लिए धन्यवाद! मैं RTLD_NODELETE का उपयोग नहीं कर रहा हूं। मुझे पूरा यकीन है कि मैं प्रत्येक कॉल के लिए dlopen (हालांकि कोड में अलग-अलग बिंदुओं पर) के लिए dllcose बुला रहा हूँ।) मैं एक और बार जांचूँगा। –

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