पर मुक्त कर दिया जाता है मान लें मैं एक सी प्रोग्राम (लिनक्स के तहत चल रहा है), जो कई डाटा संरचनाओं, कुछ जटिल है, जिनमें से कई के बढ़ने और हटना नहीं बल्कि सामान्य रूप में समय के साथ बढ़ती चाहिए कर सकते हैं manipulates है। इस कार्यक्रम को धीरे-धीरे आरएसएस के साथ बढ़ते समय देखा जाता है (स्मृति विखंडन द्वारा समझाया जा सकता है)। मैं लीकिंग क्या ढूंढना चाहता हूं। valgrind
के तहत चल रहा है स्पष्ट सुझाव यहां, लेकिन valgrind
(--leak-check=full
और --show-reachables=yes
के साथ) कोई रिसाव से पता चलता है। मेरा मानना है कि ऐसा इसलिए है क्योंकि डेटा संरचनाओं को स्वयं बाहर निकलने पर मुक्त किया जा रहा है, लेकिन उनमें से एक कार्यक्रम के जीवन के दौरान बढ़ रहा है। उदाहरण के लिए, एक लिंक्ड सूची हो सकती है जो समय के साथ रैखिक रूप से बढ़ रही है, किसी व्यक्ति सूची में संसाधन को हटाने के लिए भूल जाता है, लेकिन निकास क्लीनअप बाहर निकलने पर सूची में सभी आइटमों को सही ढंग से मुक्त कर देता है। एक दार्शनिक सवाल यह है कि क्या वे वास्तव में 'लीक' हैं, यदि वे मुक्त हैं, तो निश्चित रूप से (इसलिए प्रश्न में उद्धरण चिह्न) हैं।का पता लगाने सी स्मृति 'लीक' है कि बाहर निकलने के
इस उपकरण के लिए किसी भी उपयोगी उपकरणों वहाँ हैं? मुझे क्या पसंद है valgrind
के तहत चलाने की क्षमता है और यह मौजूदा आवंटन की एक रिपोर्ट तैयार करता है जैसा कि यह बाहर निकलने पर करता है, लेकिन यह संकेत पर होता है और कार्यक्रम को जारी रखने की अनुमति देता है। मैं तब देख सकता था कि स्टैक ट्रेस हस्ताक्षर उनके खिलाफ आवंटन बढ़ रहा था।
मैं gdb
से generate-core-file
के साथ विश्वसनीय रूप से एक अच्छी बड़ी 'कोर' फ़ाइल प्राप्त कर सकता हूं; वहाँ कुछ रास्ता है कि बंद लाइन का विश्लेषण करने के अगर मैं एक आसान malloc()
डिबगिंग पुस्तकालय कि malloc()
instrumented साथ संकलित कहना है?
मेरे पास स्रोत तक पूर्ण पहुंच है, और इसे संशोधित कर सकता है, लेकिन मैं वास्तव में हर डेटा संरचना को मैन्युअल रूप से वाद्य यंत्र नहीं करना चाहता हूं, और इसके अलावा मुझे समस्या के सामान्य समाधान में रुचि है (जैसे valgrind
प्रदान करता है) इस विशेष मुद्दे को कैसे हल करें।
मैं यहाँ पर इसी तरह के सवाल के लिए देखा है, लेकिन वे दिखाई देते हैं सब होने के लिए:
- क्यों मेरी कार्यक्रम रिसाव स्मृति करता है?
- मैं बाहर निकलने पर मेमोरी लीक का पता कैसे लगा सकता हूं? (मेरे लिए कोई उपयोग नहीं)
- मैं कोर फ़ाइल से मेमोरी लीक का पता कैसे लगा सकता हूं? अगर मैं सोलारिस के तहत चल रहा था मैं उत्तर का अनुमान कर रहा हूँ होगा 'इस आसान
dtrace
स्क्रिप्ट का उपयोग' हो (महान, लेकिन कोई भी एक संतोषजनक उत्तर नहीं है)
।
मैं वाल्ग्रिंड का बहुत धन हूं और मुझे यकीन है कि वाल्ग्रिंड आपको इन "लीक" दिखाएगा। यदि आप सूची प्रविष्टि को मुक्त करते हैं और सूची प्रविष्टि के भीतर संसाधनों को मुक्त करना भूल जाते हैं तो ये "निश्चित रूप से खोए गए" के रूप में वाल्ग्रिंड में दिखाई देंगे। बस '--show-reachables = yes' का उपयोग न करें क्योंकि यह जो मैंने अभी समझाया है उसे छुपाएगा, क्योंकि यह वास्तव में पहुंच योग्य नहीं है। – Montaldo
वह सिर्फ शब्दावली से उलझन में है। जब तक स्मृति पहुंच योग्य हो, तब तक यह खो या लीक नहीं होती है। कृपया प्रश्न को फिर से लिखें, और "रिसाव" शब्द का उपयोग करने से बचें। यह एक रिसाव नहीं है। –
@Montaldo मैं 'valgrind' से बहुत परिचित हूं; यह मुझे रिसाव नहीं दिखाता क्योंकि उन्हें बाहर निकलने पर मुक्त किया जाता है। – abligh