What Er EXC_BAD_ACCESS og hvordan å feilsøke det
26
Del
6
Del
Dette Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.
På ett eller annet tidspunkt, vil du støte på en krasj forårsaket av EXC_BAD_ACCESS. I denne rask spiss, vil du lære hva EXC_BAD_ACCESS er, og hva det skyldes. Jeg vil også gi deg noen tips for å fikse feil som er forårsaket av EXC_BAD_ACCESS.
1. Hva er EXC_BAD_ACCESS?
Når du forstår den underliggende årsaken til EXC_BAD_ACCESS, vil du bedre forstå sin kryptiske navn. Det er en enkel forklaring og en mer teknisk forklaring. La oss starte med den enkle forklaringen først.
Holde det enkelt
Når du støter EXC_BAD_ACCESS, betyr det at du sender en melding til et objekt som allerede har blitt utgitt. Dette er den vanligste scenario, men det finnes unntak som vi vil diskutere i et øyeblikk.
Hva det egentlig betyr
Den tekniske forklaringen er litt mer komplisert. I C og Objective-C, du stadig avtale med pekere. En peker er noe mer enn en variabel som lagrer minnet adressen til en annen variabel. Når du sender en melding til et objekt, den peker som peker på objektet du sender meldingen til behov for å bli dereferenced. Dette betyr at du tar minneadressen pekeren peker til og få tilgang til verdien av denne blokken med minne.
Når denne blokken av minnet er ikke lenger kartlagt for din søknad, eller sagt på en annen måte, at blokk med minne brukes ikke for hva du tror det er brukt, er det ikke lenger mulig å få tilgang til den del av minnet. Når dette skjer, sender kernel et unntak (EXC), noe som indikerer at søknaden din ikke kan få tilgang til blokk med minne (BAD ACCESS).
I sammendraget, når du kjører inn EXC_BAD_ACCESS, betyr det at du prøver å sende en melding til en blokk med minne som ikke kan utføre den meldingen.
I noen tilfeller, men EXC_BAD_ACCESS er forårsaket av en korrupt pekeren. Når søknaden din forsøker å dereference en korrupt peker, er et unntak kastet av kjernen.
2. Debugging EXC_BAD_ACCESS
debugging EXC_BAD_ACCESS kan være vanskelig og frustrerende. Men nå som EXC_BAD_ACCESS ikke lenger er en gåte for deg, bør det være mindre skremmende.
Det første du må forstå er at programmet ikke nødvendigvis krasje øyeblikket blokken med minne er ikke lenger tilgjengelig med søknaden din. Det er det som ofte gjør debugging EXC_BAD_ACCESS så vanskelig.
Det samme gjelder for korrupte pekere. Din søknad vil ikke krasje fordi en peker gikk korrupt. Det vil heller ikke krasje hvis du passerer en korrupt pekeren rundt i programmet. Når din søknad forsøk på å dereference korrupte pekeren, men ting går galt.
Zombies
Mens zombier har fått i popularitet de siste årene, har de vært rundt i Xcode for mer enn et tiår. Navnet zombie høres kanskje litt dramatisk, men det er faktisk et flott navn på funksjonen som kommer til å hjelpe oss debug EXC_BAD_ACCESS. La meg forklare hvordan det fungerer.
I Xcode, kan du aktivere zombie gjenstander, noe som betyr deallocated gjenstander holdes rundt som zombier. Sagt på en annen, blir allokert gjenstander holdt i live for debugging formål. Det er ingen magi involvert. Hvis du sender en melding til en zombie objekt, vil søknaden din fortsatt krasjer som følge av EXC_BAD_ACCESS.
Hvorfor er dette nyttig? Hva gjør EXC_BAD_ACCESS vanskelig å feilsøke er at du ikke vet hva protestere søknaden prøvde å få tilgang. Zombie objekter løse dette problemet i mange tilfeller. Ved å holde deallocated gjenstander i live, kan Xcode fortelle deg hva objektet du prøvde å få tilgang, noe som gjør jakten på problemet som mye enklere.
Aktivere zombier i Xcode er veldig enkelt. Merk at dette kan variere avhengig av hvilken versjon av Xcode som du bruker. Følgende tilnærming gjelder Xcode 6 og 7. Klikk aktiv ordningen i øverst til venstre og velg Rediger Scheme.
Velg Kjør til venstre og åpne Diagnostics fanen øverst. For å aktivere zombie objekter, krysser du merket for Aktiver Zombie Objects.
Hvis du nå kjøre inn EXC_BAD_ACCESS, vil produksjonen i Xcode konsoll gi deg en mye bedre ide om hvor du skal begynne søket. Ta en titt på følgende eksempel utgang
2015-08-12 06: 31: 55,501 Debug [2 371: 1379247] - [ChildViewController respondsToSelector:]. Melding sendt til deallocated eksempel 0x17579780
I eksempelet ovenfor, er Xcode forteller oss at et budskap om respondsToSelector: ble sendt til en zombie objekt. Imidlertid er zombie objektet ikke lenger en forekomst av ChildViewController klassen. Blokken minne som tidligere ble bevilget til ChildViewController eksempel ikke lenger er kartlagt for søknaden din. Dette bør gi deg en ganske god idé om hva årsaken til problemet er.
Dessverre, vil zombie gjenstander ikke være i stand til å redde dagen for hver krasj forårsaket av EXC_BAD_ACCESS. Hvis zombie gjenstander ikke gjøre triks, så er det tid for noen riktig analyse.
Analyser
Hvis zombie objektene ikke løser problemet ditt, så årsaken kan være mindre trivielt. I så fall må du ta en nærmere titt på koden som blir henrettet når programmet krasjer. Dette kan være tungvint og tidkrevende.
For å hjelpe deg med å finne problemer i kodebasen, kan du be Xcode å analysere koden din for å hjelpe deg å finne problemområder. Merk at Xcode analyserer prosjektet, noe som betyr at det vil påpeke alle potensielle problem den støter på.
For å fortelle Xcode å analysere prosjektet, velger Analyser fra Xcode Product menyen eller trykker på Skift-Kommando-B. Det vil ta Xcode en liten stund, men når den er ferdig skal du se en liste over problemer i Emisjonen Navigator til venstre. Problemer som ble funnet ved analysen er uthevet i blått.
Når du klikker et problem, tar Xcode du til blokken med kode som trenger din oppmerksomhet. Merk at Xcode er bare å lage et forslag. I noen tilfeller er det mulig at problemet ikke er relevant, og trenger ikke å fikse.
Hvis du ikke kan finne feilen som forårsaker EXC_BAD_ACCESS, så er det viktig å nøye granske hver utgave Xcode funnet under analyse av prosjektet.
Konklusjon
EXC_BAD_ACCESS er en felles frustrasjon blant utviklere, og det er noe som er iboende til manuell minnehåndtering. Problemstillinger knyttet til minnehåndtering har blitt sjeldnere siden innføringen av ARC (Automatic Reference Counting), men de har på ingen måte forsvunnet.