На жаргоне компьютерного программирования « heisenbug» - это программная ошибка, которая, кажется, исчезает или меняет свое поведение, когда кто-то пытается ее изучить. [1] Этот термин представляет собой каламбур по имени Вернера Гейзенберга , физика, который первым подтвердил эффект наблюдателя в квантовой механике , который утверждает, что акт наблюдения за системой неизбежно изменяет ее состояние. В электронике традиционным термином является эффект зонда , когда присоединение испытательного зонда к устройству изменяет его поведение.
Подобные термины, такие как bohrbug , mandelbug , [2] [3] [4] hindenbug и schrödinbug [5] [6] (см. Раздел о связанных терминах ), иногда предлагались для других типов необычных ошибок программного обеспечения, иногда в шутка; [7] [8] однако, в отличие от термина « гейзенбаг» , они не получили широкого распространения и не используются. [9] [ оригинальное исследование? ]
Примеры
Ошибки Heisenbug возникают из-за того, что обычные попытки отладки программы , такие как вставка операторов вывода или запуск ее с помощью отладчика , обычно имеют побочный эффект тонкого изменения поведения программы, например, изменение адресов памяти переменных и времени. его исполнения.
Одним из распространенных примеров heisenbug является ошибка, которая появляется, когда программа компилируется с помощью оптимизирующего компилятора , но не когда та же программа компилируется без оптимизации (как это часто делается с целью проверки ее с помощью отладчика). Во время отладки значения, которые оптимизированная программа обычно хранит в регистрах , часто помещаются в основную память. Это может повлиять, например, на результат сравнений с плавающей запятой , поскольку значение в памяти может иметь меньший диапазон и точность, чем значение в регистре. Точно так же Heisenbugs могут быть вызваны побочными эффектами в тестовых выражениях, используемых в утверждениях времени выполнения на таких языках, как C и C ++ , где тестовое выражение не оценивается, когда утверждения отключены в производственном коде с помощью NDEBUG
макроса.
Другие распространенные причины ошибок heisenbug - использование значения неинициализированной переменной (которая может изменить свой адрес или начальное значение во время отладки) или отслеживание недопустимого указателя (который может указывать на другое место при отладке). Отладчики также обычно позволяют использовать точки останова или предоставляют другие пользовательские интерфейсы, которые вызывают незаметное выполнение дополнительного исходного кода (например, средств доступа к свойствам), что, в свою очередь, может изменить состояние программы. [10]
Время также может быть фактором heisenbugs, особенно в многопоточных приложениях. Выполнение программы под управлением отладчика может изменить время выполнения программы по сравнению с обычным выполнением. Ошибки, зависящие от времени, такие как состояние гонки, могут не возникать, если программа замедляется пошаговыми исходными строками в отладчике. Это особенно верно, когда поведение включает взаимодействие с объектом, не находящимся под контролем отладчика, например, при отладке обработки сетевых пакетов между двумя машинами, и только одна из них находится под контролем отладчика.
Гейзенбаги можно рассматривать как примеры эффекта наблюдателя в информационных технологиях . Фрустрированные программисты могут юмористически обвинить гейзенбаг на фазы луны , [11] или (если это имеет место только один раз) может объяснить это как мягкий ошибок из - за альфа - частиц или космических лучей , влияющих на аппаратные средства.
Связанные термины
Bohrbug , оппозиция, это «хорошая, твердая ошибка». Как и детерминированная модель атома Бора , они не меняют своего поведения и относительно легко обнаруживаются. [12] [13]
Mandelbug (названная в честь Бенуа Мандельброт «s фрактал ) является ошибкой, причины настолько сложны , что не поддается ремонт, или делает его поведение казаться хаотичным или даже недетерминировано . [2] Этот термин также относится к ошибке, которая проявляет фрактальное поведение (то есть самоподобие ) за счет выявления большего количества ошибок (чем глубже разработчик вникает в код, чтобы исправить его, тем больше ошибок они обнаруживают). [ необходима цитата ]
Schrödinbug или schroedinbug (названный по имени Эрвина Шрёдингера и его мысленного эксперимента ) является ошибкой, проявляющиеся в котором выполняется программным обеспечение после того, как программист замечает , что код не должен работал в первую очередь. [5]
Hindenbug [14] (названный в честь катастрофы Гинденбурга ) является ошибкой с катастрофическим поведением.
Хиггс-bugson [15] [16] (названный в честь Хиггс частиц) представляет собой ошибку , которая, по прогнозам, существует основанную на других наблюдаемых условиях (наиболее часто, неопределенно связанные записи журнала и отдельные сообщения пользователя) , но это трудны, если не невозможно, искусственно воспроизвести в среде разработки или тестирования. Этот термин может также относиться к ошибке, которая очевидна в коде (математически доказана), но не может быть замечена при выполнении (но при этом трудно или невозможно фактически найти).
Этимология
Этот термин также использовался в 1985 году Джимом Греем в статье о сбоях программного обеспечения [17] (и иногда его ошибочно приписывают ему из-за этой публикации), а также в 1986 году Джонатаном Кларком и Жахаем Стюартом в списке рассылки (позже Usenet группа новостей) комп . риски . [18]
Брюс Линдсей, исследователь из IBM , подтвердил в интервью ACM Queue 2004 года, что он присутствовал при первоначальном определении Heisenbug. [19]
Более раннее появление в публикациях ACM датируется 1983 годом. [20]
разрешение
Гейзенбаги сложно идентифицировать и исправить; часто попытки решить их приводят к дальнейшему неожиданному поведению. Поскольку проблема проявляется в результате отдельной основной ошибки, поведение может быть трудно предсказать и проанализировать во время отладки. В целом количество обнаруженных heisenbug должно уменьшаться по мере развития программного обеспечения. [21]
Смотрите также
- Культ карго программирования
- Отладчик памяти
- Jinx Debugger - инструмент, который автоматически исследует выполнение, которое может выявить Heisenbugs.
Рекомендации
- ^ «Файл жаргона: heisenbug» .
- ^ а б "Файл жаргона: Мандельбаг" . Catb.org . Проверено 5 сентября 2013 .
- ^ Раймонд, Эрик S .; Словарь нового хакера , 3-е издание, 1996 г.
- ↑ Кларк, Артур С. , Призрак из Большого банка , Bantam Books, 1990
- ^ а б "Жаргонный файл: Schroedinbug" . Catb.org . Проверено 5 сентября 2013 .
- ^ Раймонд, Эрик S .; Словарь нового хакера , 3-е издание, 1996 г.
- ^ В следующей статье исследуются различные определения борбургов, мандельбагов и гейзенбагов, предложенные в литературе, а также утверждения о взаимосвязях между этими типами ошибок: Grottke, Michael; и Триведи, Кишор С .; Ошибки программного обеспечения, старение программного обеспечения и обновление программного обеспечения , Журнал Японской ассоциации инженеров надежности , Vol. 27, No. 7, pp. 425–438, 2005.
- ^ Гроттке, Майкл; и Триведи, Кишор С .; Борьба с ошибками: удаление, повторная попытка, репликация и восстановление , IEEE Computer vol. 40, нет. 2 (февраль 2007 г.), стр. 107–109.
- ^ Поиск в Google Книгах за февраль 2012 г. дает около 70 результатов по запросу "schroedinbug", 100 по запросу "Mandelbug", 400 по запросу "bohrbug" или "heisenbug".
- ^ «Java toString () override с инициализацией в качестве побочного эффекта». Архивировано 30 декабря 2014 г. на Wayback Machine.
- ^ CATB.org, "фаза луны"
- ^ Гошгарян, Гэри; Изучение языка , издательство HarperCollins College Publishers, 1995 г.
- ^ «Такие временные программные сбои получили причудливое название« Heisenbug », потому что они исчезают при повторном рассмотрении. Напротив,« Bohrbugs »- хорошие надежные ошибки». (Новости компьютерной группы IEEE, том 24, номера 7–12, 1991)
- ^ «Хинден Буг» .[ нужен лучший источник ]
- ^ «Новый программный жаргон» .
- ^ «20 веселых программных жаргонных фраз, которые следует использовать при разговоре с инженерами» .
- ^ Грей, Джим (1985). «Почему останавливаются компьютеры и что с этим делать?» . Технический отчет 85.7 . Тандемные компьютеры.
- ^ (16 декабря 1986) ДАЙДЖЕСТ РИСКОВ 4.30 - (23 декабря 1986) ДАЙДЖЕСТ РИСКОВ 4.34 , модератор - Питер Г. Нойман.
- ^ « « Разговор с Брюсом Линдси », Очередь ACM, том 2, № 8 - ноябрь 2004» . Queue.acm.org . Проверено 5 сентября 2013 .
- ^ Труды ACM SIGSOFT / SIGPLAN Software Engineering симпозиума по высокому уровню Debugging, Pacific Grove, штат Калифорния, 20-23 марта 1983 года , Ассоциация вычислительной техники, 1983, Поиск книг Google :
Это принцип неопределенности Гейзенберга применительно к отладке (один из участников назвал экземпляр такой ошибки «ошибкой Гейзенберга»).
Также цитируется у LeBlanc, Richard J .; Роббинс, Арнольд Д .; Управляемый событиями мониторинг распределенных программ , в трудах 5-й Международной конференции IEEE по распределенным вычислительным системам (ICDCS) , IEEE Computer Society, Computer Society Press, 1985, стр. 515-522 Поиск в Google Книгах :
Это принцип неопределенности Гейзенберга в применении к отладке, иногда называемый принципом «ошибки Гейзенберга» [ACM83].
- ^ П., Бирман, Кеннет (2005). Надежные распределенные системы: технологии, веб-сервисы и приложения . Нью-Йорк: Спрингер. ISBN 0387276017. OCLC 225378026 .
Внешние ссылки
- Технология отладки Гейзенберга
- Рассказ о магии
- OpenOffice не печатает по вторникам , и на это ушло почти девять месяцев.