मैं एक रनिंग प्रक्रिया की मेमोरी लीक कैसे पा सकता हूं?


19

क्या कोई रास्ता है, मैं एक चल रही प्रक्रिया की स्मृति रिसाव पा सकता हूं? मैं प्रक्रिया शुरू होने से पहले मेमोरी लीक खोजने के लिए Valgrind का उपयोग कर सकता हूं। मैं इसे चलाने की प्रक्रिया में संलग्न करने के लिए GDB का उपयोग कर सकता हूं। मैं रनिंग प्रक्रिया की मेमोरी लीक को कैसे डिबग कर सकता हूं?


Valgrind बहुत उपयोगी है, मैं भी इसे सहज ज्ञान युक्त कहूंगा।
user400344

जवाबों:


13

स्मृति को लीक करने वाले को खोजने के लिए यहां लगभग गारंटी कदम हैं:

  1. स्मृति रिसाव के कारण प्रक्रिया का पीआईडी ​​पता करें।

    ps -aux
  2. कैप्चर करें /proc/PID/smapsऔर जैसे कुछ फ़ाइल में सहेजें BeforeMemInc.txt

  3. याददाश्त बढ़ने तक इंतजार करें।
  4. फिर से कब्जा /proc/PID/smapsऔर यह बचा हैafterMemInc.txt
  5. पहले smapsऔर दूसरे smaps, जैसे के साथ अंतर खोजें

    diff -u beforeMemInc.txt afterMemInc.txt

  6. उदाहरण के लिए, पता सीमा जहां स्मृति बढ़ी है, नीचे ध्यान दें:

       beforeMemInc.txt            afterMemInc.txt
    ---------------------------------------------------
    2b3289290000-2b3289343000   2b3289290000-2b3289343000  #ADDRESS
    Shared_Clean:    0 kB       Shared_Clean:    0 kB          
    Shared_Dirty:    0 kB       Shared_Dirty:    0 kB
    Private_Clean:   0 kB       Private_Clean:   0 kB
    Private_Dirty:  28 kB       Private_Dirty:  36 kB  
    Referenced:     28 kB       Referenced:     36 kB
    Anonymous:      28 kB       Anonymous:      36 kB  #INCREASE MEM
    AnonHugePages:   0 kB       AnonHugePages:   0 kB
    Swap:            0 kB       Swap:            0 kB
    KernelPageSize:  4 kB       KernelPageSize:  4 kB
    MMUPageSize:     4 kB       MMUPageSize:     4 kB
    Locked:          0 kB       Locked:          0 kB
    VmFlags: rd wr mr mw me ac  VmFlags: rd wr mr mw me ac
  7. चलने की प्रक्रिया पर मेमोरी डंप करने के लिए GDB का उपयोग करें या coredump का उपयोग करें gcore -o process

  8. मैंने कुछ फ़ाइल में मेमोरी डंप करने के लिए रनिंग प्रोसेस पर gdb का उपयोग किया।

    gdb -p PID
    dump memory ./dump_outputfile.dump 0x2b3289290000 0x2b3289343000
  9. अब, stringsकमांड का उपयोग करें या hexdump -Cप्रिंट करने के लिएdump_outputfile.dump

    strings outputfile.dump
  10. आपको पठनीय रूप मिलता है जहाँ आप अपने स्रोत कोड में उन तारों का पता लगा सकते हैं।

  11. रिसाव को खोजने के लिए अपने स्रोत का विश्लेषण करें।


12

मुझे लगता है कि मेमॉलेक्स ठीक वही है जो आप चाहते हैं।

यह एक चल रही प्रक्रिया की मेमोरी लीक को डिबग करता है, इसे संलग्न करके, प्रोग्राम को फिर से शुरू किए बिना या टारगेट प्रक्रिया को पुनरारंभ करने से। यह उत्पादन के माहौल के लिए बहुत सुविधाजनक और उपयुक्त है।

