Articles

cum se rezolvă eroarea SIGABRT în Xcode

scris de Reinder de Vries pe 6 August 2020 în dezvoltarea aplicațiilor, iOS

cum se rezolvă eroarea SIGABRT în Xcode

un minut aplicația dvs. iOS funcționează bine în Xcode, iar următorul s-a prăbușit fără speranță cu o eroare Sigabrt criptică. Ce se întâmplă!?

în acest tutorial veți învăța:

  • cum se rezolvă eroarea „Signal SIGABRT” în Xcode
  • cum se utilizează unele dintre instrumentele de depanare din Xcode
  • ce înseamnă SIGABRT și care sunt cauzele sale
  • 3 abordări pentru a găsi cauza principală a SIGABRT

gata? Să mergem.

  1. ce înseamnă” fir 1: semnal SIGABRT”?
  2. verificați prizele
  3. verificați Stacktrace
  4. faceți o excepție punct de întrerupere
  5. Lectură suplimentară

ce înseamnă „fir 1: semnal SIGABRT”?

eroarea SIGABRT înseamnă „semnal abort”. Este un semnal trimis de iOS – sistemul de Operare – către o aplicație care rulează, care va părăsi imediat aplicația din cauza unei erori de rulare. Iată cum arată în Xcode:

exemplu de SIGABRT în Xcode

în captura de ecran vedeți câteva lucruri:

  • În stânga vedeți o listă de fire care au rulat când aplicația s-a prăbușit. Vedeți că firul care a provocat accidentul este firul principal sau”firul 1″.
  • în editorul vom vedea că firul temut 1: semnal SIGABRT eroare. A evidențiat linia 12 în editor, definiția clasei AppDelegate.
  • în partea de jos vedeți ieșire de depanare utilă. În acest caz, primiți un stacktrace și un mesaj de eroare criptic despre faptul că nu sunteți „compatibil cu codarea valorii cheie.”

problema cu eroarea SIGABRT este că este prea generică. Xcode spune practic: „uite, aplicația dvs. s-a prăbușit, asta e tot ce știm.”În cele mai multe cazuri de eroare SIGABRT, veți obține puține informații despre ceea ce a cauzat eroarea.

înainte de a continua, să discutăm câteva concepții greșite și capcanele comune ale SIGABRT:

  • eroarea SIGABRT nu are de obicei nimic de-a face cuAppDelegate declarație de clasă, chiar dacă evidențiază acea linie în Xcode. Linia este evidențiată deoarece este prima linie de cod a aplicației. Nu vă pierdeți timpul căutând în clasa AppDelegate, cu excepția cazului în care sunteți absolut sigur că bug-ul este acolo.
  • stacktrace este o listă de apeluri de funcții care duc la blocarea aplicației. Asta nu înseamnă că linia de cod care a provocat eroarea este oriunde în stacktrace. Uneori este, dar în alte cazuri, stacktrace duce doar la codul care a sufocat o valoare pe care ați setat-o în altă parte în propriul cod.
  • nu te uita orb la o eroare SIGABRT. Există o cauză rațională, logică a erorii. Probabil este un bug în propriul cod și nu este nimic în neregulă cu asta. Aplicațiile nu sunt magice, nimeni nu este în afara pentru a te, și bug-uri nu apar din senin. Nu vă frustrați cu gânduri de genul ” a funcționat bine ieri!”- întotdeauna se întâmplă, iar acum nu!

acum că am stabilit o linie de bază, să trecem la prima cauză a SIGABRT.

Aflați cum să construiți Aplicații iOS

începeți cu iOS 14 și Swift 5

Înscrieți-vă la cursul meu de dezvoltare iOS și aflați cum să construiți Aplicații iOS 14 excelente cu Swift 5 și Xcode 12.

verificați prizele

o cauză comună a „Sigabrt-ului semnalului” este o greșeală de scriere sau o eroare în prizele dvs. Iată ce sa întâmplat:

  • ați creat un nou controler de vizualizare în Interface Builder și l-ați configurat cu câteva elemente UI, cum ar fi butoane și etichete
  • ați conectat aceste elemente UI la codul dvs. utilizând proprietățile outlet, care creează o conexiune între o proprietate a controlerului dvs. de vizualizare și elementul UI din Interface Builder
  • la un moment dat ați schimbat numele proprietății outlet inițiale și aplicația dvs. a început să se prăbușească cu o eroare SIGABRT

