Гейзенбаг, або як Місяць псує код

Місяць убуває, таке буває… ©Земфіра
Гейзенбагом називають ту різновид програмних глюків, яка виникає не зрозумій звідки, не піддається налагодження і виявлення. Словом, веде себе як той Невловимий Джо або кроковский кіт з недавнього поста. Мені по роботі доводилося стикатися з такими і про себе я називав це ефектом квантової механіки до тих пір, поки не дізнався, що близьке за змістом назва вже давно придумали. Буває, надсилає замовнику налагоджувальний бінарники, який всього лише записує в журнал більше подій навколо передбачуваного джерела проблеми і проблема зникає!
heisenbug /hi:'zen-buhg/ n.
A bug that disappears or alters its behavior when one attempts to probe or isolate it.


Пропоную вашій увазі свою невелику пізнавальну колекцію квантових ефектів в програмуванні.
Епізод I, OpenOffice не друкує у вівторок
Історію цього чудового багрепорта можна почитати на Ubuntu Launchpad, а я коротко викладу суть для тих, кому не сподручно читати по посиланню. У системної утиліті
file
був баг з-за якого, файли містять в 4-му байті
Tue
визначалися як Erlang JAM. Дефект присутній у версіях
file
4.21 і 4.24 і був викликаний помилкою
magic
файлі.
anon@x-X:~$ echo "1/2 Tue" >> file && file file
file: Jan 22 14:32:44 MET 1991\011Erlang JAM file - version 4.2
anon@x-X:~$ file --version
file-4.21
magic file from /etc/magic:/usr/share/file/magic

Це призводило до того, що по вівторках для бажной версії
file
тимчасові позначки PostScript файлів були схожі на Erlang JAM.
%%CreationDate: (Tue Mar 3 19:47:42 2009)

При відправці завдання на принтери сімейства Brother, OpenOffice запускав рутину перевірки PostScript файлу, яка завершувалася помилкою, тому що виявляла тип файлу Erlang JAM. Виправлення, в основному, звелося до екранування пробіл.
+# 4.2 version may have a copyright notice!
-+4 string Tue Jan 22 14:32:44 MET 1991 Erlang JAM file - version 4.2
-+79 string Tue Jan 22 14:32:44 MET 1991 Erlang JAM file - version 4.2
++4 string Tue\ Jan\ 22\ 14:32:44\ MET\ 1991 Erlang JAM file - version 4.2
++79 string Tue\ Jan\ 22\ 14:32:44\ MET\ 1991 Erlang JAM file - version 4.2

Втім, і з бажным
file
проблема усувалася просто, проте до того моменту гейзенбагу вже виповнилося 9 місяців!
sed -e '/^%%CreationDate:/s/Tue/tue/' > $INPUT_TEMP

Епізод II, Місяць і Perl
Одного разу на просторах мережі мені попався цей прекрасний екземпляр ІТ гумору. Знемагаючи від нудьги, розробник Debian вирішив обчислити залежність багрепортов від фази Місяця і швиденько написав такий скріптец.
Perl скрипт
#!/usr/bin/perl -w

use strict;
use warnings;

use constant PI => 3.1415926535;

use feature "say";

use SOAP::Lite;
use Astro::Coord::ECI::Moon;

my $soap = SOAP::Lite->uri('Debbugs/SOAP')->proxy('http://bugs.debian.org/cgi-bin/soap.cgi');

if (!defined($ARGV[0])) {
die "E: must have a source package!\n";
}

my @bugs = $soap->get_bugs(src=>$ARGV[0])->result();

my $bugsdata = $soap->get_status(@bugs)->result();
my $moon = Astro::Coord::ECI::Moon->new();
my %count = ( 'new' => 0, 'first' => 0, 'full' => 0, 'last' => 0);

foreach my $bug (keys %$bugsdata) {
my $time = $$bugsdata{$bug}->{date};
my $phase = $moon->phase($time);
if ($phase <= 45 * PI / 180 || $phase > 315 * PI / 180) {
$count{'new'} = $count{'new'} + 1;
} elsif ($phase <= 135 * PI / 180 && $phase > 45 * PI / 180) {
$count{'first'} = $count{'first'} + 1;
} elsif ($phase <= 225 * PI / 180 && $phase > 135 * PI / 180) {
$count{'full'} = $count{'full'} + 1;
} elsif ($phase <= 315 * PI / 180 && $phase > 225 * PI / 180) {
$count{'last'} = $count{'last'} + 1;
}
}

say "Number of bug submissions during new moon : " . $count{new};
say "Number of bug submissions during first quarter: " . $count{first};
say "Number of bug submissions during full moon : " . $count{full};
say "Number of bug submissions during last quarter : " . $count{last};

Результат для пакета
nbd
був обнадійливим, залежність явно вихоплюється.
wouter@carillon:~code/perl$ ./debbugsmoon nbd
Number of bug submissions during new moon : 2
Number of bug submissions during first quarter: 10
Number of bug submissions during full moon : 1
Number of bug submissions during last quarter : 3

Для наукообразности можна навіть в
R
перевірити гіпотезу функціональної залежності. Даних замало, але цифри вселяють
p-value = 0.005853
.
> chisq.test(c(2, 10, 1, 3));
Chi-squared test for given probabilities

data: c(2, 10, 1, 3)
X-squared = 12.5, df = 3, p-value = 0.005853

Попередження:
У chisq.test(c(2, 10, 1, 3)) :
апроксимація на основі хі-квадрат може бути неправильною

Я вирішив повторити експеримент через 6 років, і що б ви думали?
[5153:23311 0:604] 06:09:39 Вс авг 28 [mikayel@redeye: +4] ~ 
(4:604)$ ./debbugsmoon.pl nbd
Number of bug submissions during new moon : 1
Number of bug submissions during first quarter: 12
Number of bug submissions during full moon : 3
Number of bug submissions during last quarter : 1

З цим
nbd
щось явно не так, місячні фази тепер тиснуть сильніше!
> chisq.test(c(1, 12, 3, 1))
Chi-squared test for given probabilities

data: c(1, 12, 3, 1)
X-squared = 19.471, df = 3, p-value = 0.0002185

Попередження:
У chisq.test(c(1, 12, 3, 1)) :
апроксимація на основі хі-квадрат може бути неправильною

Можливо, знайдуться приклади і яскравішою, якщо перевірити всі 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.
This happens for already 4 years with kernels starting 2.6.20 to 2.6.31. Similarly it happened on «HP nc 6220» based no intel chipset running «Debian Linux 5.x.» again USB, headphones were Plantronics DSP 300.
Surprisingly it never happens under liveCD, I tested few times keeping audio streaming for 1 hour and nothing crashed.
У вільному перекладі, це скарга на те, що гейзенбагу вже 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

Option "AccelMethod" "EXA" #було
Option "AccelMethod" "XAA" #стало

після чого проблема зникла, але незрозуміло, як і навіщо, адже це зміна ніяким чином не пов'язано з
snd_usb_audio
.


  1. Автор так визначив різновид Гейзенбага. По посиланню, the Jargon File, версія 4.3.3.
  2. Автор книги Common Lisp the Language, один з творців мови програмимрования Scheme.
  3. Діалект мови програмування Lisp, розроблений в лабораторії штучного інтелекту MIT.
  4. Один з творців мови програмування Scheme, автор книги Structure and Interpretation of Computer Programs.
  5. Великий електрон-позитронний колайдер.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.