ヒートラン、停止!

メーカーのマネージャ 「年末から動かしていたヒートラン*1が停止しました! 出荷に間に合うよう、連休明けの朝までに対応願います!」
先週の金曜日の夜。明日から3連休だってのに、突如かかってきたこの一本の電話が、私たちから休日を奪うこととなった。

いざ調査を開始すると、徐々に難解さが深まり、とんでもない強敵バグであることが分かった。しかも、発生する現象が極悪である。もう十年以上もIT屋やってるが、任意のエリアをこれほどとんでもない範囲でぶち壊すバグを見たことがない。if文一つ実行しただけでCPU例外を引き起こす。なのに、めったに再現せず、一昼夜ヒートランさせても、一回発生するかどうかだ。

連日連夜、メンバー全員で解析にあたったが、シッポすらつかめない。飛ぶように夜が過ぎて行き、そして迎えた4日目の深夜。。。
やっと再現したRAMダンプとメモリマップを比較しながら、自分のプログラムを見直していたM君@Windows屋が、急にキョロキョロしだした。突然落ち着きがなくなったかと思いきや、激しく視線が泳ぎだし、顔は真っ赤に染まっていく‥‥。
おいっ、どうしたっ?
M君 「あ”あ”あ”あ”あ”あ”ーーーーっ!」
な、なんだっ、どうしたんだっ?
M君 「う”う”う”う”う”ーーーー、やばいいいいいいいいっ!」
だから、どーしたってんだよっ!
M君 「わかっちゃいました、やっちゃってます、ぶち壊しちゃう場合があるんですぅ」

バグの犯人は、M君が書いたデバッグ用コードだった。それはリリース版では(コンパイルオプションによって無効化され)決して動かないはずのコード。ところが、コンパイルオプションをすり抜け、動いてしまうコードが一つだけあったのだ。あろうことか、そのコードが(詳しいことを書くととっても長くなるので割愛するが)メモリ配置によっては水爆と化す。。。

翌未明、M君からこんなメールが‥‥。

旅に出ます‥‥。探さないでください‥‥。

*1:ヒートラン=夜通し(昼間も)ずっと何日間も負荷をかけて動かし続けること。