Аварийный отказ (программирование)
Аварийный отказ[1][2] (также катастрофический отказ[1][2], авария[3][2], фатальный сбой[2], разг. крах, вылет, падение, краш англ. crash) — это аварийное завершение программы или операционной системы, когда они перестают нормально функционировать.
Часто программа зависает, пока не будет создан отчёт об ошибке с подробностями отказа.
Если программа является важной частью операционной системы, вся система может аварийно завершить работу или зависнуть в результате паники ядра или фатальной системной ошибки.
Большинство отказов являются результатом выполнения недопустимых машинных инструкций. Например, когда счётчик команд установлен на неправильный адрес, или в результате переполнения буфера перезаписывается часть данных программы из-за ошибки. Это приводит к доступу к случайным значениям данных в памяти, которые уже не соответствуют начальному запросу, и происходит обработка исключений в процессоре.
Исходная ошибка программного обеспечения, которая запустила эту цепочку событий, как правило, считается причиной сбоя, который обнаруживается в процессе отладки. Это часто далеко не очевидно, так как исходная ошибка может быть далека от события сбоя и казаться совершенно корректным исходным кодом.
Отказы программ
Приложение обычно завершает работу, когда оно выполняет операцию, которая не разрешена операционной системой. Затем операционная система запускает в приложении исключение или сигнал.
Unix приложения традиционно отвечают на сигнал с помощью дампа памяти. Большинство Windows и Unix приложений с графическим интерфейсом пользователя отвечают отображением диалогового окна с возможностью подключения отладчика, если он установлен.
Некоторые приложения пытаются восстановиться после ошибки и продолжить работу вместо выхода.
Типичные ошибки, приводящие к сбоям приложений, включают:
- Попытку чтения или записи памяти, которая не предназначена для чтения или записи этим приложением (ошибка сегментации или ошибка защиты).
- Попытка выполнить привилегированные или недействительные команды.
- Попытки выполнить операции ввода-вывода на устройствах, к которым у него нет разрешения на доступ.
- Передача недопустимых аргументов системным вызовам.
- Попытка получить доступ к другим системным ресурсам, к которым у приложения нет разрешения на доступ.
- Попытка выполнить машинные команды с плохими аргументами (в зависимости от архитектуры процессора): деление на ноль, операции с значениями денормализованными числами или NaN, доступ к памяти в неприсоединенных адресах и т. д.
Отказ Web-сервера
Приложение, запущенное на веб-сервере, может отказать, и сайт может не работать или показывать сообщение с ошибкой.
К примеру, если сайт, использующий базу данных SQL (например MySQL) использует скрипт (например на PHP), и этот сервер упадёт, то PHP выдаст ошибку подключения.
См. также
- Типобезопасность и Безопасность доступа к памяти — меры пресечения возможности возникновения
- Ошибка сегментации
- Переполнение буфера
- Утечка памяти
- Защита памяти
- Синий экран смерти
- Аварийный останов
Примечания
- Першиков. Толковый словарь по информатике. — 1991. — С. 245.
- Орлов. Англо-русский словарь по вычислительной технике и информационным технологиям. — 4-е изд. — 2009. — ISBN 5-93037-124-5.
- Толковый словарь по вычислительной технике. — Microsof Press, 1995. — С. 107. — ISBN 5750200086.
Литература
- Andreas Zeller. Why Programs Fail: A Guide to Systematic Debugging. — Morgan Kaufmann, 2006. — 448 с. — ISBN 1-55860-866-4.