2009-07-06 13 views
9

मुझे अपने मिश्रित मोड सी ++/सीएलआर .NET एप्लिकेशन में धीमी मेमोरी लीक के साथ समस्याएं आ रही हैं।मिश्रित मोड में मेमोरी लीक सी ++/सीएलआर एप्लीकेशन

(यह सी ++ देशी स्थिर एक VS2008 सी ++/CLR विंडोज "/ clr" संकलक सेटिंग के साथ फॉर्म्स एप्लिकेशन में लिंक पुस्तकालयों)

विशिष्ट व्यवहार: एप्लिकेशन 30 एमबी (निजी स्मृति) का उपयोग शुरू होता है। फिर स्मृति को धीमा कर देता है, नकली भारी भार के तहत चलने पर हर घंटे एक एमबी कहें। यह ऐप को दिन या सप्ताह के लिए जीने का अनुकरण करता है।

मैंने विजुअल स्टूडियो सीआरटी libs के साथ आने वाली सीआरटी डीबगिंग सामग्री दोनों सहित मेमोरी लीक को ट्रैक करने के लिए कई टूल का उपयोग करने का प्रयास किया है। मैंने एक वाणिज्यिक रिसाव पहचान उपकरण ("मेमोरी वैलिडेटर") भी उपयोग किया है।

दोनों रिपोर्ट शट डाउन पर नगण्य स्मृति रिसाव (कुछ मामूली प्रविष्टियां जो कि कुछ केबी की राशि है जिनके बारे में मुझे चिंता नहीं है)। साथ ही, मैं देख सकता हूं कि ट्रैक की गई मेमोरी इतनी अधिक प्रतीत नहीं होती है (इसलिए मुझे विश्वास नहीं है कि यह केवल स्मृति है जो केवल आयोजित की जा रही है और केवल ऐप से बाहर निकलती है)। मुझे लगभग 5 एमबी सूचीबद्ध मेमोरी मिलती है (कुल> 30 एमबी में से)।

टूल (मेमोरी वैलिडेटर) सभी मेमोरी उपयोग को ट्रैक करने के लिए सेट किया गया है (मॉलोक, नया, वर्चुअल मेमोरी आवंटन और अन्य प्रकार के मेमोरी आवंटन का पूरा समूह)। असल में, प्रत्येक सेटिंग जिसके लिए स्मृति को ट्रैक करना चुना गया है।

.NET छवि रिपोर्ट करता है कि यह लगभग 1.5 एमबी मेमोरी (पेर्फॉन से) का उपयोग कर रहा है।

यहां जानकारी का एक अंतिम विवरण है: हमारे पास ऐप का एक संस्करण है जो देशी कंसोल एप्लिकेशन (पूरी तरह से मूल - सीएलआर नहीं है) के रूप में चलता है। यह यूआई सामान के बिना मिश्रित मोड के रूप में 9 5% समान है। यह स्मृति को रिसाव नहीं लग रहा है, और लगभग 5 एमबी निजी बाइट्स पर चोटियों।

तो मूल रूप से जो मैं यहां पहुंचने की कोशिश कर रहा हूं वह यह है कि मुझे नहीं लगता कि मूल कोड में से कोई भी स्मृति लीक कर रहा है।

पहेली का एक और टुकड़ा: मैं इस जब 2.0 ढांचे (जो मैं कर रहा हूँ) को लक्षित मिश्रित मोड अनुप्रयोगों में मेमोरी लीक करने के लिए जो दर्शाता है पाया: http://support.microsoft.com/kb/961870

दुर्भाग्य से जानकारी दी जा रही infuriatingly विरल तो मैं नहीं करता है, तो यकीन है कि यह प्रासंगिक है। मैंने 2.0 के बजाय 3.5 ढांचे को लक्षित करने का प्रयास किया लेकिन अभी भी वही समस्या थी (शायद मैंने यह सही नहीं किया)।

किसी के पास कोई सुझाव है?

