2010-08-24 13 views
5

मैंने अभी अपने आवेदन में मेमोरी रिसाव का समाधान किया है और अब मैं यह सुनिश्चित करने के लिए एक यूनिट टेस्ट लिखना चाहता हूं कि यह फिर से न हो।मेमोरी लीक यूनिट टेस्ट सी ++

मैं कुछ कार्यों के पहले और बाद में, वर्तमान एप्लिकेशन (कामकाजी सेट) के मेमोरी उपयोग का पता लगाने के लिए एक तरीका ढूंढ रहा हूं।

उदाहरण के लिए:

long mem_used= GetMemUsed(); 
/* Do some work */ 
/* clean up */ 

if(mem_used != GetMemUsed()) { 
    Error("Memory leek"); 
} 

मैं सिर्फ वर्तमान आवेदन के लिए पूरे सिस्टम को भर में स्मृति के उपयोग का पता लगाने के तरीके के बहुत सारे लेकिन कोई भी मिल गया है।

सुझाव, लिंक, कोड स्निपेट्स?

+1

बग को ठीक करने से पहले इकाई परीक्षण लिखें। –

+0

यहां प्लेटफॉर्म/कंपाइलर क्या है? –

+0

@ स्टेव टाउनसेंड - वीएस -2008 विंडोज़, ओओएस इसका जिक्र करना भूल गए। –

उत्तर

6

Boost.Test आपके यूनिट परीक्षणों में से कोई भी स्मृति लीक होने पर स्वचालित रूप से परीक्षण चलाने के अंत में आपको बताएगा।

मुझे नहीं पता कि अन्य सी ++ इकाई परीक्षण ढांचे में से कोई भी इस प्रकार की कार्यक्षमता प्रदान करता है या नहीं।

+2

केवल एमएस कंपाइलर्स पर मेमोरी लीक के लिए समर्थन: http://www.boost.org/doc/libs/1_44_0/libs/test/doc/html/execution-monitor/user-guide.html –

6

मुझे इस तरह की चीज़ के लिए वास्तव में ValGrind पसंद है। ये उपकरण पहले से मौजूद हैं; आपको स्मृति रिसाव का पता लगाने के लिए अपने स्वयं के यूनिट परीक्षण लिखने की आवश्यकता नहीं है।

+1

बस सुनिश्चित करें कि यह इकाई परीक्षण में बनाया गया है। आवेदन को मान्य करने के लिए हाथ से वालग्रिंड चलाने के लिए आलसी लोग परीक्षा नहीं चलाएंगे। –

+0

यह एक कर्मियों की समस्या की तरह लगता है, सॉफ्टवेयर समस्या नहीं। –

+0

@Ed: आलस्य एक व्यक्ति की समस्या है, हम सहमत हैं, लेकिन जब से आप आगाह कर रहे हैं, इसे ध्यान में रखें और जैसा कि मार्टिन सुझाव देता है, इसे बनाओ ताकि परीक्षा चलाने का आसान तरीका भी स्मृति रिसाव हो पहचान का निर्माण किया गया है :) –

-1

ProcessExplorer (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) इसके लिए अच्छा काम करता है।

+1

मैं इस उपकरण का उपयोग कर रहा हूं, लेकिन इसकी एक मैन्युअल प्रक्रिया इस तरह से है। मैं इसे कोड में करने का एक तरीका ढूंढ रहा था, इसलिए मैं इसे यूनिट टेस्ट में जोड़ सकता था। –

3

यह यूनिट परीक्षण नहीं है। यदि आप यह सुनिश्चित करना चाहते हैं कि संसाधन का प्रबंधन करने वाला कुछ यूनिट उस संसाधन को रिसाव नहीं करता है तो आपको यह सत्यापित करने की आवश्यकता है कि वह जिस संसाधन का प्रबंधन कर रहा है वह सही समय पर हटा दिया जाता है। आप इसे नकली वस्तुओं के साथ कर सकते हैं जो निर्माण पर एक काउंटर बढ़ाते हैं और हटाने पर कमी ... फिर सुनिश्चित करें कि गिनती सही है।

एक परीक्षण जो पूरे एप्लिकेशन के मेमोरी उपयोग की जांच करता है वह यूनिट परीक्षण के लिए कुछ नहीं है। यूनिट परीक्षण आवेदन के भीतर विशेष इकाइयों के लिए हैं।

+0

"वह" क्या है "यह एक यूनिट परीक्षण नहीं है"? ValGrind चल रहा है? गिनती नकली वस्तु सुझाव के लिए धन्यवाद! – Technophile

+0

एक संपूर्ण आवेदन का परीक्षण एक इकाई परीक्षण नहीं है। –

3

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

+1

ओपी सी ++ के बारे में पूछ रहा था। malloc का उपयोग C++ संदर्भ में नहीं किया जाना चाहिए। – anthropomorphic

+0

@ माइकल, यह प्रोग्रामर के परिप्रेक्ष्य से सच है लेकिन आपको शायद यह पता चलेगा कि सी ++ मानक लाइब्रेरी हूड के तहत मॉलोक का उपयोग करने के लिए 'नया' परिभाषित करती है। मॉलोक आंकड़े शायद लीक पहचान के लिए अभी भी प्रासंगिक हैं। – doron

+0

शायद? मैं कुछ भी मानने से पहले निश्चित रूप से जानना चाहता हूं। – anthropomorphic

0

तुम भी गूगल परीक्षण ढांचे (gtest) का उपयोग कर सकते हैं और फिर गूगल प्रदर्शन उपकरण (gperf) का उपयोग लीक खोजने के लिए। जीपीईआरएफ एक प्रतिस्थापन मेमोरी लाइब्रेरी में रखता है और यदि टेस्ट रन पूरा होने के बाद कोई मेमोरी लीक पाया जाता है तो यह आपको बताएगा और आपको कई अलग-अलग आउटपुट प्रारूपों - टेक्स्ट, डॉट, वेब इत्यादि के साथ चलाने के लिए एक पीआरएफओफ़ कमांड देता है। यह टूल दोनों परीक्षणों और उत्पादन कोड में लीक पाएं।

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

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