SIGBUS
В POSIX-системах, SIGBUS — сигнал, сигнализирующий об ошибке шины, при обращении к физической памяти.
SIGBUS | |
---|---|
Описание | Сигнал ошибки шины |
По умолчанию | завершение с дампом памяти |
Коды SA_SIGINFO | |
Не имеет специфических кодов |
SIGBUS
— целочисленная константа, определённая в заголовочном файле signal.h
. Символьные имена сигналов используются вместо номеров, так как в разных реализациях номера сигналов могут различаться.
ЭтимологияПравить
SIG — общий префикс сигналов (от англ. signal), BUS — англ. bus — шина данных (или адресная шина).
ИспользованиеПравить
Процесс может получить SIGBUS при неправильном обращении к памяти:
- Неправильное выравнивание данных
- При попытке обращения, не удовлетворяющей правилам выравнивания, принятым на применяемом процессоре.
- Обращение к несуществующей физической памяти
- Обращение к адресам, для которых на компьютере не установлено памяти. Исключение аналогично ошибке сегментации, но в применении к физическим, а не виртуальным адресам.
- Аппаратная ошибка специфичная объекту
- Более редкий случай, например в Solaris такой сигнал возникает, когда страницы виртуальной памяти перестают быть доступны, из-за проблем доступа к объекту, который на них отображён (например, когда отображённый с помощью
mmap()
файл был впоследствии урезан [1] Архивная копия от 16 июля 2010 на Wayback Machine (англ.)).
Операционная система может предоставить дополнительные данные о возникшей ошибке, используя стек сигнала (англ. signal stack), который может помочь разработчику в отладке данной ошибки.
По умолчанию, процесс аварийно завершается с генерацией дампа памяти (и/или другой операции зависящей от платформы), который можно использовать для получения информации об условиях возникновения исключения.
SIGBUS может быть перехвачен или проигнорирован. Однако игнорирование SIGBUS, в некоторых случаях, может привести к непредсказуемым результатам. Примером программы, перехватывающей SIGBUS, может служить отладчик, который способен проанализировать стек и информировать разработчика на каком этапе произошла ошибка.