アプリがクラッシュするたびに、Xcodeは、クラッシュを引き起こした行としてmain()関数のUIApicationMain()呼び出しを強調表示します。以前は正常であった場合(セグメンテーションフォールトなど)でしたが、対処しようとしているクラッシュは、コンソールに詳細な情報が記録された単純なSIGABRTです。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'
Xcodeは以前は古いSDKで適切な行を表示していましたが、Xocde 4.2にアップグレードしてから変更されました。 Xcodeがクラッシュの原因を正確に把握している(または把握できている)ことは明らかですが、実際の行は表示されません。これに対する修正または回避策はありますか?
また、すべての例外にブレークポイントが設定されていることを確認する必要があります。これにより、例外が発生している行でXcodeが停止します。 [Xcode 4で]次を実行します。
Xcodeの左側にあるProject Navigatorで、ブレークポイントナビゲーターをクリックします(ほとんどの場合、一番上のボタンバーの右側まで。アイコンは太い右矢印のように見えます)。
ナビゲーターの下部にある「+」ボタンをクリックします。
[例外ブレークポイントの追加]をクリックします。
新しいブレークポイントが作成されます。必要に応じて設定する必要がありますが、動作を微調整できます。
プロジェクトを実行し、例外を再現します。
また、いくつかのサードパーティのライブラリ/フレームワークにリンクしていることにも言及しました。これらのフレームワーク内で例外が発生している場合、コードがコンパイルされ、Xcodeが実際に例外の原因となった行を表示できないため、苦労することになります。これが当てはまり、ライブラリを正しく使用していることが確実な場合は、それらのライブラリのメンテナーにバグレポートを提出する必要があります。
このStackOverflowの回答の指示に従ってください:
基本的には、「ゾンビを有効にする」だけです。その後、Xcodeは問題の原因となった行で中断します。
(2017年でさえ、Xcodeがデフォルトでこれをオフにしているのは本当に衝撃的です。なぜnotを引き起こした行を見たいのでしょうか?問題?そして、「ゾンビオブジェクトを有効にする」?!本当に?!Xcodeの作者は、これがどんな名前でも役立つ便利な名前だと本当に信じていますか? App Storeで、Xcodeの評価が年々劣っていることを憂鬱に感じています。誰も聞いていません...)
現在のスキームを編集し、 NSZombieEnabled
、 MallocStackLogging
、および guard malloc
。次に、アプリがクラッシュしたら、gdbコンソールに次のように入力します。
(gdb) info malloc-history 0x543216
置換0x543216
にNSInvalidArgumentException
の原因となったオブジェクトのアドレスを指定すると、クラッシュの原因となっているコードの行を示す、より有用なスタックトレースが得られます。
この動作は、大幅に最適化されたコードで見ました。ターゲットの最適化レベルとサードパーティのライブラリの最適化レベルをチェック、調整することが役立つ場合があります。 (LLVM 3.0最適化レベル設定)
デバッグシンボルを生成していますか?
範囲外のインデックスのクラッシュを生成するコードを書きました。スローされる例外は次のとおりです。
2017-01-07 04:02:57.606 testABC[1694:52966] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
*** First throw call stack:
(
0 CoreFoundation 0x000000010e85cd4b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000010e2be21e objc_exception_throw + 48
2 CoreFoundation 0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111
3 testABC 0x000000010dce962d -[ViewController ComplexFunction] + 61
4 testABC 0x000000010dce95db -[ViewController thirdFunction] + 43
5 testABC 0x000000010dce959b -[ViewController secondFunction] + 43
6 testABC 0x000000010dce955b -[ViewController firstFinction] + 43
7 testABC 0x000000010dce96c2 -[ViewController viewDidAppear:] + 50
8 UIKit 0x000000010ee28a6c -[UIViewController _setViewAppearState:isAnimating:] + 945
9 UIKit 0x000000010ee2b7da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42
10 UIKit 0x000000010ee29ac4 -[UIViewController _executeAfterAppearanceBlock] + 86
11 UIKit 0x000000010ec8d77c _runAfterCACommitDeferredBlocks + 653
12 UIKit 0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566
13 UIKit 0x000000010ec9d757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194
14 CoreFoundation 0x000000010e8016ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
15 CoreFoundation 0x000000010e7e66f4 __CFRunLoopDoBlocks + 356
16 CoreFoundation 0x000000010e7e5e65 __CFRunLoopRun + 901
17 CoreFoundation 0x000000010e7e5884 CFRunLoopRunSpecific + 420
18 GraphicsServices 0x00000001126d9a6f GSEventRunModal + 161
19 UIKit 0x000000010ec80c68 UIApplicationMain + 159
20 testABC 0x000000010dce99df main + 111
21 libdyld.dylib 0x000000011174968d start + 1
22 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
First Throw call stack
0 CoreFoundation 0x000000010e85cd4b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000010e2be21e objc_exception_throw + 48
0 and 1
は、クラッシュ後のシステムプロセスです。
2 CoreFoundation 0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111
2
は、例外の原因となった行です。
3 testABC 0x000000010dce962d -[ViewController ComplexFunction] + 61
3
は、例外がスローされたクラス名(ViewController
)と関数naem(ComplexFunction
)を示します。