कुछ चीजें हैं जो मेरी मदद कर सकता है:

  • वहाँ स्मृति आवंटन है कि मैं नहीं कर रहा हूँ पर नज़र रखने के किसी भी अन्य प्रकार हैं?
  • आंकड़े कैसे शामिल नहीं होते हैं? मुझे 5 एमबी सीआरटी मेमोरी उपयोग, 1.5 एमबी की .NET मेमोरी मिलती है तो पूरे ऐप को 30 एमबी निजी बाइट्स का उपयोग कैसे किया जाता है? क्या यह सब .NET ढांचे में बंधे हैं? मैं रिसाव उपकरण में इन्हें क्यों नहीं देखता हूं? क्या .NET ढांचा किसी प्रकार की आवंटित स्मृति के रूप में नहीं दिखाई देगा?
  • कोई अन्य लीक पहचान उपकरण जो मिश्रित मोड ऐप्स के साथ अच्छी तरह से काम करता है?

किसी भी मदद

जॉन

+0

.NET 2.0 और .NET 3.5 दोनों एक ही सीएलआर 2.0 का उपयोग करते हैं, क्योंकि आप आसानी से संस्करण संख्याओं से देख सकते हैं ;-) –

उत्तर

6

ठीक है मुझे अंततः समस्या मिली।

यह/ईएच (अपवाद हैंडलिंग) के लिए गलत सेटिंग के कारण हुआ था।

असल में, मिश्रित मोड .NET ऐप्स के साथ, आपको यह सुनिश्चित करना होगा कि सभी स्थिर रूप से जुड़े libs को डिफ़ॉल्ट/EHs के बजाय/EHa के साथ संकलित किया गया हो।

(एप्लिकेशन को स्वयं भी/EHA साथ संकलित किया जाना चाहिए, लेकिन यह एक दिया जाता है -। संकलक अगर आप इसे इस्तेमाल नहीं करते त्रुटि रिपोर्ट करेंगे समस्या जब आप अन्य स्थिर देशी libs में लिंक है।)

समस्या यह है कि ऐप के प्रबंधित बिट में पकड़े गए अपवाद, जिन्हें/ईएच के साथ संकलित मूल पुस्तकालयों में फेंक दिया गया था, अपवाद को सही तरीके से संभालने में समाप्त नहीं होता है। सी ++ ऑब्जेक्ट्स के लिए विनाशकों को तब सही ढंग से नहीं कहा जाता है।

मेरे मामले में, यह केवल एक दुर्लभ जगह में हुआ, इसलिए मुझे जगह पर उम्र क्यों मिली।

0

आजमाएँ के लिए धन्यवाद: DebugDiags।कुछ स्मृति पैदा उदासीनता
के बाद, यह आप क्या स्मृति आवंटित किया गया था का एक अच्छा ग्रीष्मकालिन दे देंगे, और अपने PDB के खोजने पर निर्भर करता है, यह आपके द्वारा जिसे यह आवंटित किया गया था बता सकते हैं।

+0

धन्यवाद, मैं इसे – John

0

आप एक संदर्भ रिसाव हो सकता है सॉफ्टवेयर रूपरेखा चींटियों पर गौर। Ants Profiler

एक संदर्भ रिसाव एक स्मृति रिसाव के बराबर है। आप उस ऑब्जेक्ट के संदर्भ रखते हैं जो इसे कचरा इकट्ठा करता है, और इस प्रकार आप उपयोग में स्मृति को ऊपर उठने लगते हैं।

+0

पर आज़मा दूंगा लेकिन यह "# सभी ढेर में बाइट्स ".NET स्मृति मान? मैं इसे प्रोसेस एक्सप्लोरर में देख रहा हूं और यह रिसाव नहीं करता है। रिसाव निजी बाइट्स में है लेकिन "सभी ढेर में # बाइट्स" में नहीं है। – John

0

क्या यह संभव है कि आप कुछ disposers नहीं छूटा है, तब हो सकता है आपके का उपयोग कर GDI + और कई अन्य एपीआई।

अपने स्थिर विश्लेषण उपकरण चलाएँ FxCop यह अगर तुम निपटाने कहा जाता है (या "का उपयोग" का इस्तेमाल किया) अपने ऑब्जेक्ट इंटरफेस प्रदान पर बयान की जांच करने के लिए एक नियम है। .Net में यदि कोई फ़ंक्शन अप्रबंधित कोड का उपयोग करता है तो यह आमतौर पर संसाधन/स्मृति को रिसाव न करने के लिए आपके लिए एक निपटान या बंद विधि प्रदान करेगा।

