hogyan lehet megoldani a SIGABRT hibát az Xcode-ban
Reinder de Vries írta 6.augusztus 2020-án az alkalmazásfejlesztésben, iOS
az egyik percben az iOS alkalmazás jól működik az Xcode-ban, a következőben pedig reménytelenül összeomlott egy rejtélyes sigabrt hiba. Mi folyik itt!?
ebben az oktatóanyagban megtudhatja:
- hogyan lehet megoldani a “Signal SIGABRT” hibát az Xcode-ban
- hogyan kell használni néhány hibakereső eszközt az Xcode-ban
- mit jelent a SIGABRT, és mi az oka
- 3 megközelítés a SIGABRT kiváltó okának megtalálásához
Kész? Menjünk.
- mit jelent az “1. szál: Sigabrt jel”?
- ellenőrizze a kimeneteit
- ellenőrizze a Stacktrace-t
- kivételt tesz töréspont
- további olvasat
- mit jelent az “1. szál: Sigabrt jel”?
- Ismerje meg, hogyan építhet iOS alkalmazásokat
- kezdje el az iOS 14 és a Swift 5 használatát
- ellenőrizze a kimeneteit
- ellenőrizze a Stacktrace-t
- tegyen kivételt töréspont
- Ismerje meg, hogyan építhet iOS alkalmazásokat
- kezdje el az iOS 14 és a Swift 5 használatát
- további olvasat
mit jelent az “1. szál: Sigabrt jel”?
a SIGABRT hiba a “signal abort”rövidítést jelenti. Ez egy jel, amelyet az iOS – az operációs rendszer-küld egy futó alkalmazásnak, amely futásidejű hiba miatt azonnal kilép az alkalmazásból. Ez lényegében azt jelenti, hogy az alkalmazás összeomlott …
így néz ki az Xcode-ban:
a képernyőképen néhány dolgot lát:
- a bal oldalon látható az alkalmazás összeomlásakor futó szálak listája. Látja, hogy az összeomlást okozó szál a fő szál, vagy “1.szál”.
- a szerkesztőben látjuk, hogy a rettegett szál 1: signal SIGABRT hiba. Kiemelte a 12. sort a szerkesztőben, a
AppDelegate
osztálydefinícióját. - alul látható a hasznos hibakeresési kimenet. Ebben az esetben kap egy stacktrace-t és egy rejtélyes hibaüzenetet arról, hogy nem “kulcsérték kódolás-kompatibilis.”
a SIGABRT hiba problémája az, hogy túl általános. Az Xcode alapvetően azt mondja: “Nézd, az alkalmazásod összeomlott, ez minden, amit tudunk.”A SIGABRT hiba legtöbb esetben kevés információt kap arról, hogy mi okozta a hibát.
mielőtt folytatnánk, beszéljünk meg néhány téves elképzelést és a SIGABRT gyakori buktatóit:
- a SIGABRT hibának általában semmi köze nincs a
AppDelegate
osztály deklarációhoz, annak ellenére, hogy kiemeli ezt a sort az Xcode-ban. A sor ki van emelve, mert ez az alkalmazás első kódsora. Ne pazarolja az idejét aAppDelegate
osztályban, hacsak nem biztos benne, hogy a hiba ott van. - a stacktrace egy olyan függvényhívások listája, amelyek az alkalmazás összeomlásához vezetnek. Ez nem azt jelenti, hogy a hibát okozó kódsor bárhol megtalálható a stacktrace-ben. Néha az, de más esetekben a stacktrace csupán ahhoz a kódhoz vezet, amely elfojtott egy értéket, amelyet a saját kódjában máshol beállított.
- ne bámulja magát vakon egy SIGABRT hibára. Van egy racionális, logikus oka a hibának. Ez valószínűleg egy hiba a saját kódjában, és nincs ezzel semmi baj. Az alkalmazások nem varázslatosak, senki sem akar elkapni, és a hibák soha nem jelennek meg a kékből. Ne frusztrálja magát olyan gondolatokkal, mint ” tegnap jól futott!”- mindig így van, most pedig nem!
most, hogy létrehoztunk egy alapvonalat, térjünk rá a SIGABRT első okára.
Ismerje meg, hogyan építhet iOS alkalmazásokat
kezdje el az iOS 14 és a Swift 5 használatát
iratkozzon fel az iOS fejlesztői tanfolyamomra, és ismerje meg, hogyan építhet nagyszerű iOS 14 alkalmazásokat a Swift 5 és az Xcode 12 segítségével.
ellenőrizze a kimeneteit
a “Signal SIGABRT” gyakori oka egy elírás vagy hiba az üzletekben. Itt van, mi történt:
- létrehozott egy új nézetvezérlőt az Interface Builder alkalmazásban, és beállította néhány felhasználói felület elemmel, például gombokkal és címkékkel
- ezeket a felhasználói felület elemeket a kimeneti tulajdonságok használatával csatlakoztatta a kódjához, amely kapcsolatot hoz létre a nézetvezérlő egyik tulajdonsága és az Interface Builder felhasználói felület eleme között
- egy ponton megváltoztatta a kezdeti outlet tulajdonság nevét, és az alkalmazás sigabrt hibával kezdett összeomlani
amikor az Interface Builder segítségével nézetvezérlőt hoz létre, az alkalmazás az xib fájlt fogja használni a nézetvezérlő felhasználói felületének létrehozásához amikor az alkalmazás fut (durván szólva). Ezen a ponton az xib kimeneteit is összekapcsolja a nézetvezérlő osztály tulajdonságaival.
ha megváltoztatta egy outlet tulajdonság nevét, az alkalmazás már nem találja meg. És emiatt kivételt fog tenni. Mi okozza a SIGABRT hibát, nem kezeli ezt a kivételt.
így néz ki az Xcode:
látod, mi történik? A tulajdonság neve otherButton
, de a kimenet továbbra is button. Egy ponton megváltoztattuk az aljzatot – mert az új név jobb–, és összekeverjük az alkalmazást, ami összeomlik.
a stacktrace tetején egy másik nyomot is észlelünk:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: ': this class is not key value coding-compliant for the key button.
mit jelent ez? Az alkalmazás ezen a ponton azt mondja nekünk, hogy a nézetvezérlő nem megfelelő kulcsérték-kódolással a button
kulcshoz. Ez azt jelenti, hogy nem találja a button
tulajdonságot a nézetvezérlőn. És ez igaz, mert átneveztük.
az iOS a key value coding nevű mechanizmust használja a nézetvezérlő tulajdonságainak ellenőrzésére, így ezeket a tulajdonságokat felhasználhatja az XIB alapján létrehozott felhasználói felület elemeire.
hogyan oldja meg a hibát ezen a ponton? 2 megközelítést használhat:
- átnevezi a tulajdonságot az eredeti nevére
- eltávolítja a kimeneti kapcsolatot az Interface Builder alkalmazásban, majd újra csatlakoztatja az új kimeneti tulajdonság nevével
lépjünk tovább!
gyors tipp: csakúgy, mint egy megváltozott@IBOutlet
okozhat ” szál 1: sigabrt ” jel, így hibásan megváltoztathatja a művelet nevét, azaz a @IBAction
segítségével a SIGABRT hibát okozhatja.
ellenőrizze a Stacktrace-t
sok esetben az Xcode nem jelenít meg hasznos hibaüzeneteket a SIGABRT összeomlásához. Amikor ez megtörténik, hasznos tudni néhány hibakeresési parancsot, például bt
.
az Xcode integrált hibakeresési környezettel rendelkezik, az LLDB néven. Ez az, amit az Xcode alján lát, amikor az alkalmazás fut, a konzol vagy a hibakeresés kimeneti területe. Itt gyakran lát hibakeresési üzeneteket, de tudta, hogy parancsok bevitelére is felhasználhatja?
amikor az alkalmazás összeomlik, próbálja meg beírni help
az LLDB-ben. Így:
látni fogja, hogy az LLDB parancsok közül sok közvetlenül megfelel a hibakeresővel elvégezhető műveleteknek, például töréspontok beállítása, kódsorok átlépése és futásidejű értékek ellenőrzése.
egy parancs különösen hasznos. Beírhatja bt
az aktuális hívási verem megtekintéséhez (más néven” backtrace “vagy”stacktrace”). Ez az összes olyan funkció listája, amely az aktuális összeomlásig futott. Ez a nyomkövetés általában magában foglalja azt a funkciót, amely hibát okozott.
itt nézd meg a stacktrace egy tipikus Index tartományon kívüli hiba. Az alábbi képernyőképen szándékosan okoztuk ezt a hibát azáltal, hogy index 99
egy tömbből, amely csak 4 elemet tartalmaz. Amikor az alkalmazás összeomlik, a bt
meg tudja mondani, hogy melyik kódsor okozta a hibát.
meg tudja találni a következő információkat a stacktrace-ben?
- a jogsértő kód a 21.sorban található
ViewController.swift
, belül aviewDidLoad()
függvény - azt is láthatjuk, hogy a
Array
- alindexet használtuk”getter”nak,-nek
Array
- az összeomlás előtt egy egész csomó nézet a vezérlővel kapcsolatos függvényhívások
a bt
segítségével kapott információk alapján megtalálhatjuk a jogsértő sort a kódunkban, és kijavíthatjuk. Az Xcode ebben az esetben már segített nekünk, kiemelve a hibát a szerkesztőben. Bizonyos esetekben nem lesz ilyen szerencséje, majd hasznos lehet a bt
parancs használata.
még egy utolsó dolog: az értékeket futás közben ellenőrizheti a print
paranccsal. A fenti forgatókönyv szerint a print names
beírása ezt a kimenetet eredményezte volna:
() $R0 = 4 values { = "Ford" = "Arthur" = "Zaphod" = "Trillian"}
összetett objektumok nyomtatásához használja a po
. Király!
ne feledje, hogy egy stacktrace fut kívül-in. A verem nyomának alján a legfelső szintű függvényhívások láthatók, és minél magasabbra megy a verem, annál mélyebbre kerülnek a hívások. A legutóbbi, legfrissebb, legmélyebb szintű hívás a verem tetején található.
tegyen kivételt töréspont
a töréspontok segítségével leállíthatja a kód végrehajtását egy bizonyos sorban. Ezen a ponton ellenőrizheti az értékeket, és átlépheti a funkciókat.
kivétel töréspont aktiválódik, amikor kivétel történik a kódban. Ahelyett, hogy megadná, melyik vonalon indítja el a töréspontot, utasítja a hibakeresőt, hogy állítsa le a kódfuttatást kivételek esetén.
kivétel töréspontok hasznosak a kód ellenőrzéséhez, amikor kivétel történik. Láthatja, hogy melyik kódsor dobta a kivételt, és ezen a ponton ellenőrizheti a kód értékeit. Néhány kivételt az alkalmazás hibái vagy érvénytelen állapotai okoznak, ezért a kivételek töréspontjai hasznosak a hibák megtalálásához és kijavításához.
így állíthat be egy kivétel töréspontot:
- menj a töréspont navigátorhoz az Xcode-ban, a bal oldali fülek használatával
- kattints a bal alsó
+
-gombra, és válaszd ki a kivétel töréspontot - hagyd az alapértelmezett beállításokat úgy, ahogy vannak (bár ezek hasznosak a testreszabáshoz)
- futtasd a kódod
kivétel dobásakor az alkalmazás végrehajtása leáll. Most már használhatja a hibakeresőt az értékek ellenőrzéséhez, a kód átlépéséhez és az LLDB parancsok használatához. Ha lehetséges, az Xcode arra a kódsorra viszi, amely a kivételt okozta.
ne feledje, hogy egy kivétel nem feltétlenül összeomlik az alkalmazás! Tehát, amikor a kivétel töréspontja engedélyezve van, és kivétel történik, az alkalmazás leáll. A kód megszakítása törésponttal nem ugyanaz, mint egy alkalmazás összeomlása, ezért ne hagyja, hogy ez megzavarja.
például egy kivétel töréspont kap által kiváltott kielégítetlen megszorítások kivétel, de ez nem összeomlik az alkalmazás. Használja a kivétel töréspontot, hogy további információkat gyűjtsön a SIGABRT összeomlásához, majd tiltsa le, miután megoldotta a hibát (amíg újra szükség van rá).
Ismerje meg, hogyan építhet iOS alkalmazásokat
kezdje el az iOS 14 és a Swift 5 használatát
iratkozzon fel az iOS fejlesztői tanfolyamomra, és ismerje meg, hogyan építhet nagyszerű iOS 14 alkalmazásokat a Swift 5 és az Xcode 12 segítségével.
további olvasat
a SIGABRT hiba meglehetősen rejtélyes, és nehéznek bizonyulhat megoldani. Miért nem tud az Xcode csak hasznos hibaüzeneteket adni? Nos, ez egy jó kérdés…
a rövid válasz az, hogy olyan sok mozgó alkatrész van az iOS fejlesztésében, hogy az Xcode nem mindig tudja meghatározni az összeomlás okát. Az Xcode nem tudja, hogy tévesen változtatta meg a konnektor nevét. Csak azt tudja, hogy az aljzat csatlakoztatásakor valamilyen kódot hívtak meg, ami kivételt okozott.
Ez azt jelenti, hogy mindig olyan hibát fog látni, amely a lehető legközelebb áll a kiváltó okhoz. A legjobb, amit tehetünk, hogy sok hibát, visszafejteni sok hibaüzenet, és megismerni őket jobban. És amit megtanultál ebben az oktatóanyagban, az az, hogyan lehet megtalálni és megoldani a SIGABRT hibát!
szeretne többet megtudni? Nézze meg ezeket a forrásokat:
- kezdje el a hibakeresést az Xcode-ban
- az “ismeretlen választó elküldve példánynak” hiba megértése az Xcode-ban
- a “váratlanul talált nulla egy opcionális érték kibontása közben” hiba megértése
- a “megoldatlan azonosító használata” hiba megértése az Xcode-ban
- egyszeri hibák a Swift programozásban
- hibakezelés a Swift-ben a Do-Try-Catch