यह GNU / Linux और FreeBSD पर काम करता है।

नोट: मैं लेखक हूँ, किसी भी सुझाव का स्वागत किया है

== EDIT ==

मैं एक और टूल लिबीक लिखता हूं , जो LD_PRELOAD द्वारा मेमोरी फ़ंक्शंस को हुक करता है।

लक्ष्य कार्यक्रम को संशोधित करने की भी आवश्यकता नहीं है। हालाँकि, आपको LD_PRELOAD के साथ प्रगति को पुनरारंभ करना होगा, आप रनिंग के दौरान डिटेक्शन को सक्षम / अक्षम कर सकते हैं।

सिग्नल सिग्नल नहीं होने से प्रदर्शन पर बहुत कम प्रभाव पड़ता है।

समान उपकरणों (जैसे mtrace) की तुलना में, यह संदिग्ध मेमोरी लीक बिंदु पर पूर्ण कॉल-स्टैक को प्रिंट करता है।


1
मैं किसी भी स्पष्ट लीक की निगरानी के लिए एक बहुत ही उपयोगी उपकरण के रूप में मेमॉल्क्स के लिए प्रतिज्ञा करता हूं। उत्पादन के सारांश आश्चर्यजनक रूप से प्रभावी हैं । लगभग ऐसा ही मैं उन्हें लिखूंगा अगर मेरे पास इसे मैन्युअल रूप से करने की प्रसंस्करण शक्ति थी। इसके लिए धन्यवाद
sehe

6

लिनक्स पर, आप अपने प्रोग्राम में mtrace को सक्षम कर सकते हैं , लेकिन यह एक कोड परिवर्तन है।

OpenBSD पर, आप मॉलॉक आँकड़े आज़मा सकते हैं ।

Google का रिसाव चेकर भी देखने लायक हो सकता है, और mtrace के विपरीत आप LD_PRELOADrecompilation से बचने के लिए उपयोग करने में सक्षम हो सकते हैं ।


0

मुझे लगता है कि कार्यक्रम के स्रोत कोड में सीधे शुरू होने के बाद आवंटन की निगरानी के लिए सहायता प्रदान किए बिना, आप भाग्य से बाहर हैं। यहां दो कारण बताए जा सकते हैं:

  • कार्यक्रम शुरू होने पर हीप चेकर्स इनिशियलाइज़ करते हैं। कुछ सटीक समय को ट्विक करने की क्षमता प्रदान करते हैं, लेकिन प्रोग्राम शुरू होने पर उन्हें शुरू करने वाले पर्यावरण चर को सेट करना होगा। ऐसा इसलिए है क्योंकि वे यह सुनिश्चित करने के लिए देखते हैं कि प्रत्येक आबंटन में एक समान सौदा है, और वे कुछ अन्यथा याद करेंगे।
  • हीप चेकिंग के लिए आमतौर पर एलिवेटेड विशेषाधिकारों या हुक की आवश्यकता होती है, जिसे ऑपरेटिंग सिस्टम द्वारा प्रदान किया जाता है। यदि प्रोग्राम शुरू होने के समय वे हुक प्रदान नहीं किए जाते हैं, तो ढेर चेकर्स उनका लाभ नहीं उठा सकते हैं। मुझे विश्वास नहीं है कि ओएसएस इन विशेषाधिकारों को कार्यक्रम शुरू करने के बाद प्रदान करता है।

यदि, हालांकि, आप प्रोग्राम वर्चुअल मशीन के अंदर चला रहे हैं, तो वह वातावरण मॉनिटरिंग आवंटन के लिए सहायता प्रदान कर सकता है। मुझे पता है कि जावा के पास कई आवंटन और कचरा संग्रह निगरानी उपकरण (जैसे विजुअल वीएम ) हैं जो रनिंग प्रोग्राम या वीएम से जुड़े हैं।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.