Гейзенбаг

Поделись знанием:
(перенаправлено с «Шрединбаг»)
Перейти к: навигация, поиск

Гейзенбаг (англ. heisenbug) — термин, используемый в программировании для описания программной ошибки, которая исчезает или меняет свои свойства при попытке её обнаружения. Это слово, в отличие от слова «баг» (англ. bug), в русском языке слишком редко используется. Не полностью идентичный, но достаточно близкий по значению русскоязычный термин — «плавающая ошибка».

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

Сообщество Fedora выбрало «heisenbug» кодовым именем 20 версии дистрибутива.





Происхождение названия

Данное название является игрой слов и происходит от физического термина «принцип неопределённости Гейзенберга», который на бытовом уровне понимается как изменение наблюдаемого объекта в результате самого факта наблюдения, происходящее в квантовой механике.

В интервью журналу [acmqueue.com/modules.php?name=Content&pa=showpage&pid=233&page=5 ACM Queue (номер 8 за ноябрь 2004)] (англ.) Брюс Линдсей рассказывает, что присутствовал в тот момент, когда данный термин был впервые употреблён в значении «ты смотришь на него — и он исчезает» (сравните со словами Гейзенберга, который говорил: «чем более пристально вы глядите на один предмет, тем меньше внимания вы уделяете чему-то ещё»).

Возможные причины возникновения

Как правило, это низкоуровневые проблемы:

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

Ошибки оптимизаторов:

  • ошибка алгоритма удаления мёртвого кода — алгоритм оптимизации может ошибочно посчитать, что блок не имеет побочных эффектов и удалить его, при этом вставка отладочных команд для вывода на экран или в лог уже не даст удалить этот блок, как мёртвый, и отлаживаться будет уже немного другая программа.

Методы борьбы

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

Сходные понятия

Эти слова, равно как и «гейзенбаг», в русском языке.

Борбаг (англ. bohr bug) — термин, используемый в программировании для описания программной ошибки, которая, в противоположность гейзенбагу, не исчезает и не меняет своих свойств при попытке её обнаружения. Близкий по значению русскоязычный аналог — «стабильный» или «устойчивый» баг[1].

Мандельбаг (англ. mandel bug) — термин, используемый в программировании для описания программной ошибки, чьё поведение столь сложно, что выглядит хаотичным[2]. Название происходит от имени Бенуа Мандельброта, основоположника фрактальной геометрии. Однако, стоит заметить (по принципу, сходному с тестом Тьюринга), что, если не существует способа разделить ошибку, чьё поведение кажется хаотичным, и ошибку, чьё поведение действительно хаотично, то нет никакого смысла различать мандельбаг и гейзенбаг[3]. Некоторые используют термин мандельбаг для описания ошибки, чьё поведение не кажется действительно хаотичным, но столь сложно, что для её исправления требуется переписать программу с нуля. Примером такой ошибки может служить фундаментальная ошибка, допущенная при проектировании системы[4].

Шрёдинбаг[5] (англ. schroedin bug — в честь мысленного эксперимента с котом Шрёдингера) — термин, используемый в программировании для описания программной ошибки, которая никак не проявляет себя, однако внезапно возникает, если кто-то наткнётся на неё в исходном коде или попытается использовать программу в необычных условиях и осозна́ет, что система вообще не могла работать при наличии такой ошибки. После этого программа перестаёт работать вообще до тех пор, пока ошибка не будет исправлена. Хотя это звучит невероятно, некоторые программы содержат в себе такие ошибки.

Напишите отзыв о статье "Гейзенбаг"

