Articles

So lösen Sie den SIGABRT-Fehler in Xcode

Geschrieben von Reinder de Vries am 6. August 2020 in App-Entwicklung, iOS

So lösen Sie den SIGABRT-Fehler in Xcode

In einer Minute läuft Ihre iOS-App in Xcode einwandfrei, und SIGABRT Fehler. Was ist los!?

In diesem Tutorial lernen Sie:

  • Wie löse ich den Fehler „Signal SIGABRT“ in Xcode
  • Wie verwende ich einige der Debugging-Tools in Xcode
  • Wofür steht SIGABRT und was sind seine Ursachen
  • 3 Ansätze, um die Ursache von SIGABRT zu finden

Bereit? Lass uns gehen.

  1. Was bedeutet „Thread 1: Signal SIGABRT“?
  2. Überprüfen Sie Ihre Outlets
  3. Überprüfen Sie den Stacktrace
  4. Machen Sie einen Ausnahmepunkt
  5. Weiterführende Literatur

Was bedeutet „Thread 1: Signal SIGABRT“?

Der Fehler SIGABRT steht für „signal abort“. Es ist ein Signal, das von iOS – dem Betriebssystem – an eine laufende App gesendet wird, die die App aufgrund eines Laufzeitfehlers sofort beendet. Es bedeutet im Wesentlichen, dass Ihre App abgestürzt ist …

So sieht es in Xcode aus:

Beispiel für SIGABRT in Xcode

Im Screenshot sehen Sie ein paar Dinge:

  • Links sehen Sie eine Liste der Threads, die beim Absturz der App ausgeführt wurden. Sie sehen, dass der Thread, der den Absturz verursacht hat, der Hauptthread oder „Thread 1“ ist.
  • Im Editor sehen wir den gefürchteten Thread 1: signal SIGABRT Fehler. Es hat Zeile 12 im Editor hervorgehoben, die Klassendefinition von AppDelegate.
  • Unten sehen Sie die Debug-Ausgabe. In diesem Fall erhalten Sie eine Stacktrace- und eine kryptische Fehlermeldung, dass Sie nicht „key value coding-compliant“ sind.“

Das Problem mit dem SIGABRT-Fehler ist, dass er zu allgemein ist. Xcode sagt im Grunde: „Schau, deine App ist abgestürzt, das ist alles, was wir wissen.“ In den meisten Fällen des SIGABRT-Fehlers erhalten Sie nur wenige Informationen darüber, was den Fehler verursacht hat.

Bevor wir fortfahren, wollen wir ein paar Missverständnisse und häufige Fallstricke von SIGABRT diskutieren:

  • Der SIGABRT-Fehler hat normalerweise nichts mit der AppDelegate Klassendeklaration zu tun, obwohl er diese Zeile in Xcode hervorhebt. Die Zeile wird hervorgehoben, da es sich um die erste Codezeile Ihrer App handelt. Verschwenden Sie keine Zeit damit, in der AppDelegate -Klasse zu suchen, es sei denn, Sie sind absolut sicher, dass der Fehler darin enthalten ist.
  • Der Stacktrace ist eine Liste von Funktionsaufrufen, die zum Absturz der App führen. Das bedeutet nicht, dass sich die Codezeile, die den Fehler verursacht hat, irgendwo im Stacktrace befindet. Manchmal ist dies der Fall, aber in anderen Fällen führt der Stacktrace lediglich zu dem Code, der an einem Wert erstickt ist, den Sie an anderer Stelle in Ihrem eigenen Code festgelegt haben.
  • Starren Sie sich nicht blind auf einen SIGABRT-Fehler. Es gibt eine rationale, logische Ursache für den Fehler. Es ist wahrscheinlich ein Fehler in Ihrem eigenen Code, und daran ist nichts auszusetzen. Apps sind keine Magie, niemand ist darauf aus, Sie zu bekommen, und Fehler treten nie aus heiterem Himmel auf. Frustriere dich nicht mit Gedanken wie „Es lief gestern gut!“ – das tut es immer und jetzt nicht!

