Articles

How to Solve Sigabrt Error in Xcode

Written by Reinder de Vries on August 6 2020 In App Development, iOS

How to Solve SIGABRT Error in Xcode

One minute your iOS app runs fine in Xcode, and the next it has hopelessly crashed Kryptisellä SIGABRT-virheellä. Mitä on tekeillä??

tässä opetusohjelmassa opit:

  • miten ratkaista ”Signal SIGABRT” – virhe xcodessa
  • miten käyttää joitakin vianetsintätyökaluja xcodessa
  • mitä SIGABRT tarkoittaa, ja mitkä ovat sen syyt
  • 3 lähestymistapaa sigabrtin perussyyn löytämiseksi

valmis? Mennään.

  1. mitä tarkoittaa ”säie 1: signaali SIGABRT”?
  2. Tarkista myyntipisteesi
  3. Tarkista Stacktrace
  4. tee poikkeuksen Katkaisupiste
  5. lisätietoja

mitä ”säie 1: signaali SIGABRT” tarkoittaa?

virhe SIGABRT tulee sanoista ”signal abort”. Se on signaali, jonka iOS – Käyttöjärjestelmä – lähettää käynnissä olevalle sovellukselle, joka lopettaa sovelluksen välittömästi ajonaikavirheen vuoksi. Se tarkoittaa käytännössä sitä, että sovelluksesi on kaatunut…

tässä on miltä se näyttää xcodessa:

esimerkki Sigabrtista xcodessa

kuvakaappauksessa näet muutaman asian:

  • vasemmalla näet listan säikeistä, jotka juoksivat sovelluksen kaatuessa. Näet, että lanka, joka aiheutti törmäyksen, on pääkierre eli ”Lanka 1”.
  • editorissa näkyy tuo pelätty säie 1: signal SIGABRT-virhe. Se on korostanut editorissa riviä 12, luokkamääritelmää AppDelegate.
  • alareunassa näet hyödyllisen debug-tulosteen. Tässä tapauksessa, saat stacktrace ja kryptinen virheilmoitus siitä, että ei ole ”key value coding-yhteensopiva.”

sigabrt-virheen ongelma on, että se on liian yleinen. Xcode sanoo periaatteessa: ”katso, sovelluksesi on kaatunut, siinä kaikki mitä tiedämme.”Useimmissa sigabrt-virheen tapauksissa saat vain vähän tietoa siitä, mikä virheen on aiheuttanut.

ennen kuin jatkamme, keskustellaan muutamasta harhaluulosta ja sigabrtin yleisistä sudenkuopista:

  • SIGABRTIN virheellä ei yleensä ole mitään tekemistä AppDelegate luokkajulistuksen kanssa, vaikka se tuokin xcodessa esiin tuon linjan. Rivi on korostettu, koska se on ensimmäinen rivi koodin sovelluksen. Älä tuhlaa aikaasi katsomalla AppDelegate luokkaa, ellet ole aivan varma, että vika on siellä.
  • stacktrace on luettelo funktiopuheluista, jotka johtavat sovelluksen kaatumiseen. Se ei tarkoita, että virheen aiheuttanut koodirivi olisi missään stacktracessa. Joskus se on, mutta toisissa tapauksissa stacktrace johtaa vain koodiin, joka tukehtui arvoon, jonka asetit muualle omaan koodiisi.
  • älä tuijota itseäsi sokeana sigabrt-virheeseen. Virheelle on järkevä ja looginen syy. Se on varmaan vika omassa koodissa, eikä siinä ole mitään vikaa. Sovellukset eivät ole taikuutta, kukaan ei ole ulos sinua, ja vikoja ei koskaan näy tyhjästä. Älä turhauta itseäsi ajatuksilla, kuten ” se juoksi hyvin eilen!”- niin käy aina,ja nyt ei!

nyt kun lähtötilanne on selvinnyt, siirrytään SIGABRT: n ensimmäiseen syyhyn.

Opi rakentamaan iOS-sovelluksia

Aloita iOS 14 ja Swift 5

Ilmoittaudu iOS development courselle, ja Opi rakentamaan suuria iOS 14-sovelluksia Swift 5: llä ja Xcode 12: lla.

Tarkista myyntipisteesi