când utilizați Interface Builder pentru a crea un aplicația va folosi fișierul xib pentru a genera UI controlerului de vizualizare când aplicația rulează (aproximativ vorbind). În acest moment se va conecta, de asemenea, prize de la XIB la proprietățile clasei View controller.

Dacă ați schimbat numele unei proprietăți outlet, aplicația dvs. nu o mai poate găsi. Și din acest motiv va arunca o excepție. Ceea ce cauzează eroarea SIGABRT, nu se ocupă de această excepție.

Iată cum arată în Xcode:

eroare SIGABRT cu prize

vezi ce se întâmplă? Proprietatea se numește otherButton, dar priza este încă numită buton. La un moment dat am schimbat priza – pentru că noul nume este mai bun – și am confundat aplicația, ceea ce a făcut-o să se prăbușească.

în partea de sus a stacktrace mai găsim un indiciu:

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

Ce înseamnă asta? Aplicația ne spune în acest moment că controlerul de vizualizare nu este compatibil cu codarea valorii cheie pentru cheia button. Aceasta înseamnă că nu poate găsi proprietatea button pe controlerul de vizualizare. Și asta e adevărat, pentru că l-am redenumit.

iOS folosește un mecanism numit codificare valoare cheie pentru a inspecta proprietățile pe care le are un controler de vizualizare, astfel încât să poată utiliza aceste proprietăți pentru a face referire la elementele UI pe care le-a creat pe baza XIB.

cum rezolvi problema în acest moment? Puteți utiliza 2 abordări:

  1. redenumiți proprietatea înapoi la numele său original
  2. eliminați conexiunea outlet în Interface Builder și reconectați-o folosind noul nume de proprietate outlet

să mergem mai departe!

sfat rapid: la fel ca un schimbat @IBOutlet poate provoca ” Thread 1: semnal SIGABRT”, deci poate schimba în mod eronat numele unei acțiuni, adică cu @IBAction, provoacă eroarea SIGABRT.

verificați Stacktrace

în multe cazuri, Xcode nu vă va afișa mesaje de eroare utile pentru un accident SIGABRT. Când se întâmplă acest lucru, este util să cunoașteți câteva comenzi de depanare, cum ar fi bt.Xcode are un mediu de depanare integrat numit LLDB. Este ceea ce vedeți în partea de jos a Xcode atunci când rulează aplicația, Consola sau zona de ieșire de depanare. Adesea vedeți mesaje de depanare aici, dar știați că îl puteți folosi și pentru a introduce comenzi?

data viitoare când aplicația se blochează, încercați să tastați help în LLDB. Astfel:

Debugging SIGABRT în consola din Xcode

veți vedea că multe dintre comenzile LLDB corespund direct acțiunilor pe care le puteți efectua cu depanatorul, cum ar fi setarea punctelor de întrerupere, trecerea peste liniile de cod și inspectarea valorilor runtime.

o comandă este deosebit de utilă. Puteți introduce bt pentru a vedea stiva curentă de apeluri (numită și” backtrace „sau”stacktrace”). Aceasta este o listă a tuturor funcțiilor care au funcționat până la accidentul curent. Această urmă include de obicei funcția care a provocat o eroare.

aici, a verifica afară stacktrace de un Index tipic din intervalul de eroare. În captura de ecran de mai jos, am provocat în mod deliberat această eroare obținând index 99 dintr-o matrice care are doar 4 articole. Când aplicația se blochează, bt ne poate spune ce linie de cod a cauzat eroarea.

exemplu de index în afara intervalului

Puteți găsi următoarele informații în stacktrace?

  • codul ofensatoare este la linia 21 de ViewController.swift, în interiorul viewDidLoad() funcția
  • puteți vedea chiar că am folosit indicele „getter” de Array
  • înainte de accident o grămadă de vizualizați apelurile de funcții legate de controler au fost efectuate

pe baza informațiilor pe care le-am obținut cu bt, putem găsi linia ofensatoare în codul nostru și o putem remedia. Xcode ne-a ajutat deja în acest caz, evidențiind eroarea din editor. În unele scenarii nu veți avea un astfel de noroc și atunci poate fi util să utilizați comanda bt.