Nachdem wir nun eine Baseline erstellt haben, kommen wir zur ersten Ursache von SIGABRT.

Erfahren Sie, wie Sie iOS-Apps erstellen

Erste Schritte mit iOS 14 und Swift 5

Melden Sie sich für meinen iOS-Entwicklungskurs an und erfahren Sie, wie Sie mit Swift 5 und Xcode 12 großartige iOS 14-Apps erstellen.

Überprüfen Sie Ihre Steckdosen

Eine häufige Ursache für „Signal SIGABRT“ ist ein Tippfehler oder ein Fehler in Ihren Steckdosen. Hier ist, was passiert ist:

  • Sie haben im Interface Builder einen neuen View Controller erstellt und ihn mit einigen UI-Elementen wie Schaltflächen und Beschriftungen eingerichtet
  • Sie haben diese UI-Elemente mithilfe von Outlet-Eigenschaften mit Ihrem Code verbunden, wodurch eine Verbindung zwischen einer Eigenschaft Ihres View Controllers und dem UI-Element im Interface Builder hergestellt wird
  • An einem Punkt haben Sie den Namen der ursprünglichen Outlet-Eigenschaft geändert und Ihre App stürzte mit einem SIGABRT-Fehler ab

Wenn Sie mit Interface Builder einen View verwendet die XIB-Datei, um die Benutzeroberfläche des View Controllers zu generieren wenn Ihre App ausgeführt wird (grob gesagt). An diesem Punkt werden auch Outlets aus der XIB mit Eigenschaften der View Controller-Klasse verbunden.

Wenn Sie den Namen einer Outlet-Eigenschaft geändert haben, kann Ihre App sie nicht mehr finden. Und deshalb wird es eine Ausnahme auslösen. Was den SIGABRT-Fehler verursacht, behandelt diese Ausnahme nicht.

So sieht das in Xcode aus:

SIGABRT-Fehler mit Outlets

Sehen Sie, was passiert? Die Eigenschaft heißt otherButton, aber die Steckdose heißt immer noch button . Irgendwann haben wir die Steckdose geändert – weil der neue Name besser ist – und die App verwirrt, was sie zum Absturz brachte.

Oben im Stacktrace finden wir noch einen weiteren Hinweis:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: ': this class is not key value coding-compliant for the key button.

Was bedeutet das? Die App teilt uns an dieser Stelle mit, dass der View Controller für den Schlüssel button nicht mit der Schlüsselwertcodierung kompatibel ist. Dies bedeutet, dass die Eigenschaft button auf dem View Controller nicht gefunden werden kann. Und das stimmt, weil wir es umbenannt haben.

iOS verwendet einen Mechanismus namens Key Value Coding, um die Eigenschaften eines View Controllers zu überprüfen, sodass er diese Eigenschaften verwenden kann, um auf UI-Elemente zu verweisen, die er basierend auf der XIB erstellt hat.

Wie lösen Sie den Fehler an dieser Stelle? Sie können 2 Ansätze verwenden:

  1. Sie benennen die Eigenschaft wieder in ihren ursprünglichen Namen um
  2. Sie entfernen die Outlet-Verbindung im Interface Builder und verbinden sie erneut mit dem neuen Outlet-Eigenschaftsnamen

Machen wir weiter!

Kurzer Tipp: So wie eine geänderte @IBOutlet „Thread 1″ verursachen kann: signal SIGABRT“, so kann das irrtümliche Ändern des Namens einer Aktion, d.h. mit @IBAction, den SIGABRT-Fehler verursachen.

Überprüfen Sie den Stacktrace

In vielen Fällen zeigt Xcode keine hilfreichen Fehlermeldungen für einen SIGABRT-Absturz an. In diesem Fall ist es hilfreich, einige Debugging-Befehle zu kennen, z. B. bt .