Примечания

  1. [catb.org/jargon/html/B/Bohr-bug.html The jargon file. Bohr-bug] (англ.)
  2. [catb.org/jargon/html/M/mandelbug.html The new hacker's dictionary] (англ.).
  3. M. Grottke and K. S. Trivedi, Software faults, software aging and software rejuvenation. Journal of the reliability engineering association of Japan, выпуск 27, номер 7, 2005 год, страницы 425-438.
  4. Michael Grottke, Kishor S. Trivedi, «[www.computer.org/portal/web/csdl/doi/10.1109/MC.2007.55 Fighting bugs: remove, retry, replicate, and rejuvenate]» (англ.). Computer, выпруск 40, номер 2, февраль 2007, страницы 107—109, doi:10.1109/MC.2007.55
  5. [catb.org/jargon/html/S/schroedinbug.html The jargon file. Schroedinbug] (англ.)

Ссылки

  • [www.citforum.ru/database/articles/bruce/ Интервью Брюса Линдсея] (русский перевод)
  • [habrahabr.ru/post/85884/ Один из примеров гейзенбага]

Отрывок, характеризующий Гейзенбаг

«Один шаг за эту черту, напоминающую черту, отделяющую живых от мертвых, и – неизвестность страдания и смерть. И что там? кто там? там, за этим полем, и деревом, и крышей, освещенной солнцем? Никто не знает, и хочется знать; и страшно перейти эту черту, и хочется перейти ее; и знаешь, что рано или поздно придется перейти ее и узнать, что там, по той стороне черты, как и неизбежно узнать, что там, по ту сторону смерти. А сам силен, здоров, весел и раздражен и окружен такими здоровыми и раздраженно оживленными людьми». Так ежели и не думает, то чувствует всякий человек, находящийся в виду неприятеля, и чувство это придает особенный блеск и радостную резкость впечатлений всему происходящему в эти минуты.
На бугре у неприятеля показался дымок выстрела, и ядро, свистя, пролетело над головами гусарского эскадрона. Офицеры, стоявшие вместе, разъехались по местам. Гусары старательно стали выравнивать лошадей. В эскадроне всё замолкло. Все поглядывали вперед на неприятеля и на эскадронного командира, ожидая команды. Пролетело другое, третье ядро. Очевидно, что стреляли по гусарам; но ядро, равномерно быстро свистя, пролетало над головами гусар и ударялось где то сзади. Гусары не оглядывались, но при каждом звуке пролетающего ядра, будто по команде, весь эскадрон с своими однообразно разнообразными лицами, сдерживая дыханье, пока летело ядро, приподнимался на стременах и снова опускался. Солдаты, не поворачивая головы, косились друг на друга, с любопытством высматривая впечатление товарища. На каждом лице, от Денисова до горниста, показалась около губ и подбородка одна общая черта борьбы, раздраженности и волнения. Вахмистр хмурился, оглядывая солдат, как будто угрожая наказанием. Юнкер Миронов нагибался при каждом пролете ядра. Ростов, стоя на левом фланге на своем тронутом ногами, но видном Грачике, имел счастливый вид ученика, вызванного перед большою публикой к экзамену, в котором он уверен, что отличится. Он ясно и светло оглядывался на всех, как бы прося обратить внимание на то, как он спокойно стоит под ядрами. Но и в его лице та же черта чего то нового и строгого, против его воли, показывалась около рта.
– Кто там кланяется? Юнкег' Миг'онов! Hexoг'oшo, на меня смотг'ите! – закричал Денисов, которому не стоялось на месте и который вертелся на лошади перед эскадроном.
Курносое и черноволосатое лицо Васьки Денисова и вся его маленькая сбитая фигурка с его жилистою (с короткими пальцами, покрытыми волосами) кистью руки, в которой он держал ефес вынутой наголо сабли, было точно такое же, как и всегда, особенно к вечеру, после выпитых двух бутылок. Он был только более обыкновенного красен и, задрав свою мохнатую голову кверху, как птицы, когда они пьют, безжалостно вдавив своими маленькими ногами шпоры в бока доброго Бедуина, он, будто падая назад, поскакал к другому флангу эскадрона и хриплым голосом закричал, чтоб осмотрели пистолеты. Он подъехал к Кирстену. Штаб ротмистр, на широкой и степенной кобыле, шагом ехал навстречу Денисову. Штаб ротмистр, с своими длинными усами, был серьезен, как и всегда, только глаза его блестели больше обыкновенного.
– Да что? – сказал он Денисову, – не дойдет дело до драки. Вот увидишь, назад уйдем.
– Чог'т их знает, что делают – проворчал Денисов. – А! Г'остов! – крикнул он юнкеру, заметив его веселое лицо. – Ну, дождался.
И он улыбнулся одобрительно, видимо радуясь на юнкера.
Ростов почувствовал себя совершенно счастливым. В это время начальник показался на мосту. Денисов поскакал к нему.
– Ваше пг'евосходительство! позвольте атаковать! я их опг'окину.
– Какие тут атаки, – сказал начальник скучливым голосом, морщась, как от докучливой мухи. – И зачем вы тут стоите? Видите, фланкеры отступают. Ведите назад эскадрон.
Эскадрон перешел мост и вышел из под выстрелов, не потеряв ни одного человека. Вслед за ним перешел и второй эскадрон, бывший в цепи, и последние казаки очистили ту сторону.
Два эскадрона павлоградцев, перейдя мост, один за другим, пошли назад на гору. Полковой командир Карл Богданович Шуберт подъехал к эскадрону Денисова и ехал шагом недалеко от Ростова, не обращая на него никакого внимания, несмотря на то, что после бывшего столкновения за Телянина, они виделись теперь в первый раз. Ростов, чувствуя себя во фронте во власти человека, перед которым он теперь считал себя виноватым, не спускал глаз с атлетической спины, белокурого затылка и красной шеи полкового командира. Ростову то казалось, что Богданыч только притворяется невнимательным, и что вся цель его теперь состоит в том, чтоб испытать храбрость юнкера, и он выпрямлялся и весело оглядывался; то ему казалось, что Богданыч нарочно едет близко, чтобы показать Ростову свою храбрость. То ему думалось, что враг его теперь нарочно пошлет эскадрон в отчаянную атаку, чтобы наказать его, Ростова. То думалось, что после атаки он подойдет к нему и великодушно протянет ему, раненому, руку примирения.
Знакомая павлоградцам, с высокоподнятыми плечами, фигура Жеркова (он недавно выбыл из их полка) подъехала к полковому командиру. Жерков, после своего изгнания из главного штаба, не остался в полку, говоря, что он не дурак во фронте лямку тянуть, когда он при штабе, ничего не делая, получит наград больше, и умел пристроиться ординарцем к князю Багратиону. Он приехал к своему бывшему начальнику с приказанием от начальника ариергарда.