Jedes Mal, wenn meine App abstürzt, hebt Xcode den UIApicationMain () - Aufruf in der Funktion main () als Zeile hervor, die den Absturz verursacht hat. In einigen Fällen war das normal (Segmentierungsfehler zum Beispiel), aber der Absturz, mit dem ich mich beschäftigen möchte, ist ein einfaches SIGABRT mit detaillierten Informationen, die in der Konsole protokolliert werden:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'
Xcode verwendete, um die Zeile mit älteren SDKs richtig darzustellen, aber seit ich auf Xocde 4.2 aufgerüstet bin, hat sich das geändert. Es ist ziemlich offensichtlich, dass Xcode genau weiß, was den Absturz verursacht hat (oder wissen könnte), aber es wird immer noch nicht die tatsächliche Linie angezeigt. Gibt es eine Korrektur oder Abhilfe für dieses Problem?
Sie sollten auch sicherstellen, dass für alle Ausnahmen Haltepunkte festgelegt sind. Dadurch wird Xcode in der Zeile angehalten, in der die Ausnahme auftritt. Tun Sie Folgendes [in Xcode 4]:
Klicken Sie im Projektnavigator auf der linken Seite von Xcode auf den Haltepunktnavigator (fast ganz rechts neben der oberen Schaltflächenleiste. Das Symbol sieht aus wie ein dicker rechter Pfeil).
Klicken Sie unten im Navigator auf die Schaltfläche "+".
Klicken Sie auf "Ausnahme-Haltepunkt hinzufügen".
Ein neuer Haltepunkt wird erstellt. Es sollte nach Bedarf konfiguriert werden, aber Sie können das Verhalten anpassen.
Führen Sie Ihr Projekt aus und reproduzieren Sie die Ausnahme.
Sie haben auch erwähnt, dass Sie mit Bibliotheken/Frameworks von Drittanbietern verlinkt sind. Wenn die Ausnahme innerhalb dieser Frameworks auftritt, wird es Ihnen schwer fallen, da der Code kompiliert wird und Xcode Ihnen die Zeile, die die Ausnahme verursacht hat, nicht anzeigen kann. Wenn dies der Fall ist und Sie sicher sind, dass Sie die Bibliotheken korrekt verwenden, sollten Sie den Betreuern dieser Bibliotheken einen Fehlerbericht vorlegen.
Folgen Sie einfach den Anweisungen in dieser StackOverflow-Antwort:
Im Grunde müssen Sie nur "Zombies aktivieren". Dann sollte Xcode an der Zeile abbrechen, die das Problem verursacht hat.
(Es ist absolut schockierend, dass Xcode auch 2017 noch standardmäßig deaktiviert ist. Warum möchten Sie nicht die Zeile sehen, die das Problem verursacht hat? Und "Enable Zombie Objects"?! Wirklich?! Glauben die Xcode-Autoren wirklich, dass dies ein nützlicher Name ist, der für neue Entwickler Sinn macht? Es ist bedrückend, wie schlecht Xcode Jahr für Jahr im App Store bewertet wird. ..)
Bearbeiten Sie das aktuelle Schema und aktivieren Sie NSZombieEnabled
, MallocStackLogging
und guard malloc
. Wenn Ihre App abstürzt, geben Sie Folgendes in die gdb-Konsole ein:
(gdb) info malloc-history 0x543216
Ersetzen Sie 0x543216
durch die Adresse des Objekts, das die NSInvalidArgumentException
verursacht hat, und es sollte Ihnen eine viel nützlichere Stack-Ablaufverfolgung geben, die die Zeilen Ihres Codes anzeigt, die den Absturz verursachen.
Ich habe dieses Verhalten in stark optimiertem Code gesehen. Wenn Sie überprüfen, können Sie die Optimierung Ihres Ziels und die von Drittanbieter-Libs optimieren. (Einstellung für die LLVM 3.0-Optimierungsebene)
Generieren Sie Debug-Symbole?
Ich habe Code geschrieben, um einen Absturz des Index außerhalb des gebundenen Bereichs zu generieren. Die folgende Ausnahme wird ausgelöst.
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
Wenn Sie den First Throw call stack
sorgfältig gelesen haben
0 CoreFoundation 0x000000010e85cd4b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x000000010e2be21e objc_exception_throw + 48
0 and 1
sind die Systemprozesse nach dem Absturz.
2 CoreFoundation 0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111
2
ist die Zeile, die die Ausnahme verursacht hat.
3 testABC 0x000000010dce962d -[ViewController ComplexFunction] + 61
3
sagt Ihnen, dass der Klassenname (ViewController
) und die Funktion naem (ComplexFunction
) in welcher Ausnahme ausgelöst wurde.