जांच कैसे करें, कौन सी सीमा पार हो गई थी? (प्रक्रिया समाप्त होने के कारण समाप्त कर दी गई है।)


11

चलो मान लें कि प्रक्रिया सीमांकित वातावरण में चलती है:

(
ulimit  ... -v ... -t ... -x 0 ...
./program
)

कार्यक्रम समाप्त हो गया है।

कई कारण हो सकते हैं: मेमोरी / समय / फ़ाइल सीमा पार हो गई; बस सरल segfault; या रिटर्न कोड 0 के साथ सामान्य समाप्ति भी।

बिना कार्यक्रम को संशोधित किए, कार्यक्रम समाप्ति का कारण क्या है?

PS का अर्थ है "जब बाइनरी दी जाती है"। शायद कुछ रैपर (ptrace-ing आदि) मदद कर सकते हैं?

जवाबों:


6

सामान्यतया, मुझे नहीं लगता कि आप दुर्भाग्य से कर सकते हैं। (कुछ ऑपरेटिंग सिस्टम इसके लिए प्रदान कर सकते हैं, लेकिन मैं उन लोगों के बारे में नहीं जानता जो मुझे पता है कि यह समर्थन कर रहा है।)

संसाधन सीमा के लिए संदर्भ डॉक्टर: getrlimitPOSIX 2008 से।

उदाहरण के लिए सीपीयू की सीमा लें RLIMIT_CPU

  • यदि प्रक्रिया नरम सीमा से अधिक हो जाती है, तो इसे भेजा जाता है a SIGXCPU
  • यदि प्रक्रिया कठिन सीमा से अधिक है, तो यह एक सादा हो जाता है SIGKILL

यदि आप wait()अपने कार्यक्रम पर कर सकते हैं , तो आप बता सकते हैं कि यह किसके द्वारा मारा गया था SIGXCPU। लेकिन आप SIGKILLबाहर से एक सादे पुराने मार से कठिन सीमा के उल्लंघन के लिए एक प्रेषण को अलग नहीं कर सकते थे । क्या अधिक है, अगर प्रोग्राम संभालता है XCPU, तो आप इसे बाहर से भी नहीं देखेंगे।

के लिए एक ही बात है RLIMIT_FSIZE। आप स्थिति SIGXFSZसे देख सकते हैं wait()अगर कार्यक्रम इसे संभाल नहीं करता है। लेकिन एक बार फ़ाइल का आकार सीमा पार हो जाने के बाद, केवल एक चीज यह होती है कि आगे I / O जो उस सीमा को फिर से परखने का प्रयास करता है EFBIG- उसे आंतरिक रूप से प्रोग्राम द्वारा नियंत्रित किया जाएगा (या नहीं, दुर्भाग्य से)। यदि प्रोग्राम संभालता है SIGXFSZ, तो ऊपर जैसा ही - आपको इसके बारे में पता नहीं होगा।

RLIMIT_NOFILE? ठीक है, तुम भी एक संकेत नहीं मिलता है। openऔर दोस्त सिर्फ EMFILEकार्यक्रम में लौटते हैं । यह अन्यथा परेशान नहीं है, इसलिए यह उस स्थिति में विफल करने के लिए जिस भी तरीके से कोडित किया गया था (या नहीं) विफल होगा।

RLIMIT_STACK? अच्छा पुराना SIGSEGV, एक दिया जाने के लिए अन्य कारणों के स्कोर से अलग नहीं किया जा सकता है। (आपको पता चल जाएगा कि इस waitस्थिति से क्या मारा गया था ।)

RLIMIT_ASऔर RLIMIT_DATAबस बना देंगे malloc()और कुछ अन्य लोग विफल होने लगते हैं (या SIGSEGVअगर लिनक्स पर स्टैक का विस्तार करने की कोशिश करते समय एएस की सीमा हिट होती है) प्राप्त करें। जब तक कार्यक्रम बहुत अच्छी तरह से लिखा नहीं जाता है, यह संभवतः उस बिंदु पर काफी अनियमित रूप से विफल हो जाएगा।

इसलिए संक्षेप में, आम तौर पर, विफलताएं या तो अन्य प्रक्रिया मृत्यु के कारणों से भिन्न नहीं होती हैं, इसलिए आप सुनिश्चित नहीं हो सकते हैं, या पूरी तरह से उस कार्यक्रम से निपट सकते हैं जिस स्थिति में यह तय करता है कि कब / कब / कैसे यह आगे बढ़ता है, न कि आप बाहर से।

