1. ホーム
  2. ios

[解決済み] Xcode 4.2デバッグでスタックコールが記号化されない

2022-05-15 22:56:57

質問

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)

ありがとうございます。

どのように解決するのですか?

何をやっても解決しませんでした (両方のコンパイラー、両方のデバッガーなどを試しました)。 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 の呼び出しを上書きしています (アプリ全体に対してハンドラはひとつだけです)。例えば、サードパーティライブラリの中には、独自の uncaughtExceptionHandler を設定するものがあります。そこで、このハンドラを didFinishLaunchingWithOptions 関数の最後に設定する(あるいはサードパーティライブラリを選択的に無効化する)。あるいは、より良い方法は、シンボリックブレークポイントを NSSetUncaughtExceptionHandler にシンボルブレークポイントを設定し、誰がそれを呼び出しているのかを素早く確認することができます。あなたがしたいことは、別のものを追加するよりも、現在のものを修正することです。
  2. 実際に例外に遭遇していない(例. EXC_BAD_ACCESS ではない は例外であり、以下の @Erik B のコメントに謝意を表します)