+0

उत्कृष्ट विचार। मुझे लगता है कि ये लीक सीएलआर मेमोरी उपयोग के रूप में नहीं दिखाई देंगे क्योंकि वे मूल हैं, लेकिन देशी लीक डिटेक्शन टूल में भी दिखाई नहीं देंगे क्योंकि वे मेरे कोड नहीं हैं। मैं इसे एक बाश दूंगा (मुझे पता नहीं है कि FXCop मिश्रित मोड C++/CLI से निपट सकता है) – John

+0

उम्मीद है कि इससे मदद मिलती है। मैं सिर्फ अंधेरे में शूटिंग कर रहा हूं, लेकिन मैंने देखा है कि यह उन ऐप्स में से एक है जो जीडीआई करते थे, मुझे जीडीआई में लगभग हर ऑब्जेक्ट मिला - एक डिस्पोजेर की आवश्यकता थी। ध्यान दें कि यह – Spence

4

स्पेंस जैसा कह रहा था, लेकिन C++/CLI के लिए;) ....

किसी भी वस्तु के लिए आप C++/CLI में प्रयोग कर रहे हैं जो, अगर आप बनाते हैं, और उस वस्तु से आप सी ++ कोड, आप की कोशिश करनी चाहिए स्टैक आवंटन seymantics का उपयोग करने के लिए, भले ही यह एक कंपाइलर जादू प्रकार की बात है, यह नेस्टेड __try {} __finally {} कथन स्थापित करने में सक्षम है जिसका उपयोग आप देशी कोड से उपयोग करने के लिए किया जा सकता है (जो उन्हें एक तरीके से स्थापित नहीं करता है निपटान करने के लिए एक कॉल ढीला)।

Nish'sarticle at the code project here सी ++/सीएलआई स्टैक आवंटन अर्थशास्त्र पर बहुत अच्छा है और {} का उपयोग करके अनुकरण करने के तरीके के बारे में गहराई में जाता है।

आप किसी भी वस्तु की कि implment IDisposable के रूप में आप C++/CLI में निपटान फोन नहीं कर सकते हैं नष्ट करने के लिए यह सुनिश्चित करना चाहिये, हटाने आप के लिए यह करता है, अपने ढेर अर्थ विज्ञान का उपयोग नहीं करता है, तो ..

मैं आमतौर पर अपने आप को बंद करें फोन स्ट्रीम पर और ऑब्जेक्ट के साथ समाप्त होने पर, नलप्टर को असाइन करने का प्रयास करें, बस मामले में।

आप भी, इस घटना के बारे में ग्राहकों this article on memory issues की जाँच करने के लिए, perticularly चाहते हो सकता है अगर आप अपने वस्तुओं के लिए घटना के बताए जाते हैं आप लीक किया जा सकता है ...

अंतिम उपाय के रूप (या शायद पहले :), एक मैंने जो कुछ किया है वह सीएलआर प्रोफाइलर एपीआई, here's another article का उपयोग करने के तरीके पर है, लेखक के लेखक (जे हिलार्ड) के पास एक उदाहरण है जो उत्तर देता है;

    प्रत्येक नेट प्रकार है कि प्रयोग किया जाता है के
  • , कैसे कई वस्तु उदाहरणों की जा रही आवंटित किए जाते हैं?
  • कितना बड़ा उदाहरणों प्रत्येक प्रकार के कर रहे हैं?
  • क्या नोटिफिकेशन जीसी प्रदान करता है क्योंकि यह कचरा संग्रह के माध्यम से जाता है और क्या आप पता लगा सकते हैं?
  • जब जीसी वस्तु उदाहरणों एकत्रित करता है?

