Bash에서 139(세그먼트 오류)를 반환하는 프로그램을 잡는 방법은 무엇입니까?

Bash에서 139(세그먼트 오류)를 반환하는 프로그램을 잡는 방법은 무엇입니까?

일부 프로그램을 테스트하기 위한 bash 스크립트가 있고 프로그램 중 하나가 반환되므로 Segmentation fault스크립트 헤드에 트랩을 추가해 보았습니다.

trap "echo 'segfault occured!'" SIGSEGV

그러나 이것은 아무런 효과가 없었습니다. 나는 사용했다

echo $?

segfault를 생성하는 프로그램 직후에139출력으로. 이 특정 오류 코드에 대한 트랩을 어떻게 추가할 수 있나요?

답변1

trap "$instructions" SIGSEGV셸 자체에서 분할 오류를 포착합니다.

에서 스크립트를 실행하면 ( 또는 ) 에 트랩을 배치할 수 있습니다 set -e. 스크립트가 종료될 때 실행됩니다(0이 아닌 상태를 반환하는 명령으로 인해, 명시적인 호출에 의해 또는 스크립트 끝에서 벗어난 경우). 분할 오류를 테스트하려면 트랩의 진입점을 확인하세요. (프로그램이 정상적으로 상태 139로 반환되기 때문에 아마도 139일 것입니다. 셸에서 수행하는 경우 이를 피할 수 있습니다.)EXIT0exit$?$?

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

set -eBash, ksh 또는 zsh에서는 0이 아닌 상태를 반환하는 모든 명령 후에 트랩을 수행 할 필요가 없으며 대신 트랩을 배치할 수 있습니다 ERR. 이전과 마찬가지로 $?트랩의 진입점을 확인해야 합니다 . 139는 (그러나 드물게) 프로그램이 이 상태를 반환했음을 의미할 수 있습니다.

답변2

에서 man bash:

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

프로그램 segfault가 발생하면 SIGCHLD일부 하위 항목이 (어떤 식으로든) 종료되었기 때문에 bash는 오류를 받게 됩니다.

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

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

set -bm비대화형 bash(예: 스크립트)에서 이 기능(무엇을 할 수 있는지)을 사용하는 경우 이 작업을 수행해야 할 수도 있습니다 .

편집하다:당신은 또한 볼 수 있습니다이 (자일스의) 답변비슷한 질문에는 bash및 를 사용하세요 trap.

관련 정보