trunk の問題点 まとめ
[rubycocoa-devel:425] の話。NSZombieEnabled アリガトウ という話?
今の RubyCocoa trunk では、以下の問題が見つかっている。
- sample/RubyTypingTutor で、ドラッグやコピー操作中にクラッシュする
- 藤本さんの MSM2006 の tutorial_1 で、特定の処理を評価するとクラッシュする
svn から、いくつか 0.4.3d2 以降の大きな変更のあったリビジョンを取り出して、検証したところ apple-unstable マージ後から発生するようなっていたことがわかった。
さらにもうちょっと細かく検証したところ、どうも両方ともメモリ管理まわりのようだ。
1. は alloc 時にも retain してやる(apple-unstable マージ前の動作)ようにすると、ちゃんと動く。
2. は ruby でインスタンス変数に代入しているオブジェクトが dealloc されてしまっている。これは、superview であるウインドウの contentView が破棄されるので、インスタンス変数への代入さえされていなければ、正しい動作だ。
どっちも NSZombieEnabled で試して見つけた。これがなかったらまず無理だったろう。
クラッシュは、たいてい EXC_BAD_ACCESS だ。これはその名のとおり、触ってはいけないメモリ領域にアクセスすると発生する。RubyCocoa なら、以下のパターンが多い。
- dealloc されたオブジェクトにメッセージ送信
- 正しくない ObjC <-> Ruby の型変換
NSZombieEnabled で例外が発生するようになれば、前者であることがほぼ確実になる。
調査はつづく。