yleinen ”Signal SIGABRTIN” syy on kirjoitusvirhe tai vika myyntipisteissäsi. Näin kävi:

  • loit uuden näkymäohjaimen Interface Builderissa ja asetit sen muutamilla KÄYTTÖLIITTYMÄELEMENTEILLÄ, kuten painikkeilla ja etiketeillä
  • liitit nämä käyttöliittymäelementit koodiisi käyttämällä outlet-ominaisuuksia, jotka luovat yhteyden näkymäohjaimen ominaisuuden ja Käyttöliittymäelementin välille Interface Builderissa
  • yhdessä vaiheessa muutit alkuperäisen outlet-ominaisuuden nimen ja sovelluksesi alkoi kaatua SIGABRT-virheellä
  • Kun käytät Interface Builderia luodaksesi näkymäohjaimen, sinun sovellus käyttää xib-tiedostoa luodakseen näkymäohjaimen käyttöliittymän kun sovellus toimii (karkeasti ottaen). Tässä vaiheessa se myös yhdistää pistorasiat alkaen XIB ominaisuuksia view-ohjain Luokka.

    Jos olet vaihtanut outlet-ominaisuuden nimen, sovelluksesi ei löydä sitä enää. Ja siksi se heittää poikkeus. Sigabrt-virhe johtuu poikkeuksen käsittelemättä jättämisestä.

    Here ’ s what that looks like in Xcode:

    SIGABRT error with outlets

    See what ’ s happening? Kiinteistön nimi on otherButton, mutta pistorasiaa kutsutaan edelleen buttoniksi. Yhdessä vaiheessa vaihdoimme pistorasiaa – koska uusi nimi on parempi-ja sekoitimme sovelluksen, mikä sai sen kaatumaan.

    stacktracen huipulta löytyy myös toinen vihje:

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

    Mitä se tarkoittaa? Sovellus kertoo tässä vaiheessa, että näkymäohjain ei ole avainarvon koodaus yhteensopiva avaimen button. Tämä tarkoittaa sitä, että se ei löydä näkymäohjaimesta ominaisuutta button. Ja se on totta, koska olemme nimenneet sen uudelleen.

    iOS käyttää key value coding-nimistä mekanismia tarkastaakseen näkymäohjaimen ominaisuudet, joten se voi käyttää näitä ominaisuuksia viitatakseen KÄYTTÖLIITTYMÄELEMENTTEIHIN, jotka se on luonut XIB: n pohjalta.

    miten vika ratkaistaan tässä vaiheessa? Voit käyttää 2 lähestymistapaa:

    1. nimeät ominaisuuden takaisin alkuperäiseen nimeensä
    2. poistat outlet-yhteyden Interface Builderissa ja yhdistät sen uudelleen käyttämällä uutta outlet-ominaisuuden nimeä

    mennään eteenpäin!

    Pikavihje: Just as a changed @IBOutlet can cause ” Thread 1: signal SIGABRT”, eli voi virheellisesti muuttaa toiminnon nimeä, eli @IBAction, aiheuttaa SIGABRT-virheen.

    Tarkista Stacktrace

    monissa tapauksissa Xcode ei näytä hyödyllisiä virheilmoituksia sigabrt-kaatumisesta. Silloin on hyödyllistä tietää muutama virheenkorjauskomento, kuten bt.

    Xcodessa on integroitu vianetsintäympäristö LLDB. Se mitä näet alareunassa Xcode kun sovellus toimii, konsoli tai debug tulostusalue. Näet täällä usein debug-viestejä, mutta tiesitkö, että voit käyttää sitä myös komentojen syöttämiseen?

    seuraavan kerran kun sovellus kaatuu, kokeile kirjoittaa help lldb: ssä. Näin:

    Vianetsintä Sigabrt konsolissa Xcode

    näet, että monet LLDB-komennot vastaavat suoraan toimintoja, joita voit tehdä vianetsintätyökalulla, kuten keskeytyspisteiden asettamista, koodirivien ylittämistä ja ajonaikaisten arvojen tarkastamista.

    yksi komento on erityisen hyödyllinen. Voit kirjoittaa bt nähdäksesi nykyisen kutsupinon (kutsutaan myös nimellä” backtrace ”tai”stacktrace”). Tämä on luettelo kaikista toiminnoista, jotka kestivät nykyiseen kaatumiseen asti. Tämä jälki sisältää tyypillisesti vian aiheuttaneen toiminnon.

    Katso tästä tyypillisen indeksin vaihteluvälin ulkopuolisen virheen stacktrace. Alla olevassa kuvakaappauksessa olemme tarkoituksella aiheuttaneet kyseisen virheen saamalla indeksin 99 joukosta, jossa on vain 4 kohdetta. Kun sovellus kaatuu, bt voi kertoa, mikä koodirivi aiheutti virheen.

    Example of index out of range

    voitko bongata stacktracesta seuraavat tiedot?

    • rikkonainen koodi on ViewController.swift, sisällä viewDidLoad() funktio
    • voit jopa nähdä, että käytimme Array
    • ennen kaatumista kokonaisen joukon näkymäohjaimeen liittyvistä funktiopuheluista

    bt saamiemme tietojen perusteella voimme löytää häirintärivin koodistamme ja korjata sen. Xcode auttoi meitä jo tässä tapauksessa korostamalla editorin virhettä. Joissakin skenaarioissa sinulla ei ole tällaista onnea, ja silloin voi olla hyödyllistä käyttää bt – komentoa.

    vielä yksi asia: arvoja voi tarkastaa suoritettaessa komennolla print. Yllä olevassa skenaariossa kirjoittamalla print names olisi saatu tämä tuloste:

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

    painettaessa kompleksisia esineitä, Käytä po. Mahtavaa!

    muista, että stacktrace kulkee ulko-in. Pinon alareunassa näkyy ylätason funktiokutsuja, ja mitä ylemmäs pinoon mennään, sitä syvemmälle puhelut menevät. Viimeisin, tuorein, syvimmän tason puhelu on pinon yläpäässä.

    tee poikkeuksen raja-arvo

    voit käyttää raja-arvoja pysäyttääksesi koodin suorittamisen tietyllä rivillä. Siinä vaiheessa voit sitten tarkastaa arvot ja astua toimintojen läpi.

    poikkeuksen raja-arvo aktivoituu aina, kun koodissa tapahtuu poikkeus. Sen sijaan, että määrittäisit, millä rivillä keskeytyspiste laukeaa, ohjaat vianetsintätyökalua pysäyttämään koodin suorittamisen poikkeusten varalta.

    poikkeuksen raja-arvot ovat hyödyllisiä koodin tarkastamisessa poikkeuksen tapahtuessa. Näet, mikä koodirivi heitti poikkeuksen, ja voit tarkastaa koodisi arvot siinä vaiheessa. Jotkin poikkeukset johtuvat sovelluksesi vioista tai virheellisistä tiloista, joten poikkeuksen keskeytyspisteet ovat hyödyllisiä kyseisten vikojen löytämisessä ja korjaamisessa.

    Näin voit asettaa poikkeuksen keskeytyspisteen:

    1. Siirry keskeytyspisteen navigaattoriin xcodessa käyttämällä vasemmalla olevia välilehtiä
    2. klikkaa alavasemmasta +-painiketta ja valitse poikkeuksen keskeytyspiste
    3. jätä oletusasetukset sellaisiksi kuin-on (vaikka niitä on hyödyllistä muokata)
    4. Suorita koodi

    Exception Breakpoint

    kun poikkeus heitetään, sovelluksen suoritus pysähtyy. Voit nyt käyttää debuggeria arvojen tarkastamiseen, koodin läpikäymiseen ja LLDB-komentojen käyttämiseen. Jos mahdollista, Xcode vie sinut koodiriville, joka aiheutti poikkeuksen.

    muista, että poikkeus ei välttämättä kaada sovellustasi! Niin, aina kun poikkeus keskeytyspiste on käytössä, ja poikkeus tapahtuu, sovellus pysäytetään. Koodin pysäyttäminen keskeytyspisteellä ei ole sama asia kuin sovelluksen kaatuminen, joten älä anna sen hämmentää sinua.

    esimerkiksi poikkeuksen keskeytyspisteen laukaisee tyydyttämättömät rajoitteet-poikkeus, mutta se ei kaada sovellustasi. Käytä poikkeuksen keskeytyspistettä kerätäksesi lisätietoja sigabrt-kaatumisesta ja poista se käytöstä, kun olet ratkaissut vian (kunnes sitä tarvitaan uudelleen).

    Opi rakentamaan iOS-sovelluksia

    Aloita iOS 14 ja Swift 5

    Ilmoittaudu iOS development courselle, ja Opi rakentamaan suuria iOS 14-sovelluksia Swift 5: llä ja Xcode 12: lla.

    Jatkoluku

    Sigabrt-virhe on melko arvoituksellinen ja voi osoittautua vaikeaksi ratkaista. Miksi Xcode ei voi vain antaa hyödyllisiä virheilmoituksia? No, se on hyvä kysymys…

    lyhyt vastaus on, että iOS-kehityksessä on niin paljon liikkuvia osia, että Xcode ei aina pysty selvittämään kaatumisen syytä. Xcode ei tiedä, että muutit virheellisesti pistorasian nimen. Se tietää vain, että pistorasian liittämisessä vedottiin johonkin koodiin, ja se aiheutti poikkeuksen.

    tämä tarkoittaa, että näet aina virheen, joka on mahdollisimman lähellä perussyytä. Parasta, mitä voit tehdä, on tehdä paljon virheitä, purkaa paljon virheilmoituksia ja tutustua niihin paremmin. Ja mitä olet oppinut tässä opetusohjelmassa, on miten löytää ja ratkaista SIGABRT virhe!

    Haluatko oppia lisää? Check out these resources:

    • Aloita virheenkorjaus xcodessa
    • ymmärtäminen ”tunnistamaton valitsin lähetetty instanssiin” virhe Xcodessa
    • ymmärtäminen ”yllättäen löytynyt nolla, kun avaat valinnaisen arvon” virhe
    • ymmärtäminen ”ratkaisemattoman tunnisteen käyttö” virhe Xcodessa
    • Off-By-One-virheet Swift-ohjelmoinnissa
    • Virheiden käsittely Swiftissä Do-Try-Catch