मेरे पास एक सी/सी ++ प्रोग्राम है जो स्मृति से बाहर होने पर लटक सकता है। हमने एक ही समय में कई प्रतियां चलाकर इसे खोज लिया। मैं विकास मशीन पर प्रदर्शन को पूरी तरह से नष्ट किए बिना कार्यक्रम को डीबग करना चाहता हूं। क्या उपलब्ध स्मृति को सीमित करने का कोई तरीका है ताकि एक नया या मॉलोक एक पूर्ण सूचक वापस लौटाए, कहें, 500K मेमोरी का अनुरोध किया गया है?मेमोरी से बाहर निकलने के लिए प्रोग्राम को कैसे लागू किया जाए?
उत्तर
प्रश्न को अपने सिर पर बदलने का प्रयास करें और पूछें कि एक ओएस स्मृति की मात्रा को सीमित करने के लिए कैसे आपकी प्रक्रिया का उपयोग करने की अनुमति होगी।
में http://ss64.com/bash/ulimit.html
कोशिश देखने का प्रयास करें कहते हैं: ulimit -v
यहाँ एक और लिंक एक छोटे से वर्ष है, लेकिन थोड़ा और वापस जमीन देता है जो: http://www.network-theory.co.uk/docs/gccintro/gccintro_77.html
यह मेरे लिए काम किया। धन्यवाद! विशेष रूप से, मैंने कार्यक्रम चलाया, प्रक्रिया आईडी प्राप्त करने के लिए 'ps' का उपयोग किया, फिर केबी में VmPeak और VmSize प्राप्त करने के लिए' cat/proc/pID/status' (मेरे मामले में 817756)। मैं फिर 'ulimit -v 800000' भाग गया और फिर कोशिश की, और जल्दी से एक स्मृति की स्थिति में मिला (0 एक malloc से लौटा)। मैं इसे जीडीबी ('gdb --args ./program --arg1 --arg2') के तहत भी चला सकता हूं और कोड का पता लगा सकता हूं। – jwhitlock
यह दिखाने के लिए धन्यवाद कि आप इसका उपयोग कैसे कर रहे हैं। – chollida
एक तरीका है malloc() के आसपास एक रैपर लिखना।
static unsigned int requested =0;
void* my_malloc(size_tamount){
if (requested + amount < LIMIT){
requested+=amount;
return malloc(amount);
}
return NULL
}
आप अपने मॉलोक को अधिभारित करने के लिए # परिभाषा का उपयोग कर सकते हैं।
जीएमएन राज्यों के रूप में, आप नए/हटाए गए ऑपरेटरों को भी अधिभारित कर सकते हैं (सी ++ मामले के लिए)।
सुनिश्चित नहीं हैं कि अगर सबसे अच्छा तरीका है, या क्या आप के लिए
वैश्विक ऑपरेटर को नए/हटाए जाने से बेहतर होगा, क्योंकि सभी आवंटन होंगे किसी भी अन्य कोड को बदलने के बिना, उस के माध्यम से जाने के लिए। – GManNickG
हां, नया/हटा ओवरलोडिंग मदद करेगा। इस पर एक मॉलोक ओवरलोड पर विचार करें। मेरे उत्तर को संपादित करना – Tom
और आप रन-टाइम पर LIMIT सेटटेबल बनाने पर विचार कर सकते हैं, उदाहरण के लिए पर्यावरण चर के माध्यम से। –
कौन सा ओएस देख रहे हैं? यूनिक्स के लिए, अपने खोल (sh/csh) के आधार पर ulimit -d/सीमित डेटासाइज देखें।
आप मॉलोक के लिए एक रैपर लिख सकते हैं जो आपके इच्छित परिसंचरण में त्रुटि देता है। आपके ओएस के आधार पर, आप इसे कार्यान्वयन के लिए प्रतिस्थापित कर सकते हैं।
कि आपके मंच पर निर्भर करता है । उदाहरण के लिए, यह setrlimit(RLIMIT_DATA, ...) का उपयोग कर यूनिक्स-जैसे प्लेटफॉर्म पर प्रोग्रामेटिक रूप से हासिल किया जा सकता है।
संपादित:
RLIMIT_AS संसाधन भी रूप में अच्छी तरह इस मामले में उपयोगी हो सकता है।
जीएनयू libc के खिलाफ, RLIMIT_DATA शक्तिहीन है। –
नया और नया ओवरराइड []।
void* operator new(size_t s)
{
}
void* operator new[](size_t s)
{
}
नए नंबर पर कॉल के बाद चुनिंदा रूप से मरने के लिए ब्रेसिज़ में अपना कोड रखें। आम तौर पर आप स्मृति आवंटित करने और इसे वापस करने के लिए मॉलोक को कॉल करेंगे।
मैं एक बार (सी में, हाँ, हाँ, मेरी गलती नहीं है) सीएस 1 में एक छात्र था इस प्रयास करें, और स्मृति समाप्त हो गई:
int array[42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42][42]..... (42 dimensions);
और फिर वह जानना चाहता था कि ऐसा क्यों त्रुटियों दे दी है ...
कोई आश्चर्य नहीं ... वह आकार की एक सरणी बनाने की कोशिश कर रहा था '1.5013093754529657235677197216425e + 68' – RCIX
यदि आप पैसा खर्च करना चाहते हैं, तो सुरक्षा इनोवोवेशन द्वारा होलोडेक नामक एक उपकरण है, जो आपको अपने कार्यक्रम (कम स्मृति सहित) में त्रुटियों को इंजेक्ट करने देता है। अच्छी बात यह है कि आप इच्छाओं पर सामान को चालू और बंद कर सकते हैं।मैंने वास्तव में इसका उपयोग नहीं किया है, इसलिए, मुझे नहीं पता कि उपकरण के साथ कुछ बिंदुओं पर दोषों में प्रोग्राम करना संभव है या नहीं। मुझे यह भी नहीं पता कि कौन से प्लेटफ़ॉर्म समर्थित हैं ...
जहां तक मुझे पता है, लिनक्स पर, malloc कभी भी शून्य सूचक नहीं लौटाएगा। इसके बजाय, OOM Killer कॉल किया जाएगा। यह निश्चित रूप से, जब तक आप ओओएम किलर को अक्षम नहीं कर लेते हैं। कुछ googling परिणाम के साथ आना चाहिए।
मुझे पता है कि यह आपका वास्तविक प्रश्न नहीं है, लेकिन आपको यह कहां से करना है कि आप कहां से आ रहे हैं।
कभी-कभी ओओएम को बुलाया जाता है, कभी-कभी आपको एक नल पॉइंटर मिलता है: http://linuxdevcenter.com/pub/a/linux/2006 /11/30/linux-out-of-memory.html?page=1 – jwhitlock
ऐसा करने का एक अन्य तरीका failmalloc का उपयोग करना है जो एक साझा लाइब्रेरी है जो मॉलोक इत्यादि को ओवरराइड करता है और फिर विफल :-)। यह आपको असफल होने पर नियंत्रण देता है और यादृच्छिक रूप से असफल होने के लिए बनाया जा सकता है, प्रत्येक एनएच समय आदि
मैंने इसे स्वयं का इस्तेमाल किया है लेकिन अच्छी चीजें सुनी हैं।
- 1. जीडीबी - प्रोग्राम से बाहर निकलने के लिए कैसे पता लगाएं
- 2. प्रोग्राम बाहर निकलने पर लीक मेमोरी मुक्त हो जाती है?
- 3. कार्यक्रम बाहर निकलने के
- 4. कैसे बाहर निकलने के लिए सीएसएस BeautifulSoup
- 5. बाहर निकलने के कोड के साथ प्रोग्राम से कैसे बाहर निकलें: सी #
- 6. javafx प्रोग्राम से बाहर निकलने पर प्रोग्राम को कैसे साफ़ करें?
- 7. प्रोग्राम के करीब से बाहर निकलने के लिए मैं सभी प्रोग्राम थ्रेड को कैसे मजबूर कर सकता हूं?
- 8. गतिविधि से बाहर निकलने के बाद वास्तविक गतिविधि ऑब्जेक्ट मेमोरी को कैसे रिलीज़ करें?
- 9. कमांड लाइन प्रोग्राम से बाहर निकलने का सही तरीका?
- 10. प्रत्येक mootools से बाहर निकलने के लिए कैसे करें()
- 11. अपवाद फेंकने और हास्केल में प्रोग्राम से बाहर निकलने के लिए कैसे?
- 12. बिटमैप छवि के बाद मेमोरी को कैसे मुक्त किया जाए?
- 13. मैं बढ़ती TDictionary के साथ मेमोरी से बाहर निकलने से कैसे बच सकता हूं?
- 14. 1 से बाहर निकलने वाला कोड C#
- 15. प्रक्रिया से बाहर निकलने के लिए डेटा को फ़्लैश क्यों नहीं किया जा रहा है?
- 16. एंड्रॉयड बाहर निकलने SQLite खोल
- 17. लूप से बाहर निकलने के लिए वापसी का उपयोग करना?
- 18. निष्पादन के बाद बाहर निकलने से जीनोम टर्मिनल को रोकें
- 19. सीपीयू उपयोग को सी # प्रोग्राम को कैसे प्रतिबंधित किया जाए?
- 20. बाहर निकलने पर डबल पुष्टिकरण
- 21. PHP स्क्रिप्ट ब्राउज़र से बाहर निकलने से बाहर नहीं निकलता
- 22. बाहर निकलने का संदेश कैसे बनाएं
- 23. .NET प्रोग्राम के लिए स्टैक आकार को कैसे बदला जाए?
- 24. क्या प्रक्रिया से बाहर निकलने पर स्वचालित रूप से झुंड जारी किया जाता है?
- 25. मेमोरी अवधारणाओं से बाहर
- 26. गैर-बच्चों की प्रक्रियाओं से बाहर निकलने के लिए कैसे प्रतीक्षा करें
- 27. एक पृष्ठ पूर्णस्क्रीन से बाहर निकलने पर कैसे पता लगाया जाए?
- 28. पर्ल: grep या map से बाहर निकलने के लिए "आखिरी" क्यों उपयोग नहीं किया जाना चाहिए?
- 29. बाहर निकलने के कार्यक्रम पर एंड्रॉइड एप्लिकेशन
- 30. पीईक्यूटी आवेदन में बाहर निकलने पर संकेत
कौन सा मंच? –
लिनक्स, विशेष रूप से CentOS 32 बिट कर्नेल 2.6.18-128.1.16.el5 – jwhitlock
हम्म चल रहा है। जब मैंने पहली बार शीर्षक पढ़ा..मैं सोच रहा था ... char * foo = new char [(1024 * 1024) * 10]; शायद, lol .. बस एक अजीब quirk मैं शायद कोशिश करूँगा, lol – Zack