bash에서 139 (세그먼트 오류)를 반환하는 프로그램을 어떻게 트랩 할 수 있습니까?


10

일부 프로그램을 테스트하는 bash 스크립트가 있고 프로그램 중 하나가 반환 Segmentation fault되므로 스크립트 헤드에 트랩을 추가하려고했습니다.

trap "echo 'segfault occured!'" SIGSEGV

그러나 그것은 아무것도하지 않았습니다. 나는 사용했다

echo $?

segfault를 생성하는 프로그램 직후에 출력으로 139 를 얻습니다 . 특정 오류 코드에 대한 트랩을 어떻게 추가합니까?

답변:


7

trap "$instructions" SIGSEGV 쉘 자체에서 분할 결함을 트랩합니다.

에서 스크립트를 실행 set -e하면 EXIT(또는 0) 에 트랩을 넣을 수 있습니다 . 스크립트가 종료되면 (0이 아닌 상태를 리턴하는 명령으로 인해 또는 명시 적으로 호출 exit하거나 스크립트의 끝에서 떨어짐으로 인해) 실행됩니다. 세그먼테이션 결함을 테스트하려면 $?트랩 진입을 점검하십시오 . ( $?프로그램이 139 상태로 정상적으로 리턴되었으므로 139 일 수 있습니다. 쉘에서 처리를 수행하는 경우 피할 수 없습니다.)

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

bash 또는 ksh 또는 zsh에서는 set -e0이 아닌 상태를 반환하는 각 명령 후에 트랩을 실행하는 데 사용할 필요가 없으며 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.

프로그램이 segfaults 할 때, SIGCHLD어떤 아이가 (어쨌든) 빠져 나갔기 때문에 bash는 단지 얻을 수 있습니다.

그러나, $?일부 조건부 및 트랩에 저장된 종료 코드를 사용할 수 있습니다 SIGCHLD.

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

참고 set -bm이 (아마 무엇을) (예 : 스크립트로) 대화 형이 아닌 떠들썩한 파티에서 사용하는 경우 필요할 수 있습니다.

편집 : 참고 이 (질 ') 답변을 사용하여 유사한 문제에 bashtrap.


이상한 일이 발생합니다. 나는 함정을 사용 trap "echo 'something happened!'" {1..64}하지만 여전히 아무것도 얻지 못한다. 난과 tryied set -bm하고 set -o monitor있지만, 나다.
Pithikos

이것을 대화식으로 시도 했습니까? trap "echo 'something happened'" {1..31}나를 위해 일합니다 ( !및로 연결되는 신호 사양은 bash: trap: XX: invalid signal specification제외).
sr_
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.