Articles

Jak Vyřešit SIGABRT Chyba v Xcode

Napsal Reinder de Vries 6. srpna 2020, Vývoj Aplikací, iOS

Jak Vyřešit SIGABRT Chyba v Xcode

Jedna minuta vaše iOS app běží v pohodě v Xcode, a další to má beznadějně havaroval s cryptic SIGABRT chyba. Co se děje!?

v tomto tutoriálu se dozvíte:

  • Jak vyřešit „Signálu SIGABRT“ chyba v Xcode
  • Jak používat některé nástroje pro ladění v Xcode
  • Co SIGABRT stojí za to, a jaké jsou jeho příčiny jsou
  • 3 přístupy k najít příčinu SIGABRT

jste Připraveni? Jdeme.

  1. co znamená „vlákno 1: Signal SIGABRT“?
  2. zkontrolujte zásuvky
  3. zkontrolujte Stacktrace
  4. udělejte výjimku zarážku
  5. další čtení

co znamená „vlákno 1: Signal SIGABRT“?

chyba SIGABRT znamená „přerušení signálu“. Je to signál, který odesílá operační systém iOS do spuštěné aplikace, která aplikaci okamžitě ukončí kvůli chybě runtime. To v podstatě znamená, že vaše aplikace havaroval…

Zde je, jak to vypadá v Xcode:

Příklad SIGABRT v Xcode

na obrázku vidíte několik věcí:

  • Na levé straně vidíte seznam vláken, která běžela, kdy app havaroval. Vidíte, že vlákno, které způsobilo havárii, je hlavní vlákno nebo „vlákno 1“.
  • v editoru vidíme obávaný Podproces 1: signal SIGABRT error. V editoru je zvýrazněn řádek 12, definice třídy AppDelegate.
  • v dolní části vidíte užitečný výstup ladění. V tomto případě se zobrazí stacktrace a kryptická chybová zpráva o tom, že není kompatibilní s kódováním klíčových hodnot.“

problém s chybou SIGABRT je, že je příliš obecný. Xcode v podstatě říká: „Podívej, vaše aplikace havarovala ,to je vše, co víme.“Ve většině případů chyby SIGABRT získáte jen málo informací o tom, co způsobilo chybu.

Než budeme pokračovat, pojďme diskutovat o některé mylné představy a časté úskalí SIGABRT:

  • SIGABRT chybě obvykle nemá nic společného s AppDelegate deklarace třídy, i když zdůrazňuje, že řádek v Xcode. Řádek je zvýrazněn, protože je to první řádek kódu vaší aplikace. Neztrácejte čas hledáním ve třídě AppDelegate, pokud si nejste naprosto jisti, že je tam chyba.
  • stacktrace je seznam volání funkcí, které vedou k pádu aplikace. To neznamená, že řádek kódu, který způsobil chybu, je kdekoli v stacktrace. Někdy je, ale v jiných případech, stacktrace vede pouze k kódu, který se udusil hodnotou, kterou jste nastavili jinde ve svém vlastním kódu.
  • nedívejte se slepě na chybu SIGABRT. Existuje racionální, logická příčina chyby. Je to pravděpodobně chyba ve vašem vlastním kódu a na tom není nic špatného. Aplikace nejsou magie, nikdo je ven, aby vás, a chyby nikdy objeví z ničeho nic. Nenechte se frustrovat myšlenkami jako “ včera to fungovalo dobře!“- vždycky to dělá, a teď to není!

Nyní, když jsme vytvořili základní linii, pojďme k první příčině SIGABRT.

Naučte se, jak vytvořit iOS aplikace

začínáme s iOS 14 a Swift 5

Přihlásit se na můj iOS vývoj kurzu a naučte se, jak vytvořit skvělé iOS 14 aplikace s rychlým Xcode 5 a 12.

Zkontrolujte, zda Vaše Zásuvky

častou příčinou „Signálu SIGABRT“ je překlep nebo chyba v prodejnách. Tady je to, co se stalo:

  • vytvořil nový view controller v Interface Builder, a postavil jej s několika prvky uživatelského ROZHRANÍ, jako jsou tlačítka a štítky
  • Jste připojeni tyto prvky uživatelského ROZHRANÍ, aby se váš kód pomocí zásuvky, vlastnosti, který vytváří spojení mezi vlastnosti zobrazení správce a uživatelské ROZHRANÍ prvek v Interface Builder
  • V jednu chvíli jste změnili název z původní zásuvky majetek a své aplikace začala shazovat s SIGABRT chyba

