2009-10-05 4 views
16

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

valgrind python -c "" 

वेलग्रिंड इस तरह बार-बार जानकारी से भरा उत्पादन:

==12317== Invalid read of size 4 
==12317== at 0x409CF59: PyObject_Free (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x405C7C7: PyGrammar_RemoveAccelerators (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x410A1EC: Py_Finalize (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x4114FD1: Py_Main (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x8048591: main (in /usr/bin/python2.5) 
==12317== Address 0x43CD010 is 7,016 bytes inside a block of size 8,208 free'd 
==12317== at 0x4022F6C: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) 
==12317== by 0x4107ACC: PyArena_Free (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x41095D7: PyRun_StringFlags (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x40DF262: (within /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x4099569: PyCFunction_Call (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x40E76CC: PyEval_EvalFrameEx (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x40E70F3: PyEval_EvalFrameEx (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x40E896A: PyEval_EvalCodeEx (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x40E8AC2: PyEval_EvalCode (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x40FD99C: PyImport_ExecCodeModuleEx (in /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x40FFC93: (within /usr/lib/libpython2.5.so.1.0) 
==12317== by 0x41002B0: (within /usr/lib/libpython2.5.so.1.0) 

अजगर 2.5। Slackware 12.2 पर 2।

क्या यह सामान्य व्यवहार है? यदि ऐसा है तो पाइथन में स्मृति त्रुटियों को डीबग करने के लिए शायद वालग्रिंड अनुचित उपकरण है?

उत्तर

22

आप suppression file कि अजगर स्रोत

Python Valgrind README पढ़ना एक अच्छा विचार भी है के साथ आता है का उपयोग कर की कोशिश कर सकते!

+0

के रूप में एक उच्च स्तरीय नोट: सामान्य वालग्रिंड में कस्टम आवंटकों के साथ कुछ मदद की आवश्यकता होती है क्योंकि यह एक कस्टम आवंटक के व्यवहार को समझने में सक्षम नहीं है क्योंकि यह मानक कार्यान्वयन हो सकता है। – Falaina

+0

इसलिए, यदि मैं वाल्ग्रिंड रीडमे को सही ढंग से पढ़ता हूं, तो मैं वास्तव में अपने पाइथन वितरण को संकलित किए बिना एक पायथन सी एक्सटेंशन डीबग करने के लिए वालग्रिंड का उपयोग नहीं कर सकता ?! –

0

हां, यह सामान्य है। बड़े सिस्टम अक्सर स्मृति को मुक्त नहीं करते हैं, जो कि तब तक ठीक है क्योंकि यह निरंतर राशि है, और सिस्टम के चल रहे इतिहास के आनुपातिक नहीं है। पाइथन दुभाषिया इस श्रेणी में आता है।

शायद आप अपने सी एक्सटेंशन में किए गए आवंटन पर ध्यान केंद्रित करने के लिए वाल्ग्रिंड आउटपुट फ़िल्टर कर सकते हैं?

2

यह किसी भी बड़े पैमाने पर प्रणाली में काफी आम है। आप का उपयोग वेलग्रिंड के suppression system स्पष्ट रूप से चेतावनी है कि आप में कोई दिलचस्पी नहीं कर रहे हैं को दबाने के लिए कर सकते हैं।

0

मुझे एक और विकल्प मिला है। जेम्स हेनस्ट्रिज के पास पाइथन का कस्टम निर्माण है जो इस तथ्य का पता लगा सकता है कि पाइथन वाल्ग्रिंड के नीचे चल रहा है और इस मामले में पिमलोक आवंटक अक्षम है, PyObject_Malloc/PyObject_Free सामान्य मॉलोक/फ्री के माध्यम से गुजर रहा है, जो वाल्ग्रिंड ट्रैक को ट्रैक करने के बारे में जानता है।

पैकेज यहाँ उपलब्ध है: https://launchpad.net/~jamesh/+archive/python

1

सबसे सही विकल्प वेलग्रिंड बताने के लिए है कि यह पायथन के आवंटन कार्यों रोकना चाहिए। आप पैच चाहिए valgrind/coregrind/m_replacemalloc/vg_replace_malloc.c PyObject_Malloc, PyObject_Free, PyObject_Realloc, के लिए नए इंटरसेप्टर जैसे जोड़ने:

ALLOC_or_NULL(NONE,     PyObject_Malloc,  malloc); 

(ध्यान दें कि उन आवंटन कार्यों के लिए soname होना चाहिए NONE)

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