Як я можу захопити програму, яка повертає 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.

Коли у вашій програмі segfaults, ваш баш просто отримує те, SIGCHLDщо якась дитина вийшла (будь-яким способом).

Однак ви можете використовувати вихідний код, який зберігається $?в деякому умовному режимі, і пастку SIGCHLD:

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

Зауважте, що це set -bmможе знадобитися, якщо це (те, що, мабуть, робиться) використовується в неінтерактивному баші (наприклад, скрипті).

Редагувати: Дивіться також цю відповідь (Жиль) на аналогічне питання за допомогою 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.