Как я могу перехватить программу, которая возвращает 139 (ошибка сегментации) в bash?


10

У меня есть скрипт bash, который тестирует некоторые программы, и одна из них возвращается, 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

В bash или 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из строя, ваш bash просто получает, потому что какой-то ребенок вышел (любым способом).

Однако вы можете использовать код выхода, сохраненный $?в некотором условном выражении , и trap SIGCHLD:

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

Обратите внимание, что это set -bmможет понадобиться, если это (что он, вероятно, делает) используется в неинтерактивном bash (например, в скрипте).

Изменить: См. Также этот (Жиль) ответ на аналогичную проблему с использованием bashи trap.


Нечто странное происходит. Я использую ловушку trap "echo 'something happened!'" {1..64}и до сих пор ничего не получаю. Я даже пробовал с set -bmи set -o monitorнада.
Питикос

Вы пробовали это в интерактивном режиме? trap "echo 'something happened'" {1..31}работает для меня (опуская !и те характеристики сигнала, которые приводят к bash: trap: XX: invalid signal specification).
sr_
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.