Technologische Neuigkeiten, Bewertungen und Tipps!

So lösen Sie den SIGABRT-Fehler in Xcode

Hinweis: Der folgende Artikel hilft Ihnen weiter: So lösen Sie den SIGABRT-Fehler in Xcode

Zurück zum Blog

In einer Minute läuft Ihre iOS-App in Xcode einwandfrei und in der nächsten ist sie hoffnungslos mit einem kryptischen SIGABRT-Fehler abgestürzt. Was ist los!?

In diesem Tutorial zur App-Entwicklung erfahren Sie:

  • So beheben Sie den „Signal SIGABRT“-Fehler in Xcode
  • So verwenden Sie einige der Debugging-Tools in Xcode
  • Wofür SIGABRT steht und was seine Ursachen sind
  • 3 Ansätze, um die Grundursache von SIGABRT zu finden

Der Fehler SIGABRT steht für „Signal Abort“. Dabei handelt es sich um 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 …

Im Screenshot sehen Sie ein paar Dinge:

  • Auf der linken Seite 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: SIGABRT-Fehler signalisieren. Es hat Zeile 12 im Editor hervorgehoben, die Klassendefinition von AppDelegate.
  • Unten sehen Sie hilfreiche Debug-Ausgaben. In diesem Fall erhalten Sie einen Stacktrace und eine kryptische Fehlermeldung, dass die Schlüsselwertcodierung nicht konform ist.

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

Bevor wir fortfahren, besprechen wir einige Missverständnisse und häufige Fallstricke von SIGABRT:

  • Der SIGABRT-Fehler hat normalerweise nichts mit der Deklaration der AppDelegate-Klasse zu tun, auch wenn er diese Zeile in Xcode hervorhebt. Die Zeile ist hervorgehoben, da es sich um die erste Codezeile Ihrer App handelt. Verschwenden Sie Ihre Zeit nicht mit der Suche in der AppDelegate-Klasse, es sei denn, Sie sind absolut sicher, dass der Fehler darin liegt.
  • Der Stacktrace ist eine Liste von Funktionsaufrufen, die zum Absturz der App geführt haben. Das bedeutet nicht, dass sich die Codezeile, die den Fehler verursacht hat, irgendwo im Stacktrace befindet. Manchmal ist das so, 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 nicht blind auf einen SIGABRT-Fehler. Es gibt eine rationale, logische Ursache für den Fehler. Es handelt sich wahrscheinlich um einen Fehler in Ihrem eigenen Code, und daran ist nichts auszusetzen. Apps sind keine Zauberei, niemand hat es auf Sie abgesehen und Fehler tauchen nie aus heiterem Himmel auf. Frustrieren Sie sich nicht mit Gedanken wie „Gestern lief es gut!“ – das tut es immer, und jetzt nicht!

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

Eine häufige Ursache für „Signal SIGABRT“ ist ein Tippfehler oder Fehler in Ihren Verkaufsstellen. Folgendes ist passiert:

  • Sie haben im Interface Builder einen neuen Ansichtscontroller 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
  • Irgendwann haben Sie den Namen der ursprünglichen Outlet-Eigenschaft geändert und Ihre App stürzte mit einem SIGABRT-Fehler ab

Wenn Sie Interface Builder verwenden, um einen View-Controller zu erstellen, verwendet Ihre App die XIB-Datei, um die Benutzeroberfläche des View-Controllers zu generieren, wenn Ihre App ausgeführt wird (grob gesagt). Zu diesem Zeitpunkt werden auch Ausgänge von der XIB mit Eigenschaften der View-Controller-Klasse verbunden.

Wenn Sie den Namen einer Outlet-Immobilie geändert haben, kann Ihre App diese nicht mehr finden. Und aus diesem Grund wird eine Ausnahme ausgelöst. Was den SIGABRT-Fehler verursacht, ist die fehlende Behandlung dieser Ausnahme.

So sieht das in Xcode aus:

Sehen Sie, was passiert? Die Eigenschaft heißt otherButton, aber der Ausgang heißt immer noch button. Irgendwann haben wir das Outlet geändert – weil der neue Name besser ist – und die App verwirrt, was zum Absturz geführt hat.

Oben im Stacktrace entdecken wir noch einen weiteren Hinweis:

App wird aufgrund der nicht abgefangenen Ausnahme „NSUnknownKeyException“ beendet, Grund: „[<…> setValue:forUndefinedKey:]: Diese Klasse ist nicht mit der Schlüsselwertcodierung für die Schlüsseltaste kompatibel.
Was bedeutet das? Die App teilt uns an dieser Stelle mit, dass der Ansichtscontroller nicht mit der Schlüsselwertcodierung für die Tastentaste kompatibel ist. Dies bedeutet, dass die Schaltflächeneigenschaft auf dem Ansichtscontroller nicht gefunden werden kann. Und das stimmt, denn wir haben es umbenannt.

