Come posso intercettare un programma che restituisce 139 (errore di segmentazione) in bash?


10

Ho uno script bash che Segmentation faulttesta alcuni programmi e uno dei programmi ritorna quindi ho provato ad aggiungere una trappola nella testa del mio script:

trap "echo 'segfault occured!'" SIGSEGV

Che comunque non ha fatto nulla. ero solito

echo $?

subito dopo il programma che produce il segfault e ottengo 139 come output. Come posso aggiungere una trap per quel codice di errore specifico?

Risposte:


7

trap "$instructions" SIGSEGV intrappola i difetti di segmentazione nella shell stessa.

Se esegui lo script in set -e, puoi mettere una trappola su EXIT(o 0). Verrà eseguito al termine dello script (a causa di un comando che restituisce uno stato diverso da zero, o chiamando esplicitamente exito cadendo alla fine dello script). Per verificare la presenza di un errore di segmentazione, verificare $?l'ingresso nella trap. (Si noti che $?potrebbe essere 139 perché il programma è tornato normalmente con lo stato 139; questo è evitabile se si esegue l'elaborazione nella shell.)

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

In bash o ksh o zsh, non è necessario utilizzare set -eper eseguire una trap dopo ogni comando che restituisce uno stato diverso da zero, invece è possibile inserire una trap ERR. Come in precedenza, è necessario verificare $?l'accesso alla trap e 139 può (ma raramente) indicare che il programma ha restituito questo stato.


6

Da man bash:

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

Quando il tuo programma segfault, il tuo bash ottiene solo SIGCHLDperché un bambino è uscito (in qualunque modo).

Puoi, tuttavia, utilizzare il codice di uscita, memorizzato in $?, in alcuni condizionale, e trap SIGCHLD:

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

Nota che set -bmpotrebbe essere necessario se questo (quello che probabilmente fa) viene usato in un bash non interattivo (come uno script).

Modifica: vedi anche questa risposta (Gilles) su un problema simile usando bashe trap.


Succede qualcosa di strano. Uso la trappola trap "echo 'something happened!'" {1..64}e ancora non ottengo nulla. Ho anche provato con set -bme set -o monitorma nada.
Pithikos,

Hai provato questo in modo interattivo? trap "echo 'something happened'" {1..31}funziona per me (tralasciando le !specifiche del segnale e quelle che portano a bash: trap: XX: invalid signal specification).
sr_11
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.