SIGSEGV

SIGSEGV
Описание Исключение при обращении в память
По умолчанию завершение с дампом памяти
Коды SA_SIGINFO
SEGV_MAPERR Обращение к незадействованной странице
SEGV_ACCERR Нарушение прав доступа к странице

SIGSEGV (от англ. signal и segmentation violation) — сигнал, используемый в POSIX-системах, посылаемый процессу при ошибках сегментации — отказах страниц и других попытках обращения к несуществующей области памяти или при обращениях с нарушением прав доступа.

Определён как целочисленная константа в заголовочном файле signal.h. Символьные имена сигналов используются вместо номеров, так как в разных реализациях номера сигналов могут различаться.

В большинстве систем применяется техника подкачки страниц, когда память отображается в адресное пространство процесса страницами размером 4 КБ — 1 ГБ (в зависимости от аппаратной платформы и текущего режима работы процессора), по мере необходимости — по мере выделения памяти процессом. Страницы, в которые ещё ничего не отображено, а также «вытесненные» в процессе свопинга виртуальной памяти, или связанные с ещё незагруженными частями отображённого файла), вызывают отказ страницы. Обрабатывая страничное нарушение для «вытесненной» страницы памяти или незагруженной части файла, операционная система обеспечивает наличие страницы, вызывавшей нарушение (например, подгружая её с накопителя), при возврате к выполнению процесса (и с «вытеснением» другой страницы, если это необходимо). Если же в странице адресного пространства ранее ничего отображено не было, то операционная система посылает процессу сигнал SIGSEGV, чтобы прекратить его выполнение.

Кроме этого, каждая страница адресного пространства имеет атрибуты, разрешающие процессу чтение и запись (а новые процессоры также позволяют запретить выполнение программы из памяти страницы, например, для предотвращения выполнения кода при переполнении буфера в стеке). При попытке записи, чтения или выполнения программы в странице, в которой это запрещено, возникает нарушение защиты, обрабатывая которое, операционная система посылает процессу сигнал SIGSEGV, чтобы прекратить его выполнение.

Операционная система может предоставить дополнительные данные о возникшей ошибке, используя стек сигнала (англ. signal stack), который может помочь разработчику в отладке данной ошибки.

По умолчанию процесс аварийно завершается с генерацией дампа памяти (или другой операции зависящей от платформы), который можно использовать для получения информации об условиях возникновения исключения.

SIGSEGV может быть перехвачен или проигнорирован. Однако игнорирование SIGSEGV, в некоторых случаях, может привести к непредсказуемым результатам[1].

Примером программы, перехватывающей SIGSEGV, может служить отладчик, который способен проанализировать стек и информировать разработчика, на каком этапе произошла ошибка.

Примечания

  1. 2.4.1 Signal Generation and Delivery Архивная копия от 3 марта 2009 на Wayback Machine // The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition