Гейзенбаг
Гейзенбаг (англ. Heisenbug) — термин, используемый в программировании для описания программной ошибки, которая исчезает или меняет свои свойства при попытке её обнаружения. Это слово, в отличие от слова «баг», в русском языке практически не используется. Не полностью идентичный, но достаточно близкий по значению русскоязычный термин — «плавающая ошибка».
Примером могут являться ошибки, которые проявляются в окончательном варианте программы (релизе), однако не видны в режиме отладки, или ошибки синхронизации в многопоточном приложении.
Содержание |
Происхождение названия [править]
Данное название является игрой слов и происходит от физического термина «Принцип неопределённости Гейзенберга», который на бытовом уровне понимается как изменение наблюдаемого объекта в результате самого факта наблюдения, происходящее в квантовой механике.
В интервью журналу ACM Queue (номер 8 за ноябрь 2004) Брюс Линдсей рассказывает, что присутствовал в тот момент, когда данный термин был впервые употреблён в значении «ты смотришь на него — и он исчезает» (сравните со словами Гейзенберга, который говорил: «чем более пристально вы глядите на один предмет, тем меньше внимания вы уделяете чему-то ещё»).
Возможные причины возникновения [править]
Как правило, это низкоуровневые проблемы:
- Неинициализированная переменная — переменной не присвоено значение, но в отладчике она попадает на область памяти, заполненную нулями, а в реальной работе в памяти по тому же адресу находится произвольное значение.
- Неправильный порядок инициализации — инициализация может происходить на более поздней стадии работы, чем первое использование, при этом после инициализации проблема не проявляется (при этом на стадии отладки порядок инициализации совпадает с порядком использования).
- Ошибка синхронизации в многозадачной среде или многопоточном приложении (т. н. состояние гонки) — всевозможные ошибки от неправильной установки семафоров до ошибок, связанных с взаимными приоритетами работы потоков (приоритеты при отладке и в реальной работе могут отличаться).
- Аппаратная ошибка.
Ошибки оптимизаторов:
- Ошибка алгоритма удаления мёртвого кода — алгоритм может ошибочно посчитать, что блок не имеет побочных эффектов и удалить его, при этом вставка отладочных команд для вывода на экран или в лог уже не даст удалить этот блок, как мёртвый.
Методы борьбы [править]
Гейзенбаги очень сложно искать, поскольку они проявляются в зависимости от случайных факторов и воспроизводятся нестабильно (свою роль играет и сложность анализа состояния многопоточной системы). Поэтому их стараются отсечь еще на этапе проектирования, продумывая процедуры синхронизации.
Сходные понятия [править]
- Борбаг (Bohr bug)
- Мандельбаг (Mandelbug)
- Шрёдинбаг (Schroedinbug)
Борбаг [править]
Борбаг (англ. Bohr bug) — термин, используемый в программировании для описания программной ошибки, которая, в противоположность гейзенбагу, не исчезает и не меняет своих свойств при попытке её обнаружения. Это слово, в отличие от слова «баг», в русском языке практически не используется. Близкий по значению русскоязычный аналог — «стабильный» или «устойчивый» баг.[1]
См. также [править]
Примечания [править]
Ссылки [править]
- Интервью Брюса Линдсея (русский перевод)
- Один из примеров гейзенбага
| Это заготовка статьи о компьютерах. Вы можете помочь проекту, исправив и дополнив её. Это примечание по возможности следует заменить более точным. |