Como posso interceptar um programa que retorna 139 (falha de segmentação) no bash?

9

Eu tenho um script bash que testa alguns programas e um dos programas retorna Segmentation fault , então tentei adicionar uma armadilha na cabeça do meu script:

trap "echo 'segfault occured!'" SIGSEGV

Isso, no entanto, não fez nada. Eu usei

echo $?

logo após o programa que produz o segfault e recebo 139 como saída. Como posso adicionar uma armadilha para esse código de erro específico?

    
por Pithikos 10.11.2011 / 11:43

2 respostas

6

trap "$instructions" SIGSEGV captura falhas de segmentação no próprio shell.

Se você executar seu script em set -e , poderá colocar uma interceptação em EXIT (ou 0 ). Ele será executado quando seu script for finalizado (devido a um comando que retorna um status diferente de zero ou pela chamada explícita de exit ou pela queda do final do script). Para testar uma falha de segmentação, verifique $? na entrada do trap. (Observe que $? poderia ser 139 porque o programa retornou normalmente com o status 139; isso é evitável se você fizer seu processamento no shell.)

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

No bash ou ksh ou zsh, você não precisa usar set -e para executar uma interceptação após cada comando que retorna um status diferente de zero, você pode colocar uma interceptação em ERR . Como antes, você precisa verificar $? na entrada do trap, e 139 pode (mas raramente) significa que o programa retornou este status.

    
por 11.11.2011 / 01:48
5

De man bash :

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

Quando seus segfaults do programa, seu bash apenas recebe um SIGCHLD porque algumas crianças saíram (de qualquer maneira).

Você pode, no entanto, usar o exitcode, armazenado em $? , em alguns condicionais, e trap SIGCHLD :

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

Observe que set -bm pode ser necessário se isso (o que provavelmente faz) for usado em uma ação não interativa (como um script).

Editar: Veja também esta (Gilles ' ) responda a um problema similar usando bash e trap .

    
por 10.11.2011 / 13:11