2009-08-04 8 views
28

मेरे पास एक सी/सी ++ प्रोग्राम है जो स्मृति से बाहर होने पर लटक सकता है। हमने एक ही समय में कई प्रतियां चलाकर इसे खोज लिया। मैं विकास मशीन पर प्रदर्शन को पूरी तरह से नष्ट किए बिना कार्यक्रम को डीबग करना चाहता हूं। क्या उपलब्ध स्मृति को सीमित करने का कोई तरीका है ताकि एक नया या मॉलोक एक पूर्ण सूचक वापस लौटाए, कहें, 500K मेमोरी का अनुरोध किया गया है?मेमोरी से बाहर निकलने के लिए प्रोग्राम को कैसे लागू किया जाए?

+3

कौन सा मंच? –

+0

लिनक्स, विशेष रूप से CentOS 32 बिट कर्नेल 2.6.18-128.1.16.el5 – jwhitlock

+0

हम्म चल रहा है। जब मैंने पहली बार शीर्षक पढ़ा..मैं सोच रहा था ... char * foo = new char [(1024 * 1024) * 10]; शायद, lol .. बस एक अजीब quirk मैं शायद कोशिश करूँगा, lol – Zack

उत्तर

31

प्रश्न को अपने सिर पर बदलने का प्रयास करें और पूछें कि एक ओएस स्मृति की मात्रा को सीमित करने के लिए कैसे आपकी प्रक्रिया का उपयोग करने की अनुमति होगी।

में http://ss64.com/bash/ulimit.html

कोशिश देखने का प्रयास करें कहते हैं: ulimit -v

यहाँ एक और लिंक एक छोटे से वर्ष है, लेकिन थोड़ा और वापस जमीन देता है जो: http://www.network-theory.co.uk/docs/gccintro/gccintro_77.html

+4

यह मेरे लिए काम किया। धन्यवाद! विशेष रूप से, मैंने कार्यक्रम चलाया, प्रक्रिया आईडी प्राप्त करने के लिए 'ps' का उपयोग किया, फिर केबी में VmPeak और VmSize प्राप्त करने के लिए' cat/proc/pID/status' (मेरे मामले में 817756)। मैं फिर 'ulimit -v 800000' भाग गया और फिर कोशिश की, और जल्दी से एक स्मृति की स्थिति में मिला (0 एक malloc से लौटा)। मैं इसे जीडीबी ('gdb --args ./program --arg1 --arg2') के तहत भी चला सकता हूं और कोड का पता लगा सकता हूं। – jwhitlock

+1

यह दिखाने के लिए धन्यवाद कि आप इसका उपयोग कैसे कर रहे हैं। – chollida

9

एक तरीका है malloc() के आसपास एक रैपर लिखना।

static unsigned int requested =0; 

void* my_malloc(size_tamount){ 

    if (requested + amount < LIMIT){ 
     requested+=amount; 
     return malloc(amount); 
    } 

    return NULL 
} 

आप अपने मॉलोक को अधिभारित करने के लिए # परिभाषा का उपयोग कर सकते हैं।

जीएमएन राज्यों के रूप में, आप नए/हटाए गए ऑपरेटरों को भी अधिभारित कर सकते हैं (सी ++ मामले के लिए)।

सुनिश्चित नहीं हैं कि अगर सबसे अच्छा तरीका है, या क्या आप के लिए

+2

वैश्विक ऑपरेटर को नए/हटाए जाने से बेहतर होगा, क्योंकि सभी आवंटन होंगे किसी भी अन्य कोड को बदलने के बिना, उस के माध्यम से जाने के लिए। – GManNickG

+0

हां, नया/हटा ओवरलोडिंग मदद करेगा। इस पर एक मॉलोक ओवरलोड पर विचार करें। मेरे उत्तर को संपादित करना – Tom

+1

और आप रन-टाइम पर LIMIT सेटटेबल बनाने पर विचार कर सकते हैं, उदाहरण के लिए पर्यावरण चर के माध्यम से। –

5
  • कौन सा ओएस देख रहे हैं? यूनिक्स के लिए, अपने खोल (sh/csh) के आधार पर ulimit -d/सीमित डेटासाइज देखें।

  • आप मॉलोक के लिए एक रैपर लिख सकते हैं जो आपके इच्छित परिसंचरण में त्रुटि देता है। आपके ओएस के आधार पर, आप इसे कार्यान्वयन के लिए प्रतिस्थापित कर सकते हैं।

3

कि आपके मंच पर निर्भर करता है । उदाहरण के लिए, यह setrlimit(RLIMIT_DATA, ...) का उपयोग कर यूनिक्स-जैसे प्लेटफॉर्म पर प्रोग्रामेटिक रूप से हासिल किया जा सकता है।

संपादित:

RLIMIT_AS संसाधन भी रूप में अच्छी तरह इस मामले में उपयोगी हो सकता है।

+0

जीएनयू libc के खिलाफ, RLIMIT_DATA शक्तिहीन है। –

3

नया और नया ओवरराइड []।

void* operator new(size_t s) 
{ 
} 
void* operator new[](size_t s) 
{ 
} 

नए नंबर पर कॉल के बाद चुनिंदा रूप से मरने के लिए ब्रेसिज़ में अपना कोड रखें। आम तौर पर आप स्मृति आवंटित करने और इसे वापस करने के लिए मॉलोक को कॉल करेंगे।

2

मैं एक बार (सी में, हाँ, हाँ, मेरी गलती नहीं है) सीएस 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

कोई आश्चर्य नहीं ... वह आकार की एक सरणी बनाने की कोशिश कर रहा था '1.5013093754529657235677197216425e + 68' – RCIX

1

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

1

जहां तक ​​मुझे पता है, लिनक्स पर, malloc कभी भी शून्य सूचक नहीं लौटाएगा। इसके बजाय, OOM Killer कॉल किया जाएगा। यह निश्चित रूप से, जब तक आप ओओएम किलर को अक्षम नहीं कर लेते हैं। कुछ googling परिणाम के साथ आना चाहिए।

मुझे पता है कि यह आपका वास्तविक प्रश्न नहीं है, लेकिन आपको यह कहां से करना है कि आप कहां से आ रहे हैं।

+0

कभी-कभी ओओएम को बुलाया जाता है, कभी-कभी आपको एक नल पॉइंटर मिलता है: http://linuxdevcenter.com/pub/a/linux/2006 /11/30/linux-out-of-memory.html?page=1 – jwhitlock

3

ऐसा करने का एक अन्य तरीका failmalloc का उपयोग करना है जो एक साझा लाइब्रेरी है जो मॉलोक इत्यादि को ओवरराइड करता है और फिर विफल :-)। यह आपको असफल होने पर नियंत्रण देता है और यादृच्छिक रूप से असफल होने के लिए बनाया जा सकता है, प्रत्येक एनएच समय आदि

मैंने इसे स्वयं का इस्तेमाल किया है लेकिन अच्छी चीजें सुनी हैं।

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

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