Xcode 4.2 デバッグではスタック呼び出しがシンボル化されない 質問する

Xcode 4.2 デバッグではスタック呼び出しがシンボル化されない 質問する

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つだけ:

  1. 何かがNSSetUncaughtExceptionHandler呼び出しを上書きしています (アプリ全体でハンドラーは 1 つしか存在できません)。たとえば、一部のサードパーティ ライブラリは独自の uncaughtExceptionHandler を設定します。そのため、関数の最後に設定してみてくださいdidFinishLaunchingWithOptions(またはサードパーティ ライブラリを選択的に無効にしてください)。または、シンボリック ブレーク ポイントを設定して、NSSetUncaughtExceptionHandler誰が呼び出しているかをすばやく確認することもできます。別のブレーク ポイントを追加するのではなく、現在のブレーク ポイントを変更することをお勧めします。
  2. EXC_BAD_ACCESS実際に例外が発生しているわけではありません(例えば、ない例外。@Erik B のコメントによる)

おすすめ記事