今日は一日中EXC_BAD_ACCESSと戦っていました・・・・
どこかメモリ関係でだめなところがあるんだなということしかわからず、
かなり時間を食ってしました
開発をしている人なら誰もが通る道ではないでしょうか?
検索とかすると、よく出てくるのは NSZombieEnabled をYESにしてどんな現象が起きているのか
をしり、そこから推測してがんばるっていうものがよく引っかかります。
しかし!!
それでも具体的にどこが悪いよ!って言ってくれる訳ではないので、
なかなかバグを見つけるのは難しいとろ個がありますよね
そんなかゆいところに手が届いてくれるやつがいました!
NSZombieEnabled に加えてこれを使うことで、もう今までの苦労は何だったんだろう?って言うぐらい簡単に見つけられちゃいます!
つかいかたはちょっとめんどくさいけど、それだけの価値はあります!
使い方ですが、あらかじめ設定しておくことが少しと、
EXC_BAD_ACCESSが起きたときにやることと二つあります
まず、設定の方ですが、
メニューの「プロジェクト」から一番したの「アクティブな実行可能ファイル”○○”を編集」を押してください
つぎに、上のタブで「引数」を選択します。
そして、下の「環境に設定される変数」のところにNSZombieEnabledを含め3つ追加して上げます!
NSZombieEnabled
MallocStackLogging
NSDebugEnabled
3つとも値の方は「YES」です
これで準備が整いましたので、実行してがんばってEXC_BAD_ACCESSを発生させます
すると、デバッガコンソールの方にこんな文字が出ますよね?
2011-02-05 17:32:27.312 LocalNobel[6034:5f03] *** -[CFString release]: message sent to deallocated instance 0xb93ca90
[Switching to process 6034]
[Switching to process 6034]
(gdb)
ここのときに(gdb)のあとに次のように文字を打ち込んであげます。
(gdb) shell malloc_history 6034 0xb93ca90
数値は場合によって違います・・・
上のデバッグのときに書かれた文字を打ち込みます
ちょっと色分けしてわかりやすくしてみると、
2011-02-05 17:32:27.312 LocalNobel[6034:5f03] *** -[CFString release]: message sent to deallocated instance 0xb93ca90
のときは
(gdb) shell malloc_history 6034 0xb93ca90
と入力します
黒いところは共通です。
赤いところには赤いところの数字を、青いところには青いところの数字を入れてください。
で、これをかいてエンターを押すと、
ダダダダってなが~い結果が出てきます。
はっきり言って下の方は理解不能なので最初の方にある「ALLOC」ってのを見ます
ここにはなんとEXC_BAD_ACCESSで引っかかったメモリをどこでALLOCしたのかが書いてあるんです!!
これでソースコードのほうでどこでreleaseしてるのかな、どこでretainしてるのかな?って探ってあげればいいんです。
NSZombieEnableだけだとどんなオブジェクトに変なことしたのかしか書かれないので、
こちらを使えばより素早くバグ解消ができるのではないでしょうか??