Finder sulkeutui odottamatta. Mutta miksi?
Kaatumisraportit voivat antaa vihjeitä siitä, miksi sovellus kaatui macOS:ssä. Näin ymmärrät, mitä nämä raportit todella sanovat Macistasi.
Olet luultavasti nähnyt Finder-hälytyksen, kun sovellus sulkeutuu odottamatta Macissasi.
Nämä virheet tunnetaan ohjelmointimaailmassa”kaatumisena”. Nämä virheet tapahtuvat yleensä, kun ajetaan huono koodi, jota järjestelmä tai suoritin ei voi suorittaa. Niitä voi tapahtua myös, jos sovellus yrittää käyttää kirjaston tai kehyksen puuttuvaa tai vanhentunutta versiota eikä pysty suorittamaan tarvittavaa koodinpätkää.
Kun macOS näyttää jonkin näistä kaatumisvaroituksista, voit joko napsauttaa Ohita-painiketta tai Ilmoita-painiketta.
Jos napsautat Raportti-painiketta, Finder näyttää ikkunan, jossa on kaatumisraportti ja Lähetä Applelle-painike. Sinun tulee lähettää raportti Applelle, jos se oli Applen ohjelmisto, joka aiheutti virheen.
Jokainen kaatumisraportti tallennetaan.ips-tiedostoon DisagnosticReports-kansiossa käyttäjäkansiossasi osoitteessa/Users/~/Library/Logs/
Voit myös tarkastella ja avata nämä raportit Applen konsolisovelluksessa valitsemalla”Crash Reports”-kohdan konsoli-ikkunan vasemmasta reunasta, valitsemalla raportin ikkunan oikealta puolelta ja napsauttamalla sitten Control-klikkaamalla tai napsauttamalla raporttia hiiren kakkospainikkeella ja valitsemalla”Paljasta Finderissa”ponnahdusvalikosta.
Tämä avaa Finderin DiagnosticReports-kansion ja paljastaa kaikki tallennetut virheraporttitiedostot. MacOS säilyttää näitä raportteja vain rajoitetun ajan, minkä jälkeen se alkaa automaattisesti poistaa vanhimpia raportteja ensin.
Konsolin ponnahdusvalikossa on myös Siirrä roskakoriin-valikkokohta, jos haluat siirtää valitut kaatumisraporttitiedostot roskakoriin.
Jos kaksoisnapsautat.ips-tiedostoa Finderissa, se vain avaa sen uudelleen Console-sovelluksessa. Jos Control-osoitat.ips-tiedostoa Finderissa ja valitset”Open With”ja sitten”TextEdit”ponnahdusvalikosta, voit myös avata.ips-tiedoston TextEditissä.
Huomaa, että jokaisen.ips-tiedostoon tallennetun raportin teksti on JSON-muodossa. , joten sinun on osattava lukea JSON ymmärtääksesi sen.
Kaatumisraporttien lukeminen konsolissa
Jos valitset kaatumisraportin konsolissa joka tapauksessa, voit lukea sen tekstin alla olevasta päätekstiruudusta se:
Katsotaanpa kaatumisraportin muutamaa ensimmäistä kenttää.”Prosessi”UNIXissa tarkoittaa käynnissä olevaa sovellusta. Kentät ovat:
Prosessi-sovelluksen tai prosessin nimi. Polku-missä sovellusbinaari sijaitsee levyllä. Tunniste-yleensä binääri-tai nippunimi, mutta ei aina. Versio-binääriversio vai ??? jos tuntematon. Koodityyppi-Intel tai Apple Silicon.”Universaali”, jos molemmat. Parent Process – binaari tai sovellus, joka käynnisti tämän prosessin. User ID-prosessin UNIX-tunnus tai PID-sama prosessitunnus kuin Terminalissa.
Seuraavaksi meillä on tälle raportille päivämäärä/aika, käyttöjärjestelmäversio, raporttiversio ja yksilöllinen UUID. Siellä on myös yksilöllinen uni-/herätystunnus.
Raportissa luetellaan myös, onko järjestelmän eheyden suojaus käytössä vai ei.
Seuraavaksi raportissa luetellaan tiedot itse kaatumisesta. Nämä tiedot voivat olla melko teknisiä, ja ne on yleensä tarkoitettu ohjelmoijille tai Applelle, jotta voidaan jäljittää, missä ongelma esiintyi sovelluskoodissa, jotta se voidaan korjata.
Yleensä kaatuneen säikeen numero listataan-tässä tapauksessa ensimmäinen säie-säie 0. Ajattele säiettä koodin polkuna, joka kulkee muista koodista riippumatta. Moniytimisissä prosessorijärjestelmissä jokaisessa ytimessä voi olla yksi tai useampi säie, joka toimii tarvittaessa kaikkien ytimien rinnakkain. Tämä tunnetaan rinnakkaislaskentana.
Seuraavaksi luetellaan kaatumisen tai poikkeuksen tyyppi:
Poikkeustyyppi: EXC_CRASH (SIGABRT)
Tässä tapauksessa SIGABRT-UNIX-signaali keskeytettäväksi, tai tappaa, lanka lähetettiin. Signaalit ovat viestejä, joita UNIX lähettää käynnissä oleville prosesseille matalalla tasolla käskeäkseen heitä tekemään jotain-tässä tapauksessa lopettamaan.
Lisätietoja UNIX-signaaleista ja niiden toiminnasta on saatavilla verkossa.
Seuraavaksi ovat mahdolliset poikkeuskoodit, mutta ne ovat usein nollia.
0x ennen jokaista koodia tarkoittaa, että koodin arvo on heksadesimaali tai heksadesimaaliluku. Heksadesimaalilukujärjestelmä on 16 kantalukujärjestelmä – kuusitoista arvoa kymmenen sijaan, kuten desimaalilukujärjestelmässä on. Hex käyttää 0-9 ja sitten A-F lisäarvoina.
Voit lukea kuinka heksadesimaalilukujärjestelmä toimii mistä tahansa hyvästä C-ohjelmointikieltä käsittelevästä kirjasta.
Seuraavaksi tulee irtisanomisen syy, joka on yleensä englanninkielinen kuvaus kaatumisen aiheuttajasta. Tässä tapauksessa”Nimitila DYLD, koodi 1 kirjasto puuttuu”.
DYLD on Dynamic Loader-käyttöjärjestelmän osa, joka lataa dynaamisesti koodin muistiin levyltä, kun se on suoritettava. Voit lukea lisää DYLD:stä Terminalissa kirjoittamalla man dyld ja painamalla Return.
Nimiavaruudet ovat nimeämiskäytäntöjä, joita käytetään joissakin ohjelmointikielissä koodin osien eristämiseen muusta koodista.”Koodi 1-kirjasto puuttuu”tarkoittaa, että DYLD yritti ladata dynaamisesti linkitetyn kirjaston, mutta ei onnistunut.
Ohjelmoinnissa kirjastot ovat koodinippuja. Kirjastot voivat olla joko staattisia (linkitetty sovellukseen koontivaiheessa) tai dynaamisia (ladattu sovellukseen suoritusaikana).
Jos virhe on DYLD-latausvirhe, seuraava rivi kertoo, mikä kirjasto se oli ja missä se sijaitsee levyllä:
“Kirjastoa ei ladattu: @rpath/VBoxRT. dylib”
Tässä tapauksessa VBoxRT.dylib on dynaaminen kirjasto (.dylib) Oraclen Virtual Box-sovellukselle. DYLD etsi dynaamista VBoxRT.dylib-kirjastoa, mutta ei löytänyt sitä, joten sovellus ei voinut toimia ja sille lähetettiin SIGABRT-signaali, joka käski sitä poistumaan.
MacOS:n ja iOS:n sovellukset koostuvat itse asiassa useista osista – yleensä kansiosta nimeltä Bundle
Tässä esimerkissä näemme sovellusbinaarin MacOS-kansion sisällä Sisältö-osion sisällä. kansio sovelluspaketissa:
Siellä on myös Libraries-kansio ja sitten molemmat Apple Silicon-ja Intel x86-kirjastot kansioissa.dylib-muodossa molemmille Mac-alustan arkkitehtuureille. Ne ladataan ajon aikana DYLD:n tarpeen mukaan.
Jotkin sovelluspaketit voivat olla melko yksinkertaisia, toiset hyvin monimutkaisia. Koodia ja muita resursseja voidaan tallentaa muualle, sovelluspakettien ulkopuolelle.
Yllä olevassa esimerkissä.dylib-tiedosto on tallennettu ulkoisesti, ja se ladataan normaalisti tarvittaessa ajon aikana..dylibs ovat yleensä yksittäisiä binaaritiedostoja nippujen sijaan.
IOS-ja macOS for Frameworks-kehyksille on myös tuki, jotka ovat koodia ja muita resursseja sisältäviä paketteja. Voit kurkistaa kehyksiin Finderissa samalla tavalla kuin sovelluspakettien sisään käyttämällä yllä mainittua ponnahdusvalikkoa. Kehyksillä on aina versionumero nipuissaan.
Frameworks voidaan tallentaa sovelluspaketteihin tai kansioon/Library/Frameworks ja/user/~/Library/Frameworks. Suurin osa macOS:stä ja iOS:stä itsestään on toteutettu dynaamisesti ladattavina kehyksinä.
Applella on kehittäjän Framework-ohjelmointiopas, jossa kuvataan yksityiskohtaisesti macOS-ja iOS-koodin lataus-ja sitomisprosessi. Kahden staattisesti liittyvän koodin yhdistämistä kutsutaan linkittämiseksi sitomisen sijaan, ja se tehdään, kun sovellus on rakennettu kääntäjän avulla.
Staattinen koodi ladataan kerralla, mikä voi kuluttaa enemmän järjestelmämuistia.
Applella on myös erillinen kehittäjäasiakirja, joka sisältää yksityiskohtaiset tiedot Objective-C-ja Swift-ajoajat, jotka molemmat sisältävät lisätietoja koodin lataamisesta sovelluksen suorittamisen aikana.
Dynaamisen koodin lataaminen ulottuu aina 1970-luvun lopulle sellaisilla kielillä kuin SmallTalk. Applen alustoilla se johtui siitä, että Apple osti NeXT:n vuonna 1997-ja sen myötä NeXT:n ohjelmointikielen Objective-C, joka oli edelläkävijä dynaamisen linkityksen ja itsetutkiskelu.
NeXTStep Developer – yksi ensimmäisistä kehittäjäpaketteista käytä dynaamista sidontaa.
Tänä päivänä Applen ohjelmistot kirjoitetaan edelleen joko Objective-C:llä tai Applen omalla Swiftillä, joka myös käyttää dynaamista linkitystä ja latausta.
Dynaamisen lataamisen ansiosta sovellusten muistitilaa on pienempi, koska kaikkia sovelluksen koodia ja resursseja ei tarvitse ladata muistiin kerralla. Dynaamisen latauksen haittapuoli on se, että se on joskus hitaampaa, koska resurssit on ladattava levyltä sovelluksen ollessa käynnissä.
Tämä on yksi yleisimmistä syistä pahamaineisen macOS:n pyörivälle rantapallokursorille.
Seuraavaksi virheraportissa meille kerrotaan, mikä kutsuprosessi tai koodibinaari kutsui loukkaavaa koodia, joka on lueteltu kohdassa”Viitattu lähteestä:”. Tässä tapauksessa se oli tärkein VirtualBox-sovellusbinaari, joka oli tallennettu sovelluksen nippuun.
Viimeinen osa englanninkielistä tietoa on”Reason:”, joka yrittää tarjota ihmisen luettavissa olevan syyn, miksi kaatuminen tapahtui:
“‘/usr/lib/VBoxRT.dylib'(ei tällaista tiedostoa, ei dyld-välimuistissa), (suojauskäytäntö ei salli @-polun laajentamista)
(päätetään käynnistyksen yhteydessä; jätä backtrace huomioimatta)”.
Tämä tarkoittaa sitä, että tarvittavan kirjaston olisi pitänyt olla levyllä osoitteessa/usr/lib/VBoxRT.dylib, mutta se ei ollut (enimmäkseen VirtualBox-asennusohjelma laittaa sen sinne asennuksen yhteydessä), DYLD ei ollut ladannut aiemmin se, ja sovellus kuoli käynnistyksen yhteydessä.
Joten yhteenvetona, yllä olevassa esimerkissä VirtualBox käynnistettiin, mutta vaadittiin dynaaminen kirjasto, jota ei löytynyt, joten macOS tappoi sen ja lopetti. Kaikki tiedot kerättiin ja lisättiin kolariraporttiin.
Lisäkonsolin tiedot ja pinojäljet
Muut kaatumisraportin tiedot ovat vieläkin teknisempiä, joten emme mene tässä kaikkiin yksityiskohtiin , mutta joitain asioita voit lukea nopeasti selvittääksesi, mitä tapahtui.
Erityisesti voit seurata sovelluksen koodin suorittamista käänteisessä järjestyksessä kunkin säikeen numeron alla ja etsiäksesi vihjeitä kaatumisen syistä. Kaikki kaatumiset eivät liity puuttuviin kirjastoihin, joten on mahdollista, että sovellus käynnistyi oikein, mutta koodissa oli vain ohjelmointivirhe, joka aiheutti kaatumisen.
Joskus ohjelmoija tekee sen virheen kutsuessaan järjestelmäkoodia, jota ei ole olemassa tai joka on muuttanut sen toimintoparametreja. Tai se voi olla muistin käyttövirhe tai muuttujien päällekirjoittaminen koodissa, jossa on liikaa tietoa, mikä yleensä korvaa jotain viereistä muistissa olevaa tärkeää.
Kaikki nämä virheet voivat aiheuttaa kaatumisen.
Nämä tiedot näkyvät yleensä heti Syy:-osion jälkeen, ja niissä on yleensä luettelo numeroiduista funktiokutsuista, niiden nimet, muistissa olevat osoitteet ja lataustapa. Huomaa, että tässä osiossa haluat lukea funktioluettelon (kutsutaan pinojäljitykseen) käänteisessä järjestyksessä-alhaalta ylöspäin.
Tämä on järjestys, jossa toiminnot todella suoritetaan.
Tässä tapauksessa pino on hyvin lyhyt ja koostuu enimmäkseen DYLD-valmistelu-ja pysäytys-/keskeytyssignaaleista, koska tarvittavaa kirjastoa ei voitu ladata käynnistyksen yhteydessä. Mutta joillakin virheillä voi olla melko monimutkaisia pinoja.
Yleensä viimeinen toiminto pinon yläosassa (päässä) on se, joka aiheutti ongelman – mutta ei aina.
Tämän tietäminen voi olla hyödyllistä kaatumisten diagnosoinnissa, koska pino voi kertoa tarkan funktiokutsun, joka epäonnistui. Voit sitten etsiä toiminnon nimen Applen kehittäjien dokumentaatiosta saadaksesi lisää vihjeitä tapahtuneesta.
Joskus kaatumisfunktion sisältävä kehyksen tai kirjaston nimi luetellaan pinojäljitykseen, mikä antaa vielä enemmän tietoa.
Kaatumisraportin pinolohkon jälkeen on joitakin säiettä koskevia tietoja, jotka eivät ole varsinaisesti tärkeitä, ellet ole kehittäjä, ja sen jälkeen, millä prosessorilla säie toimi, virhekoodi, jos sellainen on, ja Trap-numero. Trapit ovat käyttöjärjestelmän koodin lisäyskohtia, joita kutsutaan, kun jokin tapahtuma tapahtuu.
Kaatumismuisti ja yhteenvedot
Seuraavaksi on tietoja kaatumiseen liittyvistä binaareista (käännetyistä koodeista)-ja nämä ovat yleensä, mutta eivät aina samat tiedot kuin virheraportin yläosassa.
Sen jälkeen on External Modification Summary-yhteenvedot prosessin tunnuksista, jotka olivat vuorovaikutuksessa tämän prosessin kanssa, ja joitain virtuaalimuistin (VM) tietoja siitä, mitkä koodin osat olivat muistissa ja mitkä vielä levyllä. Virtuaalimuisti viittaa levytilaan, jota käyttöjärjestelmä käyttää ikään kuin se olisi todellista RAM-muistia lisätäkseen järjestelmän käyttämää kokonaismuistia.
Sitten on joitakin”aluetyyppi”-tietoja, jotka tiivistävät lisätietoja pinosta, VM:stä, linkki-ja tekstisegmenteistä sekä DYLD:stä ja jaetusta muistista. Voit yleensä jättää nämä tiedot huomioimatta, ellet ole kehittäjä.
Jokaisen kaatumisraportin lopussa on”Täysi raportti”-osio, joka on käytännössä koko.ips-tiedoston täydellinen raaka JSON-vedos tekstimuodossa. Raaka JSON sisältää joitain lisätietoja, joita ei näytetä konsoliikkunassa, kuten Apple Mac-mallin tunnus, suorittimen tyyppi, koodin allekirjoitus ja muita tietoja.
Huomaa myös, että sovelluksessa voi olla käynnissä useita säikeitä, joten jokaiselle säikeelle näytetään yllä olevan kaltainen samanlainen yhteenveto. Mutta yleensä kaatuneen säikeen numero on lueteltu raportin yläosassa, jotta tiedät, mitä säiettä sinun tulee tarkastella.
Kaikki tämä saattaa tuntua ylivoimaiselta uudesta tulokkaasta, mutta kun olet oppinut lukemaan virheraportteja, voit yleensä nopeasti ja helposti selvittää, mitä tapahtui-ja voitko tehdä asialle mitään. Yllä olevassa esimerkissä, koska vaadittu kirjasto puuttui, yksinkertainen sovelluksen uudelleenasentaminen sen asennusohjelman avulla olisi paikallaan.
Apple tarjoaa yksityiskohtaisen konsolin käyttöoppaan verkossa, joka on varsin informatiivinen ja hyödyllinen.