バッファ破壊バグに悩む
Scanner が使用している内部バッファが謎のタイミングで書き変わるというバグに悩む。
簡単な print デバッグでは分かりそうもなかったので、久しぶりに gdb で動きを追う。 Hardware watch point を使うもなぜかうまくつかまえられない。
しょうがないので覚悟を決めて、ログを吐かせてアドレスとその中身を眺める。二分法で追いつめたら。
Object* Object::makeObjectArray(int size) { #ifdef USE_BOEHM_GC return new(GC) Object[size]; #else return new Object[size]; #endif }
えー。GC だ。嫌だなあ。
つまり Scanner のバッファが使用中にも関わらず回収され、再利用されたということか。
Scanner のバッファへの参照を
- スタック
- グローバル領域
などに置くも変化なし。というか回収漏れなら可能性はいくらでもあるのだけども回収し過ぎなんてほぼないよなあ。
うーん。うーん。ここでピンと来た。Scanner クラスの基底クラスに gc クラスを指定するの忘れた。
これだ直ったよ。今日中に気づけて良かった。