2010-11-15 11 views
6

मैं एक CentOS 5.5 कंप्यूटर पर एक सी प्रोग्राम चला रहा हूं। कार्यक्रम एक लूप चलाता है जो बाहरी स्रोत द्वारा रुकने के लिए कहा जाता है जब तक परीक्षण और अधिक परीक्षण करता है।किसी और के ड्राइवर से स्मृति रिसाव से निपटने के लिए कैसे करें

आवश्यकता से मैं एक पीसीआई कार्ड के लिए एक पुराने ड्राइवर का उपयोग कर रहा हूं जो मेरे परीक्षण प्रणाली के साथ संचार करता है। CentOS 4.5 से 5.5 तक अपग्रेड करने के बाद से मैंने देखा है कि मैं केवल अपने कार्यक्रम के माध्यम से 175 बार लूप कर सकता हूं। उस समय कार्यक्रम ढेर स्मृति आवंटित एक त्रुटि के साथ रोकता है। जब भी कार्यक्रम लूप होता है और सिस्टम सिर्फ स्मृति से बाहर चला जाता है, तो मैं 10 से 20 एमबी के हिस्सों में इस्तेमाल होने वाली मेमोरी देख सकता हूं। जब मैं Cntrl-C का उपयोग कर प्रोग्राम से बाहर निकलता हूं तो स्मृति तुरंत मुक्त हो जाती है।

मैंने वालग्रिंड का उपयोग किया है जो इंगित करता है कि मेमोरी लीक पुराने ड्राइवर में हैं। जिस कंपनी ने ड्राइवर लिखा है वह अभी विंडोज का समर्थन करता है और उन्होंने ड्राइवर को 5 वर्षों में अपग्रेड नहीं किया है।

स्रोत कोड के बिना क्या मैं हर बार ड्राइवर द्वारा उपयोग की गई मेमोरी को अपने प्रोग्राम के माध्यम से लूप कर सकता हूं?

धन्यवाद।

+0

क्या ड्राइवर उपयोगकर्तास्थान या कर्नलस्पेस में चल रहा है? – Novelocrat

उत्तर

0

उह! कठिन एक, ...

अपना खुद का मेमोरी प्रबंधन लिख सकते हैं, देशी ओएस प्रबंधन को लपेट सकते हैं, और पुराने ड्राइवर को उस लिंक से जोड़ सकते हैं? मैं ईमानदारी से नहीं जानता कि यह किया जा सकता है या नहीं।

इसके अलावा, आप इस ड्राइवर को लिखने वाली कंपनी को समस्या की व्याख्या करने और पुराने कोड के लिए अच्छी तरह से पूछने की कोशिश कर सकते हैं।

गुड लक =/

2

आप पाश अंदर ड्राइवर के माध्यम से परीक्षा प्रणाली के लिए उपयोग की घोषणा करते हैं, तो यह यह क्षेत्र से बाहर प्रत्येक यात्रा पर डाल दिया जाना चाहिए।

कुछ निम्नलिखित की तरह:

char readbuf[512]; 
for (int i = 0; i < countloops; i++) 
{ 
    int fd = open("/dev/com1", O_RDWR); 
    readbuf = read(fd, sizeof (readbuf)); 
    close (fd); 
} 
+0

आप मानते हैं कि यह एफडी बंद होने पर 'लीक' स्मृति जारी करता है। शायद यह मामला नहीं है। – Novelocrat

+2

ओपी से "जब मैं Cntrl-C का उपयोग कर प्रोग्राम से बाहर निकलता हूं तो स्मृति तुरंत मुक्त हो जाती है।" इससे मुझे विश्वास होगा कि स्मृति को बंद होने पर जारी किया जाएगा। – KevinDTimm

1

एक नई प्रक्रिया बनाएं के लिए प्रत्येक एन चालक की का उपयोग करता है (~ 175 काम करना चाहिए), और भारतीय दंड संहिता की किसी भी प्रकार के माध्यम से माता-पिता की प्रक्रिया के साथ संवाद।

2

यह संभव है कि यद्यपि वालग्रिंड ड्राइवर कोड के भीतर किए जाने वाले लीक आवंटन को दिखाता है, फिर भी समस्या आपके कोड में है। ऐसा होगा, उदाहरण के लिए, यदि ड्राइवर एक "मुफ़्त" या "रिलीज" प्रकार का फ़ंक्शन प्रदान करता है जो आपके प्रोग्राम को कॉल करने की अपेक्षा करता है, और आप ऐसा नहीं कर रहे हैं।

0

क्या ड्राइवर स्वयं निहित घटक के रूप में आता है, या यह एक पुस्तकालय है जो आपके सीआरटी से जुड़ा हुआ है? यदि उत्तरार्द्ध - जो कहने के लिए है, यदि यह अपने आप को प्रदान करने के बजाय malloc() से लिंक करने की अपेक्षा करता है - तो आप इसे अपने maloc() को ओवरराइड कर सकते हैं जो इसे अपने कार्यान्वयन से जोड़ने के लिए मजबूर कर देता है। एक बार ऐसा करने के बाद, आप इसकी ढेर को नियंत्रित करते हैं, और आप प्रक्रिया को मारने के बिना ड्राइवर को "पुनरारंभ" कर सकते हैं।

यह ठीक है कि हमने कुछ लीकी तृतीय-पक्ष पुस्तकालयों के साथ निपटाया है जिसे हमें उपभोक्ता उत्पाद में जोड़ने की आवश्यकता है।

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