Xcode verfügt über eine integrierte Debugging-Umgebung namens LLDB. Dies sehen Sie unten in Xcode, wenn Ihre App ausgeführt wird, im Konsolen- oder Debug-Ausgabebereich. Sie sehen hier oft Debug-Meldungen, aber wussten Sie, dass Sie damit auch Befehle eingeben können?

Wenn Ihre App das nächste Mal abstürzt, geben Sie help in LLDB ein. So:

Debuggen von SIGABRT in der Konsole in Xcode

Sie werden sehen, dass viele der LLDB-Befehle direkt Aktionen entsprechen, die Sie mit dem Debugger ausführen können, z. B. das Setzen von Haltepunkten, das Übergehen von Codezeilen und das Überprüfen von Laufzeitwerten.

Ein Befehl ist besonders nützlich. Sie können bt eingeben, um den aktuellen Aufrufstapel anzuzeigen (auch „Backtrace“ oder „stacktrace“ genannt). Dies ist eine Liste aller Funktionen, die bis zum aktuellen Absturz ausgeführt wurden. Diese Ablaufverfolgung enthält normalerweise die Funktion, die einen Fehler verursacht hat.

Überprüfen Sie hier den Stacktrace eines typischen Indexfehlers außerhalb des Bereichs. In der Abbildung unten haben wir diesen Fehler absichtlich verursacht, indem wir index 99 aus einem Array mit nur 4 Elementen abgerufen haben. Wenn die App abstürzt, bt kann uns sagen, welche Codezeile den Fehler verursacht hat.

Beispiel für einen Index außerhalb des Bereichs

