iOS 5 シミュレーター/デバイスでの Xcode 4.2 デバッグに問題があります。次のコードは予想どおりクラッシュします。
NSArray *arr=[NSArray array];
[arr objectAtIndex:100];
iOS 4 では、16 進数の便利なスタック トレースを取得できます。しかし、iOS 5 では、次の情報しか得られません。
*** First throw call stack:
(0x16b4052 0x1845d0a 0x16a0674 0x294c 0x6f89d6 0x6f98a6 0x708743 0x7091f8 0x7fcaa9 0x2257fa9 0x16881c5 0x15ed022 0x15eb90a 0x15eadb4 0x15eaccb 0x6f02a7 0x6faa93 0x2889 0x2805)
ありがとう。
ベストアンサー1
何をやってもこの問題を解決できませんでした (両方のコンパイラ、両方のデバッガーなどを試しました)。iOS 5 アップデート用に XCode をアップグレードした後、スタック トレースが機能していないようでした。
しかし、私は効果的な回避策を見つけました。それは、独自の例外ハンドラを作成することです (これは他の理由でも役立ちます)。まず、エラーを処理してコンソールに出力する関数を作成します (他に必要な操作もすべて実行します)。
void uncaughtExceptionHandler(NSException *exception) {
NSLog(@"CRASH: %@", exception);
NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
// Internal error reporting
}
次に、アプリ デリゲートに例外ハンドラーを追加します。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
// Normal launch stuff
}
それでおしまい!
もしこれがうまくいかなかったら、考えられる理由は2つだけ:
- 何かが
NSSetUncaughtExceptionHandler
呼び出しを上書きしています (アプリ全体でハンドラーは 1 つしか存在できません)。たとえば、一部のサードパーティ ライブラリは独自の uncaughtExceptionHandler を設定します。そのため、関数の最後に設定してみてくださいdidFinishLaunchingWithOptions
(またはサードパーティ ライブラリを選択的に無効にしてください)。または、シンボリック ブレーク ポイントを設定して、NSSetUncaughtExceptionHandler
誰が呼び出しているかをすばやく確認することもできます。別のブレーク ポイントを追加するのではなく、現在のブレーク ポイントを変更することをお勧めします。 EXC_BAD_ACCESS
実際に例外が発生しているわけではありません(例えば、ない例外。@Erik B のコメントによる)