SIGSEGV

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

В POSIX-системах SIGSEGV — сигнал, посылаемый процессу при попытке обращения к несуществующей памяти или обращения с нарушением прав доступа.

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

Этимология[править | править код]

SIG — общий префикс сигналов (от англ. signal), SEGV — англ. segmentation violation — нарушение сегментации.

На самом деле, современные Unix-подобные операционные системы (во всяком случае, на платформе i386) используют для управления памятью технологию страничного преобразования, вызывающую «страничные нарушения» и «нарушения защиты». Сегментация же (и порождаемые ею «нарушения сегментации») не используется, или используется в специфических трюках.

Использование[править | править код]

Система отображает память в адресное пространство процесса страницами размером 4КБ—1 ГБ (размер страницы зависит от аппаратной платформы и текущего режима работы процессора), по мере необходимости — по мере выделения памяти процессом. Также, в адресное пространство могут быть отображены:

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

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

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

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

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

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

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

См. также[править | править код]