Jedes Mal, wenn meine App abstürzt, hebt Xcode den Aufruf von UIApicationMain () in der Funktion main () als die Zeile hervor, die den Absturz verursacht hat. In einigen Fällen war das normal (z. B. Segmentierungsfehler), aber der Absturz, mit dem ich mich befassen 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 zeigte die Zeile bei älteren SDKs genau richtig an, aber seit ich auf Xocde 4.2 aktualisiert habe, hat sich das geändert. Es ist ziemlich offensichtlich, dass Xcode genau weiß, was den Absturz verursacht hat (oder wissen könnte), aber es zeigt immer noch nicht die tatsächliche Linie. Gibt es eine Lösung oder Problemumgehung dafür?
objective-c
ios
xcode
cocoa-touch
nsexception
JonasG
quelle
quelle
Antworten:
Sie sollten auch sicherstellen, dass für alle Ausnahmen Haltepunkte festgelegt sind. Dadurch stoppt Xcode an der Zeile, an der die Ausnahme auftritt. Gehen Sie wie folgt vor [in Xcode 4]:
Klicken Sie im Projektnavigator auf der linken Seite von Xcode auf den Haltepunktnavigator (fast bis zur rechten Seite der oberen Schaltflächenleiste. Das Symbol sieht aus wie ein fetter Pfeil nach rechts).
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 sein Verhalten optimieren.
Führen Sie Ihr Projekt aus und reproduzieren Sie die Ausnahme.
Außerdem haben Sie erwähnt, dass Sie mit einigen Bibliotheken / Frameworks von Drittanbietern verknüpft sind. Wenn die Ausnahme in diesen 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.
quelle
Folgen Sie einfach den Anweisungen auf dieser StackOverflow-Antwort:
Zombies aktivieren
Grundsätzlich müssen Sie nur "Zombies aktivieren". Dann sollte Xcode an der Zeile unterbrochen werden, die das Problem verursacht hat.
(Es ist absolut schockierend, dass Xcode dies auch 2017 standardmäßig noch deaktiviert hat. Warum sollten Sie die Zeile, die das Problem verursacht hat, nicht sehen wollen? Und " Zombie-Objekte aktivieren " ?! Wirklich ?! Tun die Xcode-Autoren wirklich glauben, dass dies ein nützlicher Name ist, der für neue Entwickler irgendeinen Sinn ergeben würde? Es ist bedrückend, wie schlecht die Bewertung von Xcode Jahr für Jahr im App Store ist. Niemand hört zu ...)
quelle
Bearbeiten , um das aktuelle Schema und ermöglicht
NSZombieEnabled
,MallocStackLogging
undguard malloc
. Wenn Ihre App abstürzt, geben Sie dies in die GDB-Konsole ein:Ersetzen Sie
0x543216
durch die Adresse des Objekts, das das verursacht hat,NSInvalidArgumentException
und es sollte Ihnen eine viel nützlichere Stapelverfolgung geben, die die Zeilen Ihres Codes anzeigt, die den Absturz verursachen.quelle
Ich habe dieses Verhalten in stark optimiertem Code gesehen. Das Überprüfen, Optimieren der Optimierungsstufe Ihres Ziels und der Libs von Drittanbietern kann hilfreich sein. (Einstellung der LLVM 3.0-Optimierungsstufe)
Generieren Sie Debug-Symbole?
quelle
Ich habe Code geschrieben, um einen Absturz des Index außerhalb der Grenzen zu generieren. Es folgt die Ausnahme.
Wenn Sie die sorgfältig lesen
First Throw call stack
0 and 1
sind die Systemprozesse nach dem Absturz.2
ist die Zeile, die die Ausnahme verursacht hat.3
sagt Ihnen, dassViewController
Klassenname (ComplexFunction
) und Funktion naem ( ), in der Ausnahme ausgelöst wurde.quelle