webentwicklung-frage-antwort-db.com.de

Xcode zeigt nicht die Zeile an, die einen Absturz verursacht

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?

114
JonasG

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]:

  1. 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).

  2. Klicken Sie unten im Navigator auf die Schaltfläche "+".

  3. Klicken Sie auf "Ausnahme-Haltepunkt hinzufügen".

  4. Ein neuer Haltepunkt wird erstellt. Es sollte nach Bedarf konfiguriert werden, aber Sie können das Verhalten anpassen.

  5. 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.

286
Carter

Folgen Sie einfach den Anweisungen in dieser StackOverflow-Antwort:

Zombies aktivieren

Im Grunde müssen Sie nur "Zombies aktivieren". Dann sollte Xcode an der Zeile abbrechen, die das Problem verursacht hat.

 enter image description here

(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. ..)

17
Mike Gledhill

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.

8
chown

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?

2
FluffulousChimp

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. 

0
AsifHabib