सबसे अच्छा आप कर सकते हैं जहाँ तक मुझे पता है कि एक बिट कोड लिखा है जो आपके प्रोग्राम के कांटे, उस पर इंतजार करता है, और:

  • पता लगाने के लिए बाहर निकलने की स्थिति की जाँच करें SIGXCPUऔर SIGXFSZ(AFAIK, उन संकेतों को केवल संसाधन सीमा समस्याओं के लिए OS द्वारा उत्पन्न किया जाएगा)। आपकी सटीक आवश्यकताओं के आधार पर, आप यह मान सकते हैं कि संसाधन सीमा से संबंधित थे SIGKILLऔर SIGSEGVयह भी थोड़ा खिंचाव था।
  • getrusage(RUSAGE_CHILDREN,...)अन्य लोगों के बारे में संकेत प्राप्त करने के लिए आप अपने कार्यान्वयन पर क्या देख सकते हैं।

ओएस-विशिष्ट सुविधाएं यहां (संभवतः ptraceलिनक्स, या सोलारिस जैसी चीजें dtrace), या संभवतः डिबगर-प्रकार की तकनीकों में मदद करने के लिए मौजूद हो सकती हैं , लेकिन यह आपके विशिष्ट कार्यान्वयन के लिए और भी अधिक बंधी होने वाली है।


(मैं उम्मीद कर रहा हूं कि कोई और व्यक्ति किसी ऐसी जादूई बात का जवाब देगा, जिससे मैं पूरी तरह अनजान हूं।)


ठीक है। क्या केवल उन तीन के बारे में: (मेम) स्मृति सीमा, (समय) समय सीमा, (त्रुटि) अन्य त्रुटि से अधिक है? मैं चारों ओर आवरण बनाने के बारे में जानता हूं mallocलेकिन दुर्भाग्य से यह सामान्य रूप से मेमोरी समस्या को हल नहीं करता है, सामान्य तौर पर यह सिस्टम कॉल के बारे में है brk(क्या मैं सही हूं?)।
ग्रेज़गोरज़ वियरज़ोवेकी

1
यदि आप प्रोग्राम को नियंत्रित नहीं करते हैं तो रैपिंग मॉलोक मदद नहीं करेगा। आप हैक्स के बारे में की तरह बात कर रहे हैं LD_PRELOADअपने "प्रक्रिया को संशोधित नहीं" बाधा के लिए कि की सीमा रेखा ing, और यह थोड़ा में मदद मिलेगी, लेकिन वास्तव में नहीं - malloc, brk, sbrkऔर mmapसाथ विफल हो जाएगा ENOMEM, बिल्कुल के रूप में यदि आप वास्तव में एक कम स्मृति स्थिति में थे (लेकिन स्मृति सीमा से नीचे)। समय सीमा है RLIMIT_CPU, मुझे दीवार-घड़ी की समय सीमा का पता नहीं है।
Mat

मुझे सुनिश्चित करने के लिए धन्यवाद brk। जैसा कि मैंने देखा, आवश्यकता 'प्रोग्राम सिग्नल X, Y, Z ... हैंडल नहीं कर रहा है', SIGXCPU, SIGXFSZ, SIGSEGV की समस्याओं को हल करेगा, वेटपिड के लिए धन्यवाद (यदि मैं गलत हूं, तो कृपया मुझे सुधारें)।
ग्रेज़गोरज़ वियरज़ोवेकी

1
SIGSEGV को उन स्थितियों में उठाया जा सकता है जो संसाधन सीमा उल्लंघनों नहीं हैं (अशक्त सूचक dereference सबसे आम बात है जो इसे उठाती है) - आप यह सुनिश्चित नहीं कर सकते हैं कि यह एक ulimit हिट है जो इसका कारण बनता है।
Mat

मुझे सुनिश्चित करने के लिए धन्यवाद brk। जैसा कि मैं देख रहा हूं, आवश्यकता 'प्रोग्राम सिग्नल X, Y, Z ... को हैंडल नहीं कर रहा है।' 'SIGXCPU, SIGXFSZ, SIGSEGV की समस्याओं को हल करने के लिए धन्यवाद का समाधान करेगा। क्या मैं सही हू?
ग्रेज़गोरज़ विएर्ज़ोवेकी

3

मैं वर्तमान में उसी मुद्दे पर कुछ काम कर रहा हूं। मैं इसका आंशिक समाधान करने में सक्षम हूं। मैंने ऑडिट सिस्टम का उपयोग किया है । आप [1] पर काम को ट्रैक कर सकते हैं।

[१] https://github.com/PaulDaviesC/Logging-limits.conf

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.