2012-09-27 16 views
9

मुझे साझा लाइब्रेरी में मेमोरी लीक को खोजने के तरीकों को जानने की आवश्यकता है जो रिलीज बाइनरी में लोड हो जाएंगे। मुझे लगता है मैं जी चारा नहीं द्विआधारी कि शेयर की गई लाइब्रेरी जी विकल्प के साथ नहीं ले सकता लोड करता है के साथ बनाया गया साझा लाइब्रेरी मतलब।valgrind - साझा लाइब्रेरी में मेमोरी लीक पाएं

मुझे निम्नानुसार रिसाव रिपोर्ट मिलती है।

==739== at 0x4A05809: malloc (vg_replace_malloc.c:149) 
==739== by 0x84781B1: ??? 
==739== by 0x87507F5: ??? 
==739== by 0x874CF47: ??? 
==739== by 0x874E657: ??? 
==739== by 0x874F7C2: ??? 
==739== by 0x8779C0C: ??? 

कृपया मुझे बताएं कि साझा लाइब्रेरी से रिसाव का स्टैक ट्रेस कैसे प्राप्त करें?

उत्तर

6

मान लीजिए कि लीक वास्तव में आपकी साझा लाइब्रेरी से आ रही है तो मुझे नहीं लगता कि समस्या मुख्य निष्पादन योग्य में डिबगिंग की कमी है।

अधिक संभावना अपनी समस्या यह है कि निष्पादन योग्य dlclose कॉल करने से पहले इसके पूर्ण हो जाने से शेयर की गई लाइब्रेरी उतारने जाता है। इसका मतलब है कि जब लीग की जांच करने के लिए वालग्रिंड आता है तो लाइब्रेरी के लिए सभी प्रतीकों की जानकारी गायब हो जाती है क्योंकि पुस्तकालय अब लोड नहीं होता है।

यदि आप निष्पादन योग्य पुनर्निर्माण कर सकते हैं तो सबसे आसान समाधान अस्थायी रूप से इसे dlclose पर कॉल करना बंद कर सकता है ताकि लाइब्रेरी अंत तक लोड हो।

आप ऐसा नहीं कर सकते, तो, LD_PRELOAD का उपयोग कर पुस्तकालय लोड रखने की कोशिश इस तरह:

LD_PRELOAD="/path/to/library.so" valgrind my-executable 

जो उम्मीद है कि पुस्तकालय के बाद भी बंद कर दिया गया लोड रखने में गतिशील लिंकर चाल होगा ।

+0

वहां एक पैच था जिसने dlclose के बाद प्रतीकों को उतारने का विकल्प प्रदान किया था। पैच काम करता है और मैंने इसे कई बार इस्तेमाल किया है। लेकिन पैच पुराने संस्करण पर था और मुझे लगता है कि यह अब सड़ा हुआ है। https://bugs.kde.org/show_bug.cgi?id=79362 – k0n3ru

+0

@TomH: कि "छोड़ dlclose" वैकल्पिक हल झूठी सकारात्मक की बहुत सारी में परिणाम कर सकते मुझे कहना है,। वहाँ ढेर जो तत्वों को नष्ट, जो ढेर पर थे पर वस्तुओं रहे हैं, तो इन, लीक के रूप में उत्पादन में दिखाया गया है क्योंकि dlclose पहली जगह में नष्ट किया होता रहे थे। – newhouse

+0

और दूसरा एक के रूप में अच्छी तरह से काम नहीं करता है, अगर valgrind 64 बिट है, लेकिन आप 32 डिबग – newhouse

2

जैसा कि पिछले उत्तर से पता चलता है, ऐसा इसलिए है क्योंकि प्रोग्राम समाप्त होने से पहले आपने अपनी लाइब्रेरी बंद कर दी है और इसलिए प्रतीकात्मक जानकारी वाल्ग्रिंड के लिए उपलब्ध नहीं है।

एलडी_PRELOAD का उपयोग करना मेरे लिए काम नहीं करता; अब मेरे पास दो बिल्ड हैं; एक जो स्पष्ट रूप से dlclose() को कॉल नहीं करता है; इस निर्माण पर, valgrind सही ढंग से लाइन नंबर की जानकारी रिपोर्ट करता है क्योंकि आप गतिशील लिंकिंग के साथ अपेक्षा करेंगे।