2010-10-20 8 views
30

मेरे पास सी ++ कक्षाओं पर पाइथन एक्सटेंशन लागू किए गए हैं। मेरे पास वाल्ग्रिंड चलाने के लिए सी ++ लक्ष्य नहीं है। मैं स्मृति जांच के लिए valgrind का उपयोग करना चाहता हूँ।मैं पायथन सी ++ एक्सटेंशन के साथ वालग्रिंड का उपयोग कैसे कर सकता हूं?

क्या मैं पाइथन के साथ वालग्रिंड का उपयोग कर सकता हूं?

उत्तर

1

हाँ, आप कर सकते हैं: तुम क्या साथ valgrind को चलाने के लिए एक लक्ष्य है - यह अजगर दुभाषिया ही है:

valgrind python foo.py 

हालांकि, इसके बाद के संस्करण के परिणाम बहुत संतोषजनक नहीं हो सकता है - अजगर बनाया गया है ऑप्ट मोड में और एक विशेष मॉलोक के साथ, जो आपको झूठी सकारात्मकताओं में डूब सकता है।

आपको पहले पायथन के डीबग संस्करण के निर्माण के बेहतर परिणाम मिलेंगे। here शुरू करें।

+0

क्या आप उस लिंक को अपडेट कर सकते हैं? –

39

हां, आप पाइथन के साथ valgrind का उपयोग कर सकते हैं। आपको केवल पायथन डेवलपर्स द्वारा प्रदान की गई वालग्रिड दमन फ़ाइल का उपयोग करने की आवश्यकता है, इसलिए आपको पाइथन के कस्टम मेमोरी आवंटन/पुनर्वितरण कार्यों के कारण झूठी सकारात्मकताओं का एक गुच्छा नहीं मिलता है।

valgrind दमन फ़ाइल यहां पाया जा सकता: http://svn.python.org/projects/python/trunk/Misc/valgrind-python.supp

महत्वपूर्ण: आप दमन फ़ाइल में PyObject_Free और PyObject_Realloc के लिए लाइनों uncomment करने की जरूरत है *।

सिफारिश उपयोग वाक्य रचना है: भी

$ valgrind --tool=memcheck --suppressions=valgrind-python.supp \ 
              python -E -tt ./my_python_script.py 

देखें अजगर SVN रेपो जो valgrind साथ अजगर का उपयोग कर के विभिन्न तरीकों का वर्णन से इस README फ़ाइल: http://svn.python.org/projects/python/trunk/Misc/README.valgrind

* - वैकल्पिक रूप से, आप Pymalloc अक्षम के साथ पाइथन को पुन: संकलित कर सकते हैं, जो आपको अधिक मेमोरी लीक पकड़ने की अनुमति देता है जो आपको दिखाई नहीं देगा यदि आप केवल PyMalloc दबाते हैं।

+1

पायथन 2.7 बहुत शरारती लगता है। एक खाली स्क्रिप्ट (valgrind --leak-check = yes --suppressions = valgrind-python.supp python -tt -E "") फेडोरा 16 पर 315 संदर्भों (दबाने: 2 से 2) से 315 त्रुटियां देता है " – Ling

+1

@Ling क्या आपको 'Misc/valgrind-python.supp' में पंक्तियों को अपूर्ण करना याद है जो' PyObject_Free' और 'PyObject_Realloc' के लिए चेतावनियों को दबाता है? –

+0

मैंने किया। यही कारण है कि मैं आश्चर्यचकित था। – Ling

8

पायथन 2.7 और 3.2 में अब --with-valgrind संकलन-समय ध्वज है जो पाइथन दुभाषिया को यह पता लगाने की अनुमति देता है कि यह वाल्ग्रिंड के नीचे चलता है और PyMalloc को अक्षम करता है। यह आपको अन्यथा की तुलना में आपकी स्मृति आवंटन की अधिक सटीक निगरानी करने की अनुमति दे सकता है, क्योंकि PyMalloc बस बड़े हिस्सों में स्मृति आवंटित करता है।

+0

यह तब होता है जब आप पाइथन चलाते हैं या जब आप पाइथन संकलित कर रहे होते हैं? मैं 2.7.1 चला रहा हूं और केवल 'valgrind python --with-valgrind myscript.py' – oob

+2

क्षमा नहीं कर सका, मुझे और स्पष्ट होना चाहिए था। यह संकलन-समय का झंडा है जो पाइथन को यह पता लगाने के लिए कॉन्फ़िगर करेगा कि यह वाल्ग्रिंड के नीचे चल रहा है।कुछ विवरण यहां हैं: http://bugs.python.org/issue2422 –

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