きりかノート 3冊め

おあそびプログラミング

trunk の問題点 まとめ

[rubycocoa-devel:425] の話。NSZombieEnabled アリガトウ という話?

今の RubyCocoa trunk では、以下の問題が見つかっている。

  1. sample/RubyTypingTutor で、ドラッグやコピー操作中にクラッシュする
  2. 藤本さんの 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 で例外が発生するようになれば、前者であることがほぼ確実になる。

調査はつづく。