ハイゼンバグ、または月がコードを台無しにする方法

月が衰えている、それは起こる...©Zemfira

Heisenbugは、発生するソフトウェアの不具合は、それがどこから来たのかを理解せず、デバッグや検出に役立たないと呼ばれます。 一言で言えば、それは最近の投稿からのとらえどころのないジョーまたはクロコフスキーの猫のように振る舞います。 私は仕事でそのようなことに対処しなければならなかったので、意味が近い名前が長い間発明されていたことがわかるまで、私はそれを量子力学効果と呼びました。 問題の疑いのあるソースに関するイベントをログに記録するだけのデバッグバイナリを顧客に送信すると、問題は解消されます。





ハイゼンバグ / hi: 'zen-buhg / n。

バグを調査または分離しようとすると消えたり、動作が変更されたりするバグ。















プログラミングにおける量子効果の私の小さな認知的コレクションに注目します。







エピソードI、OpenOfficeが火曜日を印刷しない



このすばらしいバグレポートの歴史はUbuntu Launchpadで読むことができます。リンクから読むのが苦手な人のために、その本質を簡単に説明します。 Tue



の4番目のバイトに含まれるファイルがErlang JAMとして検出されたため、 file



システムユーティリティにバグがありました。 この欠陥はfile



バージョン4.21および4.24に存在し、 magic



ファイルのエラーが原因でした。







 anon@xX:~$ echo "1/2 Tue" >> file && file file file: Jan 22 14:32:44 MET 1991\011Erlang JAM file - version 4.2 anon@xX:~$ file --version file-4.21 magic file from /etc/magic:/usr/share/file/magic
      
      





これにより、 file



の太字バージョンの火曜日に、PostScriptファイルfile



タイムスタンプが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



ネットワークの広大さで、私はこの美しいITユーモアのインスタンスに出会いました。 退屈に疲れた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



にはnbd



何か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,000のDebian Linuxパッケージすべてをチェックすれば、さらに明るい例があるかもしれませんが、時間の無駄ではないと思います。







エピソードIII、月とLISP



悪いダンサーは必ずしも複雑なステップで成功するとは限らず、プログラマーは時折月を台無しにします。 1983年のHacker Dictionaryを発行した古い学校のハッカーのおかげで、これも認識しています 。これは、別名Jargon Fileです。 それ以来、本はさらにいくつかのエディションを生き残り、ジャンルの古典の一種になりました。 月のフェーズ[1]の記事で トピックにはかなり興味深い自転車があります。







むかしむかし、ガイ・スティール[2] 、まだMITの学生でしたが、MacLispコードのバグを見つけました[3] 、月の位相の近似計算の標準機能を含む、フォームを含む別のファイルにタイムスタンプを記録します。 未確認の報告によると、Gerry Sussmanは大胆なプログラムも書いた[4] 。 時折、プログラムがクラッシュしました。これは、最初のレコードがコメント「;」でマークされずに新しい行にロールアウトされたため、毎月同時に発生しました。 最初のレコードの長さは、タイムスタンプと特定のフェーズに依存していました。つまり、太陰暦に応じて、ページ幅80文字を超えていました。







同じ記事で、LEPコライダーアクセラレータでの実験結果を計算するプログラムがCERNでクラッシュしたときの別のケースが言及されています[5] 。 失敗の原因を長時間検索した結果、最終的に解決策が見つかりました。 LEP境界リング、27 km。 長い間、月の重力のために非常にわずかに変形していました 。 この物語は、 ニュートンの報復と呼ばれる、物理学者の間の民間伝承の一部になりました。 いわゆる以来、私はこの物語の詳細の信頼性を保証することはできません。 潮dal変形は何十年知られてきた。 この問題に関するHabrの意見を知りたい。







エピソードIV、マイハイゼンバッグ



古いラップトップに完全に狂ったバグがあり、 USBヘッドフォンで音楽を聴いているときにOSが完全にまたは部分的にフリーズし、さらに、インターネットラジオを聴くとフリーズすることがほとんどでした。 私はこれに数年苦しみましたが、Linuxカーネルのバージョン、Xorg、ドライバーを変更しても何も変わらないことに気付き、 Gentoo Bugzillaにバグレポートを送りました。







これは、カーネルが2.6.20から2.6.31で始まって、すでに4年間発生しています。 同様に、「HP nc 6220」ベースの「Debian Linux 5.x」を実行しているIntelチップセットではありませんでした。USBヘッドフォンはPlantronics DSP 300でした。

驚いたことに、liveCDでは決して起こりません。1時間オーディオストリーミングを維持したまま数回テストしましたが、何もクラッシュしませんでした。



無料の翻訳では、これはheisenbugがすでに4歳であり、Linuxカーネルバージョン2.6.20から2.6.31、AMD Radeon Xpress 200MチップセットおよびIntel 915GMでも同じように感じているが、何らかの理由で定着していないという苦情ですLiveCDディストリビューション。







ハングの時点では、どこにもエラーメッセージはなく、 /var/log/messages



のみエントリが表示されました: N URBs still active



、ここでNは偶数<10です。 。

















オープンradeon



グラフィックスドライバーのハードウェアアクセラレーションオプションを変更したというバグレポートの最後のエントリ







 Option "AccelMethod" "EXA" # Option "AccelMethod" "XAA" #
      
      





その後、問題はsnd_usb_audio



されましたが、この変更はsnd_usb_audio



とはまったく関係がないため、どのように、そしてなぜ理由が明らかではありません。










  1. 著者は、ハイゼンバグの品種を指定しました。 参照により、Jargon Fileバージョン4.3.3。
  2. Schemeプログラミング言語の作成者の1人であるCommon Lisp the Languageの著者。
  3. MIT人工知能研究所で開発されたLispプログラミング言語の方言。
  4. Schemeプログラミング言語の作成者の1人、 Structure and Interpretation of Computer Programsの共著者。
  5. 大型電子陽電子コライダー。



All Articles