2014-06-18 3 views
5

पर मुक्त कर दिया जाता है मान लें मैं एक सी प्रोग्राम (लिनक्स के तहत चल रहा है), जो कई डाटा संरचनाओं, कुछ जटिल है, जिनमें से कई के बढ़ने और हटना नहीं बल्कि सामान्य रूप में समय के साथ बढ़ती चाहिए कर सकते हैं manipulates है। इस कार्यक्रम को धीरे-धीरे आरएसएस के साथ बढ़ते समय देखा जाता है (स्मृति विखंडन द्वारा समझाया जा सकता है)। मैं लीकिंग क्या ढूंढना चाहता हूं। valgrind के तहत चल रहा है स्पष्ट सुझाव यहां, लेकिन valgrind (--leak-check=full और --show-reachables=yes के साथ) कोई रिसाव से पता चलता है। मेरा मानना ​​है कि ऐसा इसलिए है क्योंकि डेटा संरचनाओं को स्वयं बाहर निकलने पर मुक्त किया जा रहा है, लेकिन उनमें से एक कार्यक्रम के जीवन के दौरान बढ़ रहा है। उदाहरण के लिए, एक लिंक्ड सूची हो सकती है जो समय के साथ रैखिक रूप से बढ़ रही है, किसी व्यक्ति सूची में संसाधन को हटाने के लिए भूल जाता है, लेकिन निकास क्लीनअप बाहर निकलने पर सूची में सभी आइटमों को सही ढंग से मुक्त कर देता है। एक दार्शनिक सवाल यह है कि क्या वे वास्तव में 'लीक' हैं, यदि वे मुक्त हैं, तो निश्चित रूप से (इसलिए प्रश्न में उद्धरण चिह्न) हैं।का पता लगाने सी स्मृति 'लीक' है कि बाहर निकलने के

इस उपकरण के लिए किसी भी उपयोगी उपकरणों वहाँ हैं? मुझे क्या पसंद है valgrind के तहत चलाने की क्षमता है और यह मौजूदा आवंटन की एक रिपोर्ट तैयार करता है जैसा कि यह बाहर निकलने पर करता है, लेकिन यह संकेत पर होता है और कार्यक्रम को जारी रखने की अनुमति देता है। मैं तब देख सकता था कि स्टैक ट्रेस हस्ताक्षर उनके खिलाफ आवंटन बढ़ रहा था।

मैं gdb से generate-core-file के साथ विश्वसनीय रूप से एक अच्छी बड़ी 'कोर' फ़ाइल प्राप्त कर सकता हूं; वहाँ कुछ रास्ता है कि बंद लाइन का विश्लेषण करने के अगर मैं एक आसान malloc() डिबगिंग पुस्तकालय कि malloc() instrumented साथ संकलित कहना है?

मेरे पास स्रोत तक पूर्ण पहुंच है, और इसे संशोधित कर सकता है, लेकिन मैं वास्तव में हर डेटा संरचना को मैन्युअल रूप से वाद्य यंत्र नहीं करना चाहता हूं, और इसके अलावा मुझे समस्या के सामान्य समाधान में रुचि है (जैसे valgrind प्रदान करता है) इस विशेष मुद्दे को कैसे हल करें।

मैं यहाँ पर इसी तरह के सवाल के लिए देखा है, लेकिन वे दिखाई देते हैं सब होने के लिए:

  • क्यों मेरी कार्यक्रम रिसाव स्मृति करता है?
  • मैं बाहर निकलने पर मेमोरी लीक का पता कैसे लगा सकता हूं? (मेरे लिए कोई उपयोग नहीं)
  • मैं कोर फ़ाइल से मेमोरी लीक का पता कैसे लगा सकता हूं? अगर मैं सोलारिस के तहत चल रहा था मैं उत्तर का अनुमान कर रहा हूँ होगा 'इस आसान dtrace स्क्रिप्ट का उपयोग' हो (महान, लेकिन कोई भी एक संतोषजनक उत्तर नहीं है)

+0

मैं वाल्ग्रिंड का बहुत धन हूं और मुझे यकीन है कि वाल्ग्रिंड आपको इन "लीक" दिखाएगा। यदि आप सूची प्रविष्टि को मुक्त करते हैं और सूची प्रविष्टि के भीतर संसाधनों को मुक्त करना भूल जाते हैं तो ये "निश्चित रूप से खोए गए" के रूप में वाल्ग्रिंड में दिखाई देंगे। बस '--show-reachables = yes' का उपयोग न करें क्योंकि यह जो मैंने अभी समझाया है उसे छुपाएगा, क्योंकि यह वास्तव में पहुंच योग्य नहीं है। – Montaldo