Pokud používáte Interface Builder vytvořit view controller, vaše aplikace bude používat XIB soubor pro generování view controller UI když aplikace běží (zhruba řečeno). V tomto okamžiku také připojí vývody z XIB k vlastnostem třídy view controller.

Pokud jste změnili název outletové vlastnosti, vaše aplikace ji již nemůže najít. A kvůli tomu bude házet výjimku. Co způsobuje chybu SIGABRT, není zpracování této výjimky.

zde je to, co vypadá v Xcode:

chyba SIGABRT s vývody

podívejte se, co se děje? Vlastnost se nazývá otherButton, ale zásuvka se stále nazývá tlačítko. V jednu chvíli jsme změnili zásuvky – protože nový název je lepší – a zmatená aplikace, což je pád.

v horní části stacktrace také vidíme další vodítko:

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

Co to znamená? Aplikace nám v tomto bodě říká, že řadič zobrazení není kompatibilní s kódováním klíčových hodnot pro klíč button. To znamená, že v řadiči zobrazení nemůže najít vlastnost button. A to je pravda, protože jsme to přejmenovali.

iOS používá mechanismus nazvaný klíč-hodnota kódování zkontrolujte vlastnosti zobrazení správce má, takže je možné použít tyto vlastnosti pro referenční prvky uživatelského ROZHRANÍ vytvořil na základě XIB.

jak vyřešíte chybu v tomto bodě? Můžete použít 2 způsoby:

  1. přejmenování majetek zpět do své původní jméno
  2. vyjměte zásuvky připojení v Interface Builder, a znovu připojit pomocí nového výstupu název vlastnosti

Pojďme dál!

rychlý Tip: stejně jako změněný @IBOutlet může způsobit “ vlákno 1: sigabrt“, takže může chybně změnit název akce, tj. s @IBAction, způsobit chybu SIGABRT.

Zkontrolujte Stacktrace

V mnoha případech Xcode nebude vám ukázat žádné užitečné chybové zprávy pro SIGABRT havárii. Když k tomu dojde, je užitečné znát několik ladicích příkazů, například bt.

Xcode má integrované ladicí prostředí zvané LLDB. To je to, co vidíte v dolní části Xcode při spuštění aplikace, konzole nebo ladění výstupní oblasti. Často zde vidíte ladicí zprávy, ale věděli jste, že je můžete také použít k zadávání příkazů?

při příštím zhroucení aplikace zkuste zadat help v LLDB. Jako toto:

Ladění SIGABRT v Konzole v Xcode

uvidíte, že mnoho z LLDB příkazy přímo odpovídají kroky, které můžete vzít s ladicí program, jako je nastavení breakpointů, krokování přes řádky kódu a kontrola runtime hodnoty.

jeden příkaz je obzvláště užitečný. Můžete zadat bt pro zobrazení aktuálního zásobníku hovorů (nazývaného také „backtrace“ nebo „stacktrace“). Toto je seznam všech funkcí, které běžely až do aktuálního selhání. Tato stopa obvykle zahrnuje funkci, která způsobila chybu.

zde se podívejte na stacktrace typické chyby indexu mimo rozsah. Na obrázku níže jsme tuto chybu úmyslně způsobili získáním indexu 99 z pole, které má pouze položky 4. Když aplikace havaruje, bt nám může říct, který řádek kódu způsobil chybu.

příklad indexu mimo rozsah

můžete v stacktrace najít následující informace?

  • problematický kód je na řádku 21 ViewController.swift, uvnitř viewDidLoad() funkce
  • můžete dokonce vidět, že jsme použili index „kariérista“ Array
  • Před nehodou spoustu view controller-související funkce byly hovory

na Základě informací, máme s bt, můžeme najít problematický řádek v kódu a opravit ji. Xcode nám již v tomto případě pomohl zvýrazněním chyby v editoru. V některých scénářích nebudete mít takové štěstí a pak může být užitečné použít příkaz bt.

