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

10

У меня есть скрипт bash, который тестирует некоторые программы, и одна из них возвращается, Segmentation faultпоэтому я попытался добавить ловушку в заголовок моего скрипта:

trap "echo 'segfault occured!'" SIGSEGV

Это, однако, ничего не сделал. я использовал

echo $?

сразу после программы, которая производит segfault, и я получаю 139 в качестве вывода. Как я могу добавить ловушку для этого конкретного кода ошибки?

Pithikos
источник

Ответы:

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.

Sr-
источник
Нечто странное происходит. Я использую ловушку trap "echo 'something happened!'" {1..64}и до сих пор ничего не получаю. Я даже пробовал с set -bmи set -o monitorнада.
Питикос
Вы пробовали это в интерактивном режиме? trap "echo 'something happened'" {1..31}работает для меня (опуская !и те характеристики сигнала, которые приводят к bash: trap: XX: invalid signal specification).
sr_