SIGSEGV
SIGSEGV (от англ. signal и segmentation violation) — сигнал, используемый в POSIX-системах, посылаемый процессу при ошибках сегментации — отказах страниц и других попытках обращения к несуществующей области памяти или при обращениях с нарушением прав доступа.
SIGSEGV | |
---|---|
Описание | Исключение при обращении в память |
По умолчанию | завершение с дампом памяти |
Коды SA_SIGINFO | |
SEGV_MAPERR | Обращение к незадействованной странице |
SEGV_ACCERR | Нарушение прав доступа к странице |
Определён как целочисленная константа в заголовочном файле signal.h
. Символьные имена сигналов используются вместо номеров, так как в разных реализациях номера сигналов могут различаться.
В большинстве систем применяется техника подкачки страниц, когда память отображается в адресное пространство процесса страницами размером 4 КБ — 1 ГБ (в зависимости от аппаратной платформы и текущего режима работы процессора), по мере необходимости — по мере выделения памяти процессом. Страницы, в которые ещё ничего не отображено, а также «вытесненные» в процессе свопинга виртуальной памяти, или связанные с ещё незагруженными частями отображённого файла), вызывают отказ страницы. Обрабатывая страничное нарушение для «вытесненной» страницы памяти или незагруженной части файла, операционная система обеспечивает наличие страницы, вызывавшей нарушение (например, подгружая её с накопителя), при возврате к выполнению процесса (и с «вытеснением» другой страницы, если это необходимо). Если же в странице адресного пространства ранее ничего отображено не было, то операционная система посылает процессу сигнал SIGSEGV, чтобы прекратить его выполнение.
Кроме этого, каждая страница адресного пространства имеет атрибуты, разрешающие процессу чтение и запись (а новые процессоры также позволяют запретить выполнение программы из памяти страницы, например, для предотвращения выполнения кода при переполнении буфера в стеке). При попытке записи, чтения или выполнения программы в странице, в которой это запрещено, возникает нарушение защиты, обрабатывая которое, операционная система посылает процессу сигнал SIGSEGV, чтобы прекратить его выполнение.
Операционная система может предоставить дополнительные данные о возникшей ошибке, используя стек сигнала (англ. signal stack), который может помочь разработчику в отладке данной ошибки.
По умолчанию процесс аварийно завершается с генерацией дампа памяти (или другой операции зависящей от платформы), который можно использовать для получения информации об условиях возникновения исключения.
SIGSEGV может быть перехвачен или проигнорирован. Однако игнорирование SIGSEGV, в некоторых случаях, может привести к непредсказуемым результатам[1].
Примером программы, перехватывающей SIGSEGV, может служить отладчик, который способен проанализировать стек и информировать разработчика, на каком этапе произошла ошибка.
Примечания
- 2.4.1 Signal Generation and Delivery // The Open Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition