C++ でJNIのコード書いていたら全然関係ないJavaのコンポーネントが NullPointerException で落ちるというバグを追っていた。
ちなみにMakeを使っている。
バグは発生したり発生しなかったりした。途中で分かったのは
- 起こるときは必ず起こる
- make cleanしてビルドすると起きるケースでは必ず起きる。cleanしないと起きないことがある
- うまくいかないケースでは出来上がるイメージサイズが妙に小さい
- ちなみにフルビルドには1時間かかる!(core 4つ積んでるマシンで-j16とかしてるのに!)
JNIなんて初めてだし、その中でもやったことないことをいくつもやってたから問題を切り分けるも何もなく、しかも↑の2番目に気づくまでは再現性すら危うく、とにかく俺泣きそうだった
木曜終電、金曜真の終電(定期のコースを外れての帰宅)、土曜午後出社夕方まで、日曜9時ころ出社終電まで。
結果分かったこと。つまり理由が分かったんだが、
「他の人が教えてくれた Makefile の書き方が間違っていた」
- Makefileの変数一個間違えると関係ないところに影響が出る。
- Makefileの変数を途中で変えても一度コンパイルされたオブジェクトファイルはリコンパイルされない
- クリーンビルドしないと再現性がない理由となる。
- おそらく必要なコンポーネントを記述するリストかなにかをぼっこわした
- だからイメージサイズが妙に小さくなった
- 他に自分と同じことをやっている例がなかったため参考にしようがなかった
そして週末が死んだ。
追記
やっぱり理由が分からなくなった。でも動いているからいい。