poslední věc: můžete zkontrolovat hodnoty za běhu pomocí příkazu print. Ve výše uvedeném scénáři, psaní print names by produkoval tento výstup:

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

Pro tisk složitých objektů, používání po. Úžasné!

mějte na paměti, že stacktrace běží mimo-in. Spodní část stopy zásobníku zobrazuje volání funkcí nejvyšší úrovně a čím vyšší je zásobník, tím hlubší jsou hovory. Poslední, poslední, nejhlubší volání je v horní části zásobníku.

Vytvořte zarážku výjimky

zarážky můžete použít k zastavení provádění kódu na určitém řádku. V tomto okamžiku pak můžete kontrolovat hodnoty a procházet funkcemi.

bod přerušení výjimky se spustí vždy, když se ve vašem kódu vyskytne výjimka. Místo toho, abyste určili, na kterém řádku je spuštěn bod přerušení, nařídíte debuggeru, aby zastavil provádění kódu pro výjimky.

zarážky výjimek jsou užitečné pro kontrolu kódu, pokud dojde k výjimce. Můžete vidět, který řádek kódu hodil výjimku, a v tomto okamžiku můžete zkontrolovat hodnoty v kódu. Některé výjimky jsou způsobeny chybami nebo neplatnými stavy vaší aplikace, takže zarážky výjimek jsou užitečné pro nalezení a opravu těchto chyb.

zde je návod, jak nastavit zarážku výjimky:

  1. Jdi na bod Přerušení navigator v Xcode, pomocí záložek na levé straně
  2. Klepněte na tlačítko na levé dolní +-tlačítko a vyberte Výjimkou Zarážku
  3. Ponechte výchozí nastavení tak, jak je (i když jsou užitečné přizpůsobit)
  4. Spuštění kódu

Výjimkou Zarážku

Když je vyvolána výjimka, provádění vaší aplikace zastaví. Nyní můžete pomocí debuggeru kontrolovat hodnoty, procházet kódem a používat příkazy LLDB. Pokud je to možné, Xcode vás přenese na řádek kódu, který způsobil výjimku.

mějte na paměti, že výjimka nemusí nutně havarovat vaši aplikaci! Takže kdykoli je povolen bod přerušení výjimky a dojde k výjimce, aplikace se zastaví. Zastavení kódu s bodem přerušení není stejné jako selhání aplikace, takže se nenechte zmást.

například bod přerušení výjimky se spustí neuspokojenou výjimkou omezení, ale to vaši aplikaci nezhroutí. Použití výjimkou zarážky shromažďovat další informace pro SIGABRT havárie, a pak to vypnout poté, co jste vyřešili chybu (dokud je to potřeba znovu).

Naučte se, jak vytvořit iOS aplikace

začínáme s iOS 14 a Swift 5

Přihlásit se na můj iOS vývoj kurzu a naučte se, jak vytvořit skvělé iOS 14 aplikace s rychlým Xcode 5 a 12.

další čtení

chyba SIGABRT je poměrně záhadná a může být obtížně vyřešitelná. Proč nemůže Xcode poskytnout užitečné chybové zprávy? No, to je dobrá otázka…

krátká odpověď je, že ve vývoji iOS je tolik pohyblivých částí, že Xcode nemůže vždy určit příčinu havárie. Xcode neví, že jste omylem změnili název zásuvky. Ví pouze, že při připojení zásuvky byl vyvolán nějaký kód, který způsobil výjimku.

to znamená, že se vždy zobrazí chyba, která je co nejblíže hlavní příčině. Nejlepší, co můžete udělat, je udělat spoustu chyb, dešifrovat spoustu chybových zpráv a lépe je poznat. A to, co jste se naučili v tomto tutoriálu, je, jak najít a vyřešit chybu SIGABRT!

Chcete se dozvědět více? Podívejte se na tyto zdroje:

  • začínáme s Ladění v Xcode
  • Porozumění „Nerozpoznaný Přepínač Poslal do Stupně“ Chyba V Xcode
  • Porozumění „Nečekaně našel nulová, zatímco rozbaloval Volitelná hodnota“ Chyba
  • Porozumění „Využití Nevyřešených Identifikátor“ Chyba V Xcode
  • Off-By-One Chyby V rychlém Programování
  • Zpracování chyb V Swift S-Try-Catch