. Гейзенбаг, или как Луна портит код
Гейзенбаг, или как Луна портит код

Гейзенбаг, или как Луна портит код

Гейзенбагом называют ту разновидность программных глюков, которая возникает не пойми откуда, не поддается отладке и обнаружению. Словом, ведет себя как тот самый Неуловимый Джо или кроковский кот из недавнего поста. Мне по работе приходилось сталкиваться с такими и про себя я называл это эффектом квантовой механики до тех пор, пока не узнал, что близкое по смыслу название уже давно придумали. Бывает, посылаешь заказчику отладочный бинарник, который всего лишь записывает в журнал больше событий вокруг предполагаемого источника проблемы и после этого проблема исчезает!

Предлагаю вашему вниманию свою небольшую познавательную коллекцию квантовых эффектов в программировании.

Эпизод I, OpenOffice не печатает во вторник

Историю этого замечательного багрепорта можно почитать на Ubuntu Launchpad, а я вкратце изложу суть для тех, кому не сподручно читать по ссылке. В системной утилите file был баг из-за которого, файлы содержащие в 4-м байте Tue определялись как Erlang JAM. Дефект присутствовал в версиях file 4.21 и 4.24 и был вызван ошибкой в magic файле.

Это приводило к тому, что по вторникам для бажной версии file временные отметки PostScript файлов были похожи на Erlang JAM.

При отправке задания на принтеры семейства Brother, OpenOffice запускал процедуру проверки PostScript файла, которая завершалась ошибкой, потому что обнаруживала тип файла Erlang JAM. Исправление, в основном, свелось к экранированию пробела.

Впрочем, и с бажным file проблема устранялась просто, однако к тому моменту гейзенбагу уже исполнилось 9 месяцев!

Эпизод II, Луна и Perl

Однажды на просторах сети мне попался этот прекрасный экземпляр ИТ юмора. Изнывая от скуки, разработчик Debian решил вычислить зависимость багрепортов от фазы Луны и быстренько написал такой скриптец.

Результат для пакета nbd был обнадеживающим, зависимость явно проклевывалась.

Для наукообразности можно даже в R проверить гипотезу функциональной зависимости. Данных маловато, но цифры внушают — p-value = 0.005853 .

Я решил повторить эксперимент спустя 6 лет, и что бы вы думали?

С этим nbd что-то явно не так, лунные фазы теперь давят сильнее!

Возможно, найдутся примеры и поярче, если проверить все 43 тысячи пакетов Debian Linux, но думаю это будет не лучшей тратой времени.

Эпизод III, Луна и LISP

Плохому танцору не всегда удаются сложные па, а программистам изредка гадит Луна. Нам об этом известно, благодаря хакерам старой школ, издавшем в 1983-м г. Словарь Хакера, у которого есть и другое название — the Jargon File. С тех пор книга выдержала еще несколько изданий и стала своего рода классикой жанра. В статье Phase of the Moon [1] есть довольно занятная байка на тему.

Однажды, Guy Steele [2] , в то время еще студент MIT, словил баг в коде MacLisp [3] , записывающей временные метки в отдельный файл содержащий формы, включив туда стандартную функцию приближенного вычисления фазы Луны. По неподтвержденным данным бажную программу также писал Gerry Sussman [4] . Изредка программа сбоила, причем случалось это каждый месяц в одно и то же время из-за того, что первая запись выкатывалась на новую строку, не обозначая комментарий символом ";". Длина первой записи зависела от временной метки и определенной фазы, то есть превышала широту страницы в 80 символов в зависимости от лунного календаря!

В той же статье упоминается еще один случай, когда в ЦЕРН сбоила программа обсчета результата экспериментов на ускорителе LEP коллайдера [5] . Долгие поиски причин сбоев наконец-то привели к разгадке. Кольцо периметра LEP, в 27 км. длиной, было очень незначительно деформировано из-за гравитации Луны. Эта история стала частью фольклора в среде физиков, получив название Ньютоново Возмездие. За достоверность деталей этой истории не могу поручиться, так как т. н. приливные деформации известны уже десятки лет как. Хотелось бы узнать мнение Хабра на этот счет.

Эпизод IV, мой Гейзенбаг

Был у меня на старом ноуте совершенно безумный баг, который приводил к полному или частичному зависанию ОС в время прослушивания музыки через USB наушники, причем чаще всего к зависанию приводило прослушивание интернет-радио. Я это терпел пару-тройку лет а затем, поняв, что ничего не меняется от смены версий ядра Linux, Xorg и драйверов, отправил багрепорт в Gentoo Bugzilla.

В вольном переводе, это жалоба на то, что гейзенбагу уже 4 года и он одинаково хорошо себя чувствует на версиях Linux ядра с 2.6.20 по 2.6.31, на чипсете AMD Radeon Xpress 200M и интеловском 915GM, но почему-то не прижился на LiveCD дистрибутивах.

В момент зависания нигде сообщения об ошибке не возникало и только в /var/log/messages появлялась запись: N URBs still active , где N — четное число < 10. Скорее всего падеж происходил в модуля ядра snd_usb_audio , небрежно обрабатывался и приводил систему в ступор.

Последняя запись в багрепорте, что я поменял опции аппаратного ускорения для открытого графического драйвера radeon

после чего проблема испарилась, но непонятно как и зачем, ведь это изменение никаким образом не связано с snd_usb_audio .

📎📎📎📎📎📎📎📎📎📎