un ultim lucru: puteți inspecta valorile în timpul rulării cu comanda print. În scenariul de mai sus, Tastarea print names ar fi produs această ieșire:

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

pentru imprimarea obiectelor complexe, utilizați po. Minunat!

rețineți că o stacktrace rulează în exterior. În partea de jos a traseului stivei se afișează apeluri de funcții de nivel superior, iar cu cât stiva este mai mare, cu atât apelurile sunt mai profunde. Cel mai recent, cel mai recent, cel mai profund nivel de apel este în partea de sus a stivei.

faceți o excepție punct de întrerupere

puteți utiliza puncte de întrerupere pentru a opri executarea codului dvs. la o anumită linie. În acel moment, puteți inspecta apoi valori și pas prin funcții.

un punct de întrerupere a excepției este declanșat ori de câte ori apare o excepție în codul dvs. În loc să specificați pe ce linie este declanșat punctul de întrerupere, instruiți depanatorul să oprească executarea codului pentru excepții.

punctele de întrerupere a excepțiilor sunt utile pentru inspectarea codului atunci când apare o excepție. Puteți vedea ce linie de cod a aruncat excepția și puteți inspecta valorile din codul dvs. în acel moment. Unele excepții sunt cauzate de erori sau stări nevalide ale aplicației dvs., astfel încât punctele de întrerupere a excepțiilor sunt utile pentru găsirea și remedierea acestor erori.

Iată cum puteți seta un punct de întrerupere excepție:

  1. du-te la navigator Breakpoint în Xcode, folosind filele din stânga
  2. Faceți clic pe partea din stânga jos +-buton și alegeți excepție Breakpoint
  3. lăsați setările implicite așa cum este (deși acestea sunt utile pentru a personaliza)
  4. rulați codul

excepție Breakpoint

când o excepție este aruncată, executarea aplicației dvs. se oprește. Acum Puteți utiliza depanatorul pentru a inspecta valorile, pentru a parcurge codul și pentru a utiliza comenzile LLDB. Când este posibil, Xcode vă va duce la linia de cod care a cauzat excepția.

rețineți că o excepție nu se blochează neapărat aplicația! Deci, ori de câte ori este activat punctul de întrerupere a excepției și apare o excepție, aplicația dvs. este oprită. Oprirea Codului cu un punct de întrerupere nu este același lucru cu un accident de aplicație, așa că nu lăsați asta să vă confunde.

de exemplu, un punct de întrerupere a excepției va fi declanșat de o excepție de constrângeri nesatisfăcute, dar aceasta nu va bloca aplicația. Utilizați punctul de întrerupere excepție pentru a aduna informații suplimentare pentru accident SIGABRT, și apoi dezactivați-l după ce ați rezolvat bug-ul (până când este necesar din nou).

Aflați cum să construiți Aplicații iOS

începeți cu iOS 14 și Swift 5

Înscrieți-vă la cursul meu de dezvoltare iOS și aflați cum să construiți Aplicații iOS 14 excelente cu Swift 5 și Xcode 12.

lecturi suplimentare

eroarea SIGABRT este destul de criptică și se poate dovedi dificil de rezolvat. De ce Xcode nu poate da doar mesaje de eroare utile? Răspunsul scurt este că există atât de multe părți în mișcare în dezvoltarea iOS, încât Xcode nu poate determina întotdeauna cauza unui accident. Xcode nu știe că ați schimbat în mod eronat numele unei prize. Știe doar că la conectarea prizei a fost invocat un cod și asta a provocat o excepție.

aceasta înseamnă că veți vedea întotdeauna o eroare cât mai aproape de cauza principală. Cel mai bun lucru pe care îl puteți face este să faceți o mulțime de greșeli, să decriptați o mulțime de mesaje de eroare și să le cunoașteți mai bine. Și ceea ce ați învățat în acest tutorial, este cum să găsiți și să rezolvați eroarea SIGABRT!

vrei să afli mai multe? Consultați aceste resurse:

  • începeți cu depanarea în Xcode
  • înțelegerea erorii „selectorului nerecunoscut trimis la instanță” în Xcode
  • înțelegerea erorii „nul găsit neașteptat în timp ce desfaceți o valoare opțională”
  • înțelegerea erorii „utilizarea identificatorului nerezolvat” în Xcode
  • erori Off-By-One în programarea Swift
  • manipularea erorilor în Swift cu Do-Try-Catch