मैं ऐसे प्रोग्राम को कैसे फँसा सकता हूं जो 139 (विभाजन दोष) को बैश में लौटाता है?


10

मेरे पास एक बैश स्क्रिप्ट है जो कुछ कार्यक्रमों का परीक्षण करती है और कार्यक्रम में से एक रिटर्न देता है Segmentation faultइसलिए मैंने अपनी स्क्रिप्ट के सिर में एक जाल जोड़ने की कोशिश की:

trap "echo 'segfault occured!'" SIGSEGV

हालांकि उसने कुछ नहीं किया। मैंनें इस्तेमाल किया

echo $?

बस उस प्रोग्राम के बाद जो segfault का उत्पादन करता है और मुझे आउटपुट के रूप में 139 मिलता है । मैं उस विशिष्ट त्रुटि कोड के लिए एक जाल कैसे जोड़ सकता हूं?

जवाबों:


7

trap "$instructions" SIGSEGV जाल विभाजन खोल में ही दोष है।

यदि आप अपनी स्क्रिप्ट चलाते हैं set -e, तो आप एक जाल डाल सकते हैं EXIT(या 0)। यह तब निष्पादित किया जाएगा जब आपकी स्क्रिप्ट समाप्त हो जाएगी (चाहे एक कमांड नॉनज़ेरो स्थिति लौटने के कारण, या स्पष्ट रूप से कॉल exitकरके या स्क्रिप्ट के अंत में गिरने से)। एक विभाजन दोष के लिए परीक्षण $?करने के लिए, जाल में प्रवेश की जांच करें । (ध्यान दें कि $?139 हो सकता है क्योंकि कार्यक्रम सामान्य रूप से स्थिति 139 के साथ लौटा है; यह बेहतर है यदि आप शेल में अपना प्रसंस्करण करते हैं।)

set -e
trap 'case $? in
        139) echo "segfault occurred";;
      esac' EXIT

बैश या ksh या zsh में, आपको set -eप्रत्येक कमांड के बाद एक ट्रैप को निष्पादित करने के लिए उपयोग करने की आवश्यकता नहीं होती है जो नॉनज़रो स्टेटस लौटाता है, आप ERRइसके बजाय ट्रैप लगा सकते हैं । पहले की तरह, आपको $?जाल में प्रवेश की जांच करने की आवश्यकता है , और 139 कैन (लेकिन शायद ही कभी करता है) का मतलब है कि कार्यक्रम ने यह स्थिति वापस कर दी है।


6

से man bash:

   trap [-lp] [[arg] sigspec ...]
          The command arg is to  be  read  and  executed  when  the  shell
          receives  signal(s)  sigspec.

जब आपका प्रोग्राम अलग हो जाता है, तो आपका बैश बस हो जाता है SIGCHLDक्योंकि कुछ बच्चे बाहर निकल जाते हैं (जो भी तरीके से)।

हालाँकि, $?आप कुछ सशर्त, और जाल में संग्रहित, बाहर निकलने का उपयोग कर सकते हैं SIGCHLD:

trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD

ध्यान दें कि set -bmयदि ऐसा हो सकता है तो इसकी आवश्यकता हो सकती है (यह संभवतः ऐसा करता है) एक गैर-संवादात्मक बैश (जैसे एक स्क्रिप्ट) में उपयोग किया जाता है।

संपादित करें: यह भी देखें (Gilles ') का उपयोग कर एक समान मुद्दे पर उत्तरbash और trap


कुछ अजीब होता है। मैं जाल का उपयोग करता हूं trap "echo 'something happened!'" {1..64}और फिर भी मुझे कुछ नहीं मिलता है। मैं भी साथ tryied set -bmऔर set -o monitorलेकिन नाडा।
पिथिकोस

क्या आपने यह अंतःक्रियात्मक रूप से आज़माया है? trap "echo 'something happened'" {1..31}मेरे लिए काम करता है ( !उन सिग्नल स्पेक्स को छोड़कर जो आगे बढ़ते हैं bash: trap: XX: invalid signal specification)।
sr_
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.