+1

वह सिर्फ शब्दावली से उलझन में है। जब तक स्मृति पहुंच योग्य हो, तब तक यह खो या लीक नहीं होती है। कृपया प्रश्न को फिर से लिखें, और "रिसाव" शब्द का उपयोग करने से बचें। यह एक रिसाव नहीं है। –

+0

@Montaldo मैं 'valgrind' से बहुत परिचित हूं; यह मुझे रिसाव नहीं दिखाता क्योंकि उन्हें बाहर निकलने पर मुक्त किया जाता है। – abligh

उत्तर

5

वेलग्रिंड एक gdbserver भी शामिल है। इसका मूल रूप से मतलब है कि आप इसे जोड़ने के लिए जीडीबी का उपयोग कर सकते हैं, और उदा। एक रिसाव डंप जारी करें, या चलते समय सभी पहुंच योग्य स्मृति दिखाने के लिए। चिंता, आपको यह तय करना होगा कि क्या "मेमोरी रिसाव" है या नहीं, क्योंकि वाल्ग्रिंड को पता नहीं है कि एप्लिकेशन लॉजिक में कोई बग है जो स्मृति को रिलीज़ करने में विफल रहता है, लेकिन फिर भी इसका संदर्भ रखें।--vgdb साथ

भागो valgrind = हाँ झंडा और उसके बाद कमांड चलाने:

valgrind --vgdb=yes --leak-check=full --show-reachable=yes ./yourprogram 
gdb ./yourprogram 
(gdb) target remote | vgdb 
(gdb) monitor leak_check full reachable any 

, अधिक जानकारी के लिए डॉक्स देखें here और here

आप भी अपने कार्यक्रम में इस programatically कर सकते हैं

#include <valgrind/memcheck.h> 

और कोड में एक उपयुक्त जगह पर कार्य करें:

VALGRIND_DO_LEAK_CHECK; 

(iirc कि पहुंच योग्य स्मृति भी, जब तक दिखाता हूँ के रूप में valgrind --show-पहुंच योग्य साथ चलाया जाता है = हाँ

+0

धन्यवाद - यह शानदार रूप से उपयोगी दिखता है, खासकर VALGRIND_DO_ADDED_LEAK_CHECK। अगर मैं एक फाइल में आउटपुट प्राप्त कर सकता हूं तो यह बेहतर होगा, लेकिन मेरे पास एक पोक होगा। – abligh

+0

आप हमेशा एक फ़ाइल में stdout/stderr को रीडायरेक्ट कर सकते हैं, और मुझे यकीन है कि gdb में फ़ाइल को आउटपुट को सहेजने के लिए कुछ कमांड हैं। – nos

+0

मैंने कोशिश नहीं की है, लेकिन मुझे लगता है कि * प्रोग्रामिक * कॉल लक्ष्य के एसटीडीईआरआर पर दिखाई देंगे? इस मामले में यह '/ dev/null' को निर्देशित किया गया है (यह एक डिमन है)। वैसे भी, यह हल करने के लिए एक मामूली मुद्दा है। – abligh

1

Valgrind Massif उपकरण जो आपके आवेदन के सामान्य स्मृति उपयोग, बस के लिए नहीं पता चलता है लीक मेमोरी यह malloc() एस और free() एस को फ़ंक्शन और उनके बैकट्रैसेस को कॉल करके टूट जाता है, ताकि आप देख सकें कि कौन से फ़ंक्शंस इसे रिलीज़ किए बिना स्मृति आवंटित करते रहते हैं। आपके द्वारा उल्लिखित प्रकार के लीक खोजने के लिए यह एक उत्कृष्ट टूल हो सकता है।

दुर्भाग्यवश मैसिफ़ के आसपास टूलिंग थोड़ा अजीब है ... ms_print वाल्ग्रिंड के साथ प्रदान किया गया टूल केवल सबसे बुनियादी कार्यों के लिए उपयोगी है; असली काम के लिए आप शायद कुछ ऐसा चाहते हैं जो ग्राफ प्रदर्शित करता हो। नेट के चारों ओर इस strewn के लिए कई उपकरण हैं - उदाहरण के लिए देखें। Valgrind Massif tool output graphical interface?

+0

धन्यवाद - भी उपयोगी। – abligh

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