2012-11-07 13 views
5

राइट कोड उदाहरण लोड हो रहा है SIGSEGV प्राप्त करता है। यथासंभव सरल। इसमें एक खाली विधि तालिका है और मूल docpage से प्रारंभिक फ़ंक्शन की प्रतिलिपि बनाई गई है। इसमें 2 (दो) जानबूझकर त्रुटियां हैं:अजगर, जबकि सी ++ लिखा विस्तार मॉड्यूल

  • परिवर्तनीय कुछ कॉन्स्टेंट घोषित लेकिन कभी परिभाषित नहीं किया गया;

  • कुछ_फंक्शन परिभाषित किया गया है, लेकिन कभी नहीं कहा जाता है;

तो संकलित और dlopen/dlsym द्वारा खोला: के रूप में आवश्यक

sf.so: undefined symbol: someConstant 

। लेकिन अगर पायथन दुभाषिया द्वारा लोड:

#0 0x00000bd6 in ??() 
#1 0xb775c057 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag)() from /usr/local/lib/python2.7/dist-packages/sf.so 
#2 0xb6f9abb6 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)() from /usr/lib/i386-linux-gnu/libstdc++.so.6 
#3 0xb6c3fe30 in pkgInitConfig(Configuration&)() from /usr/lib/i386-linux-gnu/libapt-pkg.so.4.12 
#4 0xb6cf959e in ??() from /usr/lib/python2.7/dist-packages/apt_pkg.so 
#5 0x081949c1 in PyEval_EvalFrameEx() 
#6 0x0819af70 in PyEval_EvalCodeEx() 
#7 0x0819bb03 in PyImport_ExecCodeModuleEx() 
#8 0x0814bd40 in ??() 
#9 0x080a38c2 in ??() 
#10 0x0814c6d4 in ??() 
#11 0x081031ae in ??() 
... 

ऐसा लगता है, पायथन के लोडर कॉल std :: स्ट्रिंग निर्माता :-):

>>> from sf import * 
Segmentation fault (core dumped) 

और सबसे अजीब अजगर के पश्व-अनुरेखन कोर-फ़ाइल से फेंक दिया है।

तो, ढेर दूषित। यह अमान्य मॉड्यूल लोड करते समय या त्रुटि को संभालने के बाद इसे अनलोड करते समय होता है। नमूना कोड थोड़ा बदल गया है तो यह कभी नहीं होता है। यह व्यवहार पायथन 2.7.3/लिनक्स उबंटू 10/जीसीसी 4.6.3 पर देखा गया है और निश्चित रूप से पायथन 2.7.1/फ्रीबीएसडी 8.1/जीसीसी 4.2.1 पर नहीं दिखाया गया है।

प्रश्न:

  1. यह एक अजगर के बग है या मेरे नमूना कोड त्रुटियाँ हैं? कि स्टैक ट्रेस पर
+0

'std :: string' को' NULL' पॉइंटर्स की एक जोड़ी, 'स्ट्रिंग (होना, अंत) के साथ क्यों प्रारंभ किया जा रहा है; '? – damienh

+0

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

+2

क्या आपने कभी इसे समझ लिया था? मुझे किसी और के कोड को चलाने की कोशिश करने में एक ही समस्या है। –

उत्तर

2

आइए नज़र फिर

 
#0 0x00000bd6 in ??() 
#1 0xb775c057 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag)() from /usr/local/lib/python2.7/dist-packages/sf.so 
#2 0xb6f9abb6 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)() from /usr/lib/i386-linux-gnu/libstdc++.so.6 
#3 0xb6c3fe30 in pkgInitConfig(Configuration&)() from /usr/lib/i386-linux-gnu/libapt-pkg.so.4.12 
#4 0xb6cf959e in ??() from /usr/lib/python2.7/dist-packages/apt_pkg.so 

तो libapt-pkg.so में एक समारोह जो अपने मॉड्यूल में एक फ़ंक्शन को कॉल libstdc++.so में एक समारोह कॉल।

आपके कार्यों को कभी भी कॉल नहीं किया जा रहा है। हालांकि, आपका कोड std::string का उपयोग करता है और std::string के लिए कुछ फ़ंक्शंस को तुरंत चालू करता है, उन कार्यों को आपके *.so में शामिल किया जाता है, जो पूरी तरह से अलग *.so द्वारा उपयोग किए गए ओवरराइड करते हैं, और किसी कारण से क्रैश करते हैं, मुझे पूरी तरह से यकीन नहीं है कि क्यों।

मेरे सहज ज्ञान मुझे बताओ कि आप अपने *.sog++ के बजाय बनाने के लिए gcc इस्तेमाल किया। आपको लिंक समय पर कोई त्रुटि नहीं मिलेगी क्योंकि साझा वस्तुओं को लिंक करना इस तरह से काम नहीं करता है। आपको लोड समय पर कोई त्रुटि नहीं मिलेगी क्योंकि libstdc++संयोग से पहले ही लोड हो चुका है।

क्या आप gcc या g++ लिंक करने के लिए उपयोग कर रहे हैं? g++ का उपयोग करने का प्रयास करें।

+0

एक अंतर है, वास्तव में, कौन सा लिंकर इस्तेमाल किया जाता है। लेकिन आपके सहजता के विपरीत परिणाम, डाइट्रिच एपीपी :-) उपरोक्त क्रैश परिणाम जी ++ लिंकर के साथ प्राप्त किए गए हैं। अगर मैं लिंक करने के लिए जीसीसी का उपयोग करता हूं तो सही त्रुटि हैंडलिंग होती है। – dyomas

+0

@dyomas: "सही त्रुटि हैंडलिंग" से आपका क्या मतलब है? यह आपके मॉड्यूल की उपस्थिति जैसा दिखता है, जब 'g ++' से जुड़ा होता है, लोड होने पर पूरी तरह से असंबंधित मॉड्यूल को क्रैश करने का कारण बनता है - वास्तव में कोई समस्या निवारण समस्या नहीं, एक विनाशकारी विफलता के अधिक। –

+0

"सही त्रुटि हैंडलिंग" का मतलब पाइथन दुभाषिया से निम्नलिखित संदेश है: "आयात त्रुटि: /usr/local/lib/python2.7/dist-packages/sf.so: अपरिभाषित प्रतीक: कुछ कॉन्स्टेंट" और अगले आदेश निष्पादित करने के लिए तैयार (SIGSEGV नहीं)। जीसीसी के मामले में यह वांछित और वास्तविक है, लेकिन जी ++ से जुड़े होने पर मुझे "विनाशकारी विफलता" दिखाई देती है। यह सच है, मैं संतुष्ट हूं, धन्यवाद :-) – dyomas

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