2010-11-23 22 views
22

का उपयोग करते समय स्मृति 'संभावित रूप से खो गया' स्मृति की रिपोर्ट करता है मैं कई ग्लिब डेटास्ट्रक्चर (GHashTable, GSList इत्यादि) का उपयोग करके लाइब्रेरी विकसित कर रहा हूं। मैं वाल्ग्रिंड का उपयोग कर मेमोरी लीक के लिए अक्सर अपना कोड जांच रहा हूं। अधिकांश मुद्दों के मूल्यों को ठीक करने के लिए काफी आसान हैं, हालांकि कुछ ऐसे हैं जिन्हें मैं समझ नहीं सकता।ग्लिब डेटा प्रकार

इनमें से सभी को 'संभवतः खोया' बताया गया है। इस तरह के g_key_file_new के रूप में()

==29997== 1,512 bytes in 3 blocks are possibly lost in loss record 24 of 25 
==29997== at 0x4004B11: memalign (vg_replace_malloc.c:532) 
==29997== by 0x4004B6B: posix_memalign (vg_replace_malloc.c:660) 
==29997== by 0x5E9AC4: ??? (in /lib/libglib-2.0.so.0.1200.3) 
==29997== by 0x5EA4FE: g_slice_alloc (in /lib/libglib-2.0.so.0.1200.3) 
इसके अलावा कॉल स्टैक में नीचे

, वहाँ हमेशा एक चिकना फ़ंक्शन की कॉल है,:

valgrind स्टैकट्रेस के शीर्ष पर, मैं हमेशा एक ही 4 पुस्तकालयों को खोजने g_slist_prepend(), g_strsplit(), g_key_file_load_from_file(), g_file_get_contents()।

मेरे प्रश्न हैं:

  • किसी को भी इस पार आ गया है और इसके चारों ओर एक रास्ता मिल गया?

  • या यह कुछ है जो मैं उपेक्षा कर सकता हूं? क्या यह स्मृति संदेश का उपयोग कर ग्लिब के कारण है, जैसा कि here सुझाया गया है?

मैं उपयोग कर रहा हूँ

  • valgrind-3.5.0
  • चिकना-2.12.3
  • जीसीसी (जीसीसी) 4.1.2 20,080,704 (रेड हैट 4.1.2-48)
  • सेंटोस रिलीज 5.5 (अंतिम)

उत्तर

32

GLib में कुछ विशेषताएं है कि वेलग्रिंड भ्रमित है।

एक मेमोरी पूल (पुराने ग्लिब में g_slice, पुराने में "mem chunks") है। ये विशिष्ट ऑब्जेक्टर्स हैं जो छोटे ऑब्जेक्ट्स जैसे सूची नोड्स के लिए उपयोग किए जाते हैं। आप स्लाइस आवंटक को अक्षम करने के लिए इसका उपयोग कर सकते हैं: G_SLICE=always-malloc valgrind myprogram

एक दूसरा मुद्दा यह है कि कभी-कभी जीएलआईबी नई मेमोरी शुरू करने से बचने या मुक्त स्लाइस/टुकड़ों में मृत पॉइंटर्स को रखने से बचती है। तो एक साथ G_DEBUG=gc-friendly valgrind myprogram

निश्चित रूप से:: आप के साथ इसे ठीक कर सकते G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind myprogram

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

+0

के साथ प्रोग्राम चला रहा है G_SLICE = always-malloc के साथ प्रोग्राम चलाना कोई खोया स्मृति नहीं दिखाता है, जो मेरे संदेह की पुष्टि करता है कि मेमोरी पूल की वजह से सभी (संभव) स्मृति हानि होती है। स्पष्ट उत्तर के लिए धन्यवाद Havoc पी। – ttreitlinger

+0

हैवोक आप पुष्टि कर सकते हैं कि वैश्विक चर के बारे में आपका बयान अभी भी जीएलआईबी 2.32 के लिए सच है? धन्यवाद! –

+3

हां, उदाहरण के लिए gconvert.c "स्थैतिक GHashTable * iconv_cache" आदि (केवल एक उदाहरण) –

0

ग्लिब-2.12 काफी पुराना है।

ग्लिब-2.24 प्राप्त करने का प्रयास करें, संकलित करें और इसे स्थापित करें (--prefix =/usr/local/glib-2.24 उदाहरण के लिए) फिर अपने एप्लिकेशन को संकलित करने के लिए इसका उपयोग करें।

आप अभी भी इस किया है, चिकना मैनुअल फिर से पढ़ने की कोशिश :)

+0

दुर्भाग्यवश मैं ग्लिब के इस संस्करण के साथ फंस गया हूं, क्योंकि मैं जो सॉफ़्टवेयर विकसित कर रहा हूं, वह एक प्रबंधित सर्वर पर चला जाएगा, 2.12 डिफ़ॉल्ट संस्करण – ttreitlinger

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