例外発生時のチェック方法

http://ndevmemo.blog.shinobi.jp/Entry/58/
unrecognized selector sent to instance


unrecognized selector sent to instance

Terminating app due to uncaught exception

XCode において上記エラーのように、セレクタがなくて例外が発生した場合、
デバッガが run loopで停止して原因箇所が分かりにくい。

解決方法1
gdbのコマンドラインから

b __raiseError
 
または、Xcodeの、実行/ブレークポイントを管理/シンボリック
ブレークポイントを追加で
__raiseError
を追加

例外が発生する前にブレークする

解決方法2
例外が発生してしまった後、どこで起きたかを探る

デバッガの出力

2008-12-24 11:26:04.089 hogehoge[30592:20b] Stack: (

    2487701771,
    2475978299,
    2487730954,
    2487724300,
    2487724498,
    17384,
    23290,
    22894,
    23740,
    38791,
    11319,
    816379725,
    816409420,
    816216335,
    816148471,
    816144856,
    827735530,
    827745292,
    2487203317,
    2487205080,
    827737600,
    827737797,
    816114840,
    816160916,
    9636,
    9490
)

この表示は例外で飛ぶ前のスタックフレーム(プログラムカウンタ)、
10進数なので
上から順にみて数値がお大きく変わるあたりに注目。
ユーザーコードとライブラリでそこそこ分離した場所に
ロードされるので、どこからがユーザーコードなのか大体の判断がつく。
この場合は6番目の17384に注目。
このアドレスのソースコードを出してみる。
特定アドレスのリストを出すには list に * 付き引数。

(gdb) list *17384

普通はこれでばっちり原因箇所が出るはずだ。
ソースが出ない(ライブラリ内だったり)する場合は
他のアドレスを試せばok