iOS verwendet einen Mechanismus namens Schlüsselwertcodierung, um die Eigenschaften eines View Controllers zu überprüfen, sodass es diese Eigenschaften verwenden kann, um auf UI-Elemente zu verweisen, die es basierend auf dem XIB erstellt hat.

Wie beheben Sie den Fehler an dieser Stelle? Sie können zwei Ansätze verwenden:

  1. Sie benennen die Eigenschaft wieder in ihren ursprünglichen Namen um
  2. Sie entfernen die Steckdosenverbindung im Interface Builder und verbinden sie mit dem neuen Namen der Steckdoseneigenschaft erneut

Kurzer Tipp: So wie ein geändertes @IBOutlet „Thread 1: Signal SIGABRT“ verursachen kann, kann auch eine versehentliche Änderung des Namens einer Aktion, z. B. bei @IBAction, den SIGABRT-Fehler verursachen.

In vielen Fällen zeigt Ihnen 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. Es ist das, was Sie unten in Xcode sehen, wenn Ihre App ausgeführt wird, in der Konsole oder im Debug-Ausgabebereich. Hier werden oft Debug-Meldungen angezeigt, aber wussten Sie, dass Sie damit auch Befehle eingeben können?

Wenn Ihre App das nächste Mal abstürzt, versuchen Sie, help in LLDB einzugeben. So was:

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 Überspringen 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.

Schauen Sie sich hier den Stacktrace eines typischen Index-Out-of-Range-Fehlers an. Im Screenshot unten haben wir diesen Fehler absichtlich verursacht, indem wir den Index 99 aus einem Array abgerufen haben, das nur 4 Elemente enthält. Wenn die App abstürzt, kann BT uns mitteilen, welche Codezeile den Fehler verursacht hat.

Können Sie die folgenden Informationen im Stacktrace erkennen?

  • Der fehlerhafte Code befindet sich in Zeile 21 von ViewController.swift in der Funktion viewDidLoad()
  • Sie können sogar sehen, dass wir den tiefgestellten „Getter“ von Array verwendet haben
  • Vor dem Absturz wurden eine ganze Reihe von View-Controller-bezogenen Funktionsaufrufen durchgeführt

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 es den Fehler im Editor hervorgehoben hat. In manchen Fällen werden Sie nicht so viel Glück haben, und dann kann es hilfreich sein, den Befehl bt zu verwenden.

Eine letzte Sache: Sie können Werte zur Laufzeit mit dem Druckbefehl überprüfen. Im obigen Szenario hätte die Eingabe von Drucknamen zu dieser Ausgabe geführt:

([String]) $R0 = 4 Werte {
[0] = „Ford“
[1] = „Arthur“
[2] = „Zaphod“
[3] = „Trillian“
}

Zum Drucken komplexer Objekte verwenden Sie po. Eindrucksvoll!

Beachten Sie, dass ein Stacktrace von außen nach innen verläuft. Am unteren Rand des Stack-Trace werden die Funktionsaufrufe der obersten Ebene angezeigt. Je höher Sie im Stack gehen, desto tiefer gehen die Aufrufe ein. Der letzte, jüngste und tiefste Aufruf befindet sich ganz oben im Stack.

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

Ausnahmehaltepunkte 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 an dieser Stelle die Werte in Ihrem Code überprüfen. Einige Ausnahmen werden durch Fehler oder ungültige Zustände Ihrer App verursacht. Daher sind Ausnahmehaltepunkte hilfreich, um diese Fehler zu finden und zu beheben.

So können Sie einen Ausnahme-Haltepunkt festlegen:

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

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 schrittweise durchzugehen und LLDB-Befehle zu verwenden. Wenn möglich, führt Sie Xcode zu der Codezeile, die die Ausnahme verursacht hat.

Bedenken Sie, dass eine Ausnahme nicht unbedingt zum Absturz Ihrer App führt! Wenn also der Ausnahmehaltepunkt aktiviert ist und eine Ausnahme auftritt, wird Ihre App angehalten. Das Anhalten von Code mit einem Haltepunkt ist nicht dasselbe wie ein App-Absturz, also lassen Sie sich davon nicht verwirren.

Beispielsweise wird ein Ausnahme-Haltepunkt durch eine Ausnahme „Nicht erfüllte Einschränkungen“ ausgelöst, was jedoch nicht zum Absturz Ihrer App führt. 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).

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

Die kurze Antwort lautet: Es gibt so viele bewegliche Teile in der iOS-Entwicklung, dass Xcode nicht immer die Ursache eines Absturzes ermitteln kann. Xcode weiß nicht, dass Sie den Namen einer Verkaufsstelle fälschlicherweise geändert haben. Es weiß nur, dass beim Anschließen der Steckdose ein Code aufgerufen wurde, der eine Ausnahme verursacht hat.

Das 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 beheben können!

Table of Contents