मेरे ओपनसीवी एप्लिकेशन में मेमोरी लीक है। इसका एक दर्जन वर्ग और कोड की कुछ हजार लाइनों के साथ एक मध्यम आकार का आवेदन है। किसी भी तरह, मैं अपने आवेदन में एक बड़ी मेमोरी रिसाव का उत्पादन करने में कामयाब रहा कि यह कुछ मिनटों में मेरी सभी 8 जीबी मेमोरी खाती है। मैं सीएमके के साथ उबंटू 11.10 पर ओपनसीवी सी ++ 2.3 का उपयोग कर रहा हूं।ओपनसीवी एप्लिकेशन में, मैं मेमोरी रिसाव के स्रोत की पहचान कैसे करूं और इसे ठीक कर सकता हूं?
यह एक हाथ ट्रैकिंग अनुप्रयोग है और इसे संसाधित दो वीडियो एक फ्रेम दर पर simultaneusly धाराओं के चारों ओर प्रत्येक कैमरे के लिए 15fps।
मैंने नीचे की तरह वालग्रिंड का उपयोग करने की कोशिश की, लेकिन वाल्ग्रिंड का उत्पादन इतना बड़ा है कि बफर में टेक्स्ट खोल की मात्रा से अधिक हो सकता है। मुझे पता है कि मैं आउटपुट को लॉग फ़ाइल में सहेज सकता हूं, लेकिन मैं उम्मीद कर रहा था कि यह सब पढ़ने के कठिन काम से बचें।
valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./Gibbon
यहाँ valgrind उत्पादन के अंतिम कुछ लाइनों है:: यहाँ valgrind आदेश मैं प्रयोग किया जाता है
==3573== 5,415,576 (1,176 direct, 5,414,400 indirect) bytes in 7 blocks are definitely lost in loss record 2,571 of 2,571
==3573== at 0x4C28F9F: malloc (vg_replace_malloc.c:236)
==3573== by 0x5B2ACD0: cv::fastMalloc(unsigned long) (in /usr/local/lib/libopencv_core.so.2.3.1)
==3573== by 0x5A7FA9D: cvCreateImageHeader (in /usr/local/lib/libopencv_core.so.2.3.1)
==3573== by 0x484538: CameraPGR::convertImageToOpenCV(FlyCapture2::Image*) (CameraPGR.cpp:212)
==3573== by 0x483F52: CameraPGR::grabImage() (CameraPGR.cpp:134)
==3573== by 0x473F86: start() (GibbonMain.cpp:368)
==3573== by 0x4725CC: main (GibbonMain.cpp:108)
==3573==
==3573== LEAK SUMMARY:
==3573== definitely lost: 24,432 bytes in 33 blocks
==3573== indirectly lost: 5,414,640 bytes in 15 blocks
==3573== possibly lost: 2,314,837 bytes in 1,148 blocks
==3573== still reachable: 496,811 bytes in 4,037 blocks
==3573== suppressed: 0 bytes in 0 blocks
==3573==
==3573== For counts of detected and suppressed errors, rerun with: -v
==3573== Use --track-origins=yes to see where uninitialised values come from
==3573== ERROR SUMMARY: 336 errors from 318 contexts (suppressed: 10 from 8)
कुछ बेहतर तरीके है कि मैं इस समस्या को संपर्क कर सकते हैं क्या हैं? क्या ऐसे कुछ उपकरण हैं जो मुझे संक्षेप में दिखा सकते हैं कि कौन से फ़ंक्शन कॉल मेमोरी आवंटन का कारण बन रहे हैं? यदि वालग्रिंड उत्तर है, तो मैं इस उपकरण के लिए बिल्कुल नया हूं क्योंकि इसे अधिक कुशल तरीके से उपयोग करने के तरीके पर कुछ संकेतों की सराहना करता हूं।
बदल दिया जाता है, तो मुझे लगता है कि करने के लिए मैं कहूंगा कि आप शायद कहीं 'CameraPGR आसपास स्मृति आवंटन कर रहे हैं :: grabImage()' और यह कभी नहीं मुक्त कराने के लिए किया था। –
मैंने उस समारोह को कई बार देखा है, वहां समस्या नहीं मिल सकती है। मैं कल इसके साथ कुछ और गड़बड़ कर दूंगा। क्या आपके पास कोई सुझाव है कि मैं स्मृति रिसाव के मूल कारण को खोजने की प्रक्रिया को कैसे सुधार सकता हूं? – Aras
अपने किसी भी कोड को देखे बिना यह गलत हो रहा है कि अनुमान लगाना वास्तव में असंभव है। क्या आप उपर्युक्त कॉलस्टैक में आवंटित स्मृति को मुक्त करते हैं? यदि नहीं, तो आपकी समस्या है। –