Können Sie die folgenden Informationen im Stacktrace erkennen?

  • Der fehlerhafte Code befindet sich in Zeile 21 von ViewController.swift, innerhalb der viewDidLoad() Funktion
  • Sie können sogar sehen, dass wir den Index „getter“ von Array
  • Vor dem Absturz eine ganze Reihe von View Controller-bezogenen Funktionsaufrufen basierend auf den Informationen, die wir mit bt erhalten haben, können wir die fehlerhafte Zeile in unserem Code finden und beheben. Xcode hat uns in diesem Fall bereits geholfen, indem wir den Fehler im Editor hervorgehoben haben. In einigen Szenarien haben Sie nicht so viel Glück, und dann kann es hilfreich sein, den Befehl bt .

    Eine letzte Sache: Sie können Werte zur Laufzeit mit dem Befehl print überprüfen. Im obigen Szenario hätte die Eingabe von print names folgende Ausgabe erzeugt:

    () $R0 = 4 values { = "Ford" = "Arthur" = "Zaphod" = "Trillian"}

    Verwenden Sie zum Drucken komplexer Objekte po. Großartig!

    Beachten Sie, dass ein Stacktrace von außen nach innen ausgeführt wird. Der untere Teil der Stapelverfolgung zeigt Funktionsaufrufe der obersten Ebene an, und je höher der Stapel ist, desto tiefer gehen die Aufrufe ein. Der neueste Aufruf der tiefsten Ebene befindet sich oben auf dem Stapel.

    Machen Sie eine Ausnahme Haltepunkt

    Sie können Haltepunkte verwenden, um die Ausführung Ihres Codes in einer bestimmten Zeile zu stoppen. An diesem Punkt können Sie dann Werte überprüfen und Funktionen durchlaufen.

    Ein Exception Breakpoint wird immer dann ausgelöst, wenn eine Exception in Ihrem Code auftritt. Anstatt anzugeben, in welcher Zeile der Haltepunkt ausgelöst wird, weisen Sie den Debugger an, die Codeausführung für Ausnahmen anzuhalten.

    Ausnahme-Haltepunkte sind nützlich, um den Code zu überprüfen, wenn eine Ausnahme auftritt. Sie können sehen, welche Codezeile die Ausnahme ausgelöst hat, und Sie können zu diesem Zeitpunkt Werte in Ihrem Code überprüfen. Einige Ausnahmen werden durch Fehler oder ungültige Zustände Ihrer App verursacht.

    So können Sie einen Exception Breakpoint setzen:

    1. Gehen Sie zum Haltepunkt-Navigator in Xcode, indem Sie die Registerkarten auf der linken Seite verwenden
    2. Klicken Sie unten links auf +-Taste und wählen Sie Ausnahme Haltepunkt
    3. Lassen Sie die Standardeinstellungen unverändert (obwohl sie zum Anpassen hilfreich sind)
    4. Führen Sie Ihren Code aus

    Exception Breakpoint

    Wenn eine Ausnahme ausgelöst wird, wird die Ausführung Ihrer App angehalten. Sie können jetzt den Debugger verwenden, um Werte zu überprüfen, den Code zu durchlaufen und LLDB-Befehle zu verwenden. Wenn möglich, führt Xcode Sie zu der Codezeile, die die Ausnahme verursacht hat.

    Denken Sie daran, dass eine Ausnahme Ihre App nicht unbedingt zum Absturz bringt! Wenn also der Ausnahmebrechepunkt aktiviert ist und eine Ausnahme auftritt, wird Ihre App angehalten. Das Anhalten von Code mit einem Haltepunkt ist nicht dasselbe wie ein App-Absturz.

    Beispielsweise wird ein Ausnahmebrechepunkt durch eine unzufriedene Constraints-Ausnahme ausgelöst, die Ihre App jedoch nicht zum Absturz bringt. Verwenden Sie den Ausnahme-Haltepunkt, um zusätzliche Informationen für den SIGABRT-Absturz zu sammeln, und deaktivieren Sie ihn dann, sobald Sie den Fehler behoben haben (bis er erneut benötigt wird).

    Erfahren Sie, wie Sie iOS-Apps erstellen

    Erste Schritte mit iOS 14 und Swift 5

    Melden Sie sich für meinen iOS-Entwicklungskurs an und erfahren Sie, wie Sie mit Swift 5 und Xcode 12 großartige iOS 14-Apps erstellen.

    Weiterlesen

    Der SIGABRT-Fehler ist ziemlich kryptisch und kann sich als schwierig zu lösen erweisen. Warum kann Xcode nicht nur hilfreiche Fehlermeldungen geben? Nun, das ist eine gute Frage …

    Die kurze Antwort ist, dass es so viele bewegliche Teile in der iOS-Entwicklung gibt, dass Xcode die Ursache eines Absturzes nicht immer bestimmen kann. Xcode weiß nicht, dass Sie den Namen einer Steckdose fälschlicherweise geändert haben. Es weiß nur, dass beim Verbinden der Steckdose ein Code aufgerufen wurde, der eine Ausnahme verursachte.

    Dies bedeutet, dass Sie immer einen Fehler sehen, der so nah wie möglich an der Grundursache liegt. Das Beste, was Sie tun können, ist, viele Fehler zu machen, viele Fehlermeldungen zu entschlüsseln und sie besser kennenzulernen. Und was Sie in diesem Tutorial gelernt haben, ist, wie Sie den SIGABRT-Fehler finden und lösen können!

    Möchten Sie mehr erfahren? Schauen Sie sich diese Ressourcen an:

    • Erste Schritte mit dem Debuggen in Xcode
    • Verstehen des Fehlers „Nicht erkannter Selektor an Instanz gesendet“ in Xcode
    • Verstehen des Fehlers „Unerwartet Null beim Auspacken eines optionalen Werts gefunden“
    • Verstehen des Fehlers „Verwendung eines ungelösten Bezeichners“ in Xcode
    • Off-By-One-Fehler in der Swift-Programmierung
    • Fehlerbehandlung in Swift mit Do-Try-Catch