アイデアは次のとおりです。アプリ全体を1回試行/キャッチし、現在のスタックではなく、例外からスタックをログに記録します(つまり、ブレークポイント+検査ではありません)。
main.m
int main(int argc, char *argv[])
{
@autoreleasepool {
@try {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
@catch (NSException *exception) {
NSLog(@"%@",[exception callStackSymbols]);
return 1;
}
}
}
私の理解では、他の方法で適切な方法がない理由は、クラッシュ自体が実行ループの後半まで発生しないためです。キャッチされない例外などのようなものは、runloopが繰り返されるときにAppleのコードのどこかでクラッシュする状態にアプリを置くだけだと思います。これは、UIでクラッシュが発生した場合と似ています...くだらないジオメトリを設定したときに常にクラッシュするわけではなく、使用しようとするとクラッシュします。このため、クラッシュが実際に発生したときの現在の状態からではなく、例外オブジェクトからスタックを取得する必要があります。
情報がないと思ったときに何度か得られたので、これを追加しますが、Xcodeについてはまだ十分に理解していませんでした(これは常識であり、ばかげているだけでした)。時々、私が持っているのは恐ろしいトップレベルのスコープだけだと思うとき、私がする必要があるのは、スタック全体を表示するために左下の小さなスライダーを使用することだけでした。上記の理由により、これはほとんど役に立たないことがよくあります(問題の実行ループの別の部分にあります)。