आप कुछ वस्तु प्रोफाइलर की तुलना में एक बेहतर विचार प्राप्त करना चाहिए, मैंने देखा है कि वे कभी-कभी आपके आवंटन porofile पर निर्भर करता है (Btw भ्रामक हो सकता है। बड़ी वस्तु ढेर मुद्दों के लिए बाहर देखने के लिए,> ~ 83kb वस्तुओं विशेष रूप से नियंत्रित किया जाता है , उस मामले में, मैं बड़े वस्तु ढेर से बाहर निकलना होगा, :)।

अपनी टिप्पणी, कुछ और बातें ... को देखते हुए

मैं के बारे में छवि लोड कोटा या किसी अन्य disernable आंकड़ा चार्ज नहीं कर रहा है से पहले पोस्ट किया है, इसका क्या मतलब है, आप कुछ संभाल या लोडर को ट्रैक करने की आवश्यकता हो सकती है मुद्दा (अंततः लोडर लॉक देखें), लेकिन इससे पहले, आप कुछ Constrained Execution Regions सेट अप करने का प्रयास कर सकते हैं, वे चमत्कार कर सकते हैं, लेकिन दुर्भाग्य से गैर-शुद्ध कोड में रेट्रो-फिट करने में भी मुश्किल हो रही है।

यह हालिया MSDN Mag, आलेख दस्तावेज़ में कई परफॉर्म प्रकार मेमोरी स्परलंकिंग (this older one के लिए फॉलोअप) है।

VS Perf Blog से, वे दिखाते हैं कि दृश्य स्टूडियो में एसओएस का उपयोग कैसे करें, जो आसान हो सकता है, रूज डीएलएल को ट्रैक करने के लिए, संबंधित पोस्ट भी अच्छे हैं।

Maoni Stephen's Blog और company, वह कहता है कि वह परफ टीम पर है, लेकिन अनिवार्य रूप से 100% पद जीसी के संबंध में हैं इसलिए वह इसे अच्छी तरह से लिख सकता है।

Rick Byers CLR निदान टीम के साथ एक देव है, अपने ब्लॉग-साथी के कई भी कर रहे हैं अच्छा स्रोत के लिए, तथापि, मैं दृढ़ता से भी काफी नया dev/diagnostics forum की बात कर सुझाव देते हैं। उन्होंने हाल ही में अपनी चर्चाओं के दायरे का विस्तार किया है।

Code Coverage Tools और tracing अक्सर आपको वास्तव में क्या चल रहा है इसका एक अवलोकन देने में मदद कर सकता है।

(विशेष रूप से, उन लंबवत स्टेटस आपको आपके कोड का अनुमान लगाने के बारे में वैश्विक दृष्टिकोण नहीं दे रहे हैं, मैं कह सकता हूं कि हाल ही में, मैंने पाया है (यहां तक ​​कि .NET4beta binaries के साथ, this company से प्रोफाइलर, काफी अच्छा है, यह मूल/प्रबंधित लीक को इसके प्रोफाइल निशान से प्राप्त करने में सक्षम है, आपको सटीक स्रोत लाइनों पर वापस लाता है (भले ही अनुकूलित किया गया हो, काफी अच्छा (और इसमें 30 दिन का परीक्षण हो)))।

शुभकामनाएं !! उम्मीद है कि इनमें से कुछ मदद करता है, यह केवल मेरे दिमाग में ताजा है, क्योंकि मैं अभी भी वही काम कर रहा हूं;)

+0

धन्यवाद "दिन" के दिन से पहले था - यहां कुछ अच्छी टिप्पणियां। यहां बात है: .NET प्रदर्शन ऑब्जेक्ट्स में "# कुल प्रतिबद्ध बाइट्स" और न ही "बड़े ऑब्जेक्ट हीप सिज़" उपाय न तो .NET ऑब्जेक्ट्स में रिसाव इंगित करते हैं। अब मैं सीएलआर की तुलना में मूल कोड में मेमोरी लीक डीबग करने से ज्यादा परिचित हूं, इसलिए शायद मुझे यह समझ में आया है कि इन आंकड़ों का क्या अर्थ है। क्या आप इस पर मुझे सही कर सकते हैं? सीएलआर मेमोरी लीक उपर्युक्त प्रदर्शन वस्तुओं में दिखाई देगा? – John

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