2015/03/19: 辛い一週間だった・・・
クラッシュするだの遅いだのとコミットしてはしばらくのちにリバートされる、を繰り返してきた担当機能のフラグフリップ、もう一ヶ月くらい経つしいいかげん定着したかと思った矢先、またリバートされた。先週の金曜。Chromebook でクラッシュするという。しらねーよ・・・と思いつつ BTS を眺めたら人々が頑張って原因解明に努めるスレが目に入り一転ごめんなさいという気分に。同類のレポートが次々とマージされてくる。ChromeOS の新しいリリースが多くの人に届き始めたのだろう。再現条件はさまざまで、いまいちよくわからない。つらい一週間の始まり。
クラッシュするといってもクラッシュダンプはない。IPC がエラーを返し、それをクラッシュと判断したブラウザが sadface を出すというもの。なぜ IPC がエラーを返すのかを調べないといけない。というのはその IPC のインフラを書き換えたのが自分だから・・・。
「ChromeOS 設定でビルドした Chrome でも再現しますかね?」と尋ねるも、それではダメという。しかし手元に実機がない。家に Pixel が一台あるだけ。仕方ないのでこの日は準備のみ。 ChromeOS のビルド方法を向井さんに教わり、USB メモリを借りるなどして準備を進める。
月曜。 自宅に置いてあった Chromebook Pixel を会社に運び、ビルドしたバイナリを動かしてみる。ChromeOS 、さすがに丸ごと自分でビルドする必要はない。ベースとなる Linux のイメージをダウンロードして USB 経由でマシンに入れ、そこにビルドした Chrome 追加する。Chrome といっても UI が全部はいったもの。色々細かい勝手がわからず向井さんに泣きつきつつトラブルシュートを進めるうち、自分のバイナリが動いたのを確認したころには日が暮れていた。正確には日は暮れてないけど疲れたので帰宅。
火曜。 ビルドはできたのでバグの再現を試みる。全然再現しない。そもそも再現条件がよくわからん。はー。Pixel で試してるんだけど再現しますよね?と BTS のスレッドで質問すると、俺の手元では Peppy という安めの端末で再現してるよという。うーどっちも Intel だから似たようなもんだろうし Pixel で再現するという報告も見た気がするんだけどなあ・・・とぐずぐずしていたら、手元で再現できているというエンジニアが丁寧にもマシンのゲット方法を教えてくれた。
ありがたく指示に従い指定された Lab に出向いてマシン(Peppy)を確保。ついでにそのバグを bisect してフラグフリップが原因と突き止めたエンジニア、 S さんにご挨拶にうかがう。すみませんね僕のバグが手間かけてしまって・・・などと挨拶。大変良い人だった。そして向井さんの斜め向かいあたりに座っていた・・・。
そのあと自席に戻るも電源ケーブルを間違えたのに気づき Lab との間をもう一往復し、気がつくと Google Fit の運動時間ゴールが達成されていた。結局 Peppy 向けのビルドを作ってその日はおしまい。仕事の進みが遅いのは手際の悪さに加えてやる気が底辺だからです。
水曜。 Peppy で再現を試みるも、やはり再現しない。はー・・・S さんが BTS に書いてくれた通りにやってるんだがなー。もしかして手元の Chrome が微妙にオフィシャルビルドと違うせいでダメなのだろうか。それとも僕のアカウントでは再現しなくて S さんのアカウントだと再現するのだろうか・・・。仕方なく Peppy 片手に再び S さんを訪問。
たびたびすみません再現しないんです・・・と相談。嫌な顔一つせずどれどれ・・・と彼のアカウントで実験してくれた。そして再現した!おお、ビルドは合っていた!ということは違いはエクステンションか?すみませんがそのエクステンション一覧をコピペしていただけませんかね・・・とお願いし、自席に戻る。ちなみに向井さんのゾーンから僕の席まで自転車アリで10分くらい。遠い。
もらったリストをもとに大量のエクステンションおよびアプリをインストール。しかもテストアカウントじゃなくて自分のアカウントに。なぜなら社員アカウントにインストールされる謎のエクステンションとかが原因だと困るから。すると・・・再現した!ついに!差分に怪しいエクステンションはなかったから、量が問題だったようだ。ランダムにエクステンションがクラッシュする。(クラッシュしたとポップアップがでる。)タブの中身もたまに変。
ちなみにこの再現手順がまためんどい。アカウント作成後、初回ログインの直後でだけ起こるという。ログイン直後に発生するアカウントようデータのダウンロードが負荷をかけて問題を起こすらしい。だからアカウントを作ってはログインし、再現を見届け、ログをにらみ、ログを入れ直してビルド、バイナリ転送、アカウントを消し、作り直し、ログインし・・・というターンアラウンド。そして相変わらず原因がわからない。
Chrome のコードには任意の場所でスタックトレースをダンプする機能がある。これを使ってログを取ろうとするも、リリースビルドだとシンボルがない。関数名がわからない。そこでデバッグビルドをつくり転送・・・するとディスク容量不足といわれる。まじかーーー。Chrome は autoupdate にパーティションのトリックを使っており、システム(Chrome 含む)の入ったパーティションはすごく小さく切ってある。なのでバイナリが 100MBでかくなっただけでもう溢れる。うええ・・・。そしてパーティションを大きくするには自分で Linux のイメージを作り直さないといけないらしい。それはしんどそうだ・・・。リモートデバッグをする方法もあるというが、デバッガを使いたいんじゃなくてバーっとログを出して眺めたいのだよ・・・そしてリモートデバッグの設定もそれはそれで大変げ。つらい・・・力尽き帰宅。
木曜。 デバッガなしシンボルなしは辛いが環境つくるのも辛そう・・・。ぼんやりとプリント文を足して眺めてたり、改めて手元のUbuntu 上で動かしなおしたりするうち、辛さが眠気に変わってきた。昨晩ちょっと夜更かししたせいもあり、すっかりフォームが乱れている。もうやだぜんぜんわからん・・・と一時間くらい昼寝。
少し回復したのち、原因の仮説を書き出して一つ一つ検証していこうと気を取り直す。プリント文も雑に入れたのは消し、条件を絞ってプリントできるようグローバル変数を足すなどの小細工に時間を使う。(こういうのをさぼってしまうのがフォームの乱れなわけです。)
ライブラリのコードをにらみつつ、うーむエラーになるパスに入るにはこのフラグがオフのはずで、たしかにオフなのだがそもそもこれ何だろう・・・と引数に渡すフラグの値を変えてみたら・・・
直った!!なんだそりゃーーー! まぐれだと困るので周辺の調べを進めるも、たしかにこのフラグで良さそう。
しかし見覚えのない定数だなあ・・・と git blame すると、去年の終わりに足されていた。僕がその API を使った部分を書いたのはもっと前。そりゃ見覚えないわ。というかこのフラグを足すときに挙動が変わっているんだから、呼び出し場所を直しておいてくれよ・・・と言いたいところだけれど、そのライブラリは不幸にもレポジトリが別なためそうした気の利いた変更は(確実にクラッシュするような場合をのぞき)されないのであった。
自分がやっている IPC 載せ替えプロジェクトはプラットホーム固有の問題が多く、Windows で動かない、Mac でだけテストが失敗する、Nexus 9 でクラッシュときて今回ついに Chrome OS。普段 Linux で仕事をしてるので無事全プラットホームを踏破した。辛い。
とはいえ今回の一週間はさすがに時間がかかりすぎ。Lesson Learned としては再現方法や再現環境が曖昧なバグに出会ったら再現できている人に直接あって話をしましょう、ですかね・・・近所にいないと困るけど。