Wat is EXC_BAD_ACCESS en Hoe het te zuiveren

Op een gegeven moment kom je een crash tegen die veroorzaakt is door EXC_BAD_ACCESS. In deze snelle tip leer je wat EXC_BAD_ACCESS is en waar het door wordt veroorzaakt. Ik zal u ook enkele tips geven om fouten op te lossen die zijn veroorzaakt door EXC_BAD_ACCESS.

1. Wat is EXC_BAD_ACCESS?

Zodra je de onderliggende oorzaak van EXC_BAD_ACCESS begrijpt, kun je de cryptische naam beter begrijpen. Er is een eenvoudige uitleg en een meer technische uitleg. Laten we beginnen met de eenvoudige uitleg eerst.

Keeping It Simple

Wanneer u EXC_BAD_ACCESS tegenkomt, betekent dit dat u een bericht verzendt naar een object dat al is vrijgegeven. Dit is het meest voorkomende scenario, maar er zijn uitzonderingen zoals we in een moment zullen bespreken.

Wat het echt betekent

De technische uitleg is een beetje ingewikkelder. In C en Objective-C, ben je constant bezig met pointers. Een pointer is niets meer dan een variabele die het geheugenadres van een andere variabele opslaat. Wanneer u een bericht naar een object verzendt, moet de aanwijzer die naar het object wijst waarnaar u het bericht verzendt, zijn dereferentie. Dit betekent dat u het geheugenadres neemt waarnaar de aanwijzer wijst en toegang krijgt tot de waarde van dat blok geheugen.

Wanneer die geheugenblok niet langer in kaart wordt gebracht voor uw toepassing of anders gezegd, dat blok geheugen wordt niet gebruikt voor wat u denkt dat het gebruikt is, het is niet langer mogelijk om dat geheugen te benaderen. Wanneer dit gebeurt, verzendt de kernel een uitzondering (EXC), wat aangeeft dat uw toepassing geen toegang heeft tot dat blok geheugen (SLECHTE TOEGANG).

Samengevat, als je EXC_BAD_ACCESS tegenkomt, betekent dit dat je een bericht probeert te verzenden naar een blok geheugen dat dat bericht niet kan uitvoeren.

In sommige gevallen wordt EXC_BAD_ACCESS echter veroorzaakt door een corrupte aanwijzer. Wanneer uw toepassing probeert een corrupte aanwijzer te achterhalen, wordt er door de kernel een uitzondering gegenereerd.

2. Debugging EXC_BAD_ACCESS

Foutopsporing EXC_BAD_ACCESS kan lastig en frustrerend zijn. Nu EXC_BAD_ACCESS echter geen raadsel meer voor u is, moet het minder ontmoedigend zijn.

Het eerste dat u moet begrijpen, is dat uw toepassing niet noodzakelijkerwijs crasht op het moment dat de geheugenblok niet meer toegankelijk is voor uw toepassing. Dat is wat vaak het debuggen van EXC_BAD_ACCESS zo moeilijk maakt.

Hetzelfde geldt voor corrupte aanwijzers. Uw toepassing zal niet crashen omdat een aanwijzer beschadigd is. Het zal ook niet crashen als je een corrupte aanwijzer rondgeeft in je applicatie. Wanneer uw toepassing probeert de corrupte aanwijzer te achterhalen, gaat het echter mis.

zombies

Terwijl zombies de laatste jaren enorm in populariteit zijn toegenomen, zijn ze al meer dan een decennium in Xcode rond. De naam zombie klinkt misschien een beetje dramatisch, maar het is eigenlijk een geweldige naam voor de functie die ons zal helpen bij het debuggen van EXC_BAD_ACCESS. Laat me uitleggen hoe het werkt.

In Xcode kun je zombie-objecten inschakelen, wat betekent dat niet-toegewezen objecten rond worden gehouden als zombies. Anders gezegd, de gealloceerde objecten worden in leven gehouden voor foutopsporingsdoeleinden. Er is geen magie bij betrokken. Als u een bericht naar een zombie-object verzendt, crasht uw toepassing nog steeds als gevolg van EXC_BAD_ACCESS.

Waarom is dit nuttig? Wat ervoor zorgt dat EXC_BAD_ACCESS moeilijk te debuggen is, is dat u niet weet tot welk object uw toepassing toegang probeerde te krijgen. Zombie-objecten lossen dit probleem in veel gevallen op. Door de gealloceerde objecten in leven te houden, kan Xcode u vertellen tot welk object u toegang probeert te krijgen, waardoor het zoeken naar het probleem veel eenvoudiger wordt.

Zombies inschakelen in Xcode is heel eenvoudig. Merk op dat dit kan verschillen afhankelijk van de versie van Xcode die u gebruikt. De volgende aanpak is van toepassing op Xcode 6 en 7. Klik op het actieve schema links bovenaan en kies Bewerk schema.

kiezen Rennen aan de linkerkant en open de Diagnostics tab bovenaan. Schakel het selectievakje in om zombieobjecten in te schakelen Zombie-objecten inschakelen.

Als u nu EXC_BAD_ACCESS tegenkomt, geeft de uitvoer in de console van Xcode u een veel beter idee van waar u uw zoekopdracht wilt starten. Bekijk de volgende voorbeelduitvoer.

2015-08-12 06: 31: 55.501 Debug [2371: 1379247] - [ChildViewController reageertToSelector:] bericht verzonden naar niet-toegewezen instantie 0x17579780

In het bovenstaande voorbeeld vertelt Xcode ons dat een bericht van respondsToSelector: werd naar een zombie-object gestuurd. Het zombieobject is echter niet langer een exemplaar van de ChildViewController klasse. Het geheugenblok dat eerder was toegewezen aan de ChildViewController exemplaar wordt niet meer toegewezen aan uw toepassing. Dit zou u een vrij goed idee moeten geven van wat de oorzaak van het probleem is.

Helaas kunnen zombie-objecten uw dag niet opslaan voor elke crash veroorzaakt door EXC_BAD_ACCESS. Als zombieobjecten het niet doen, dan is het tijd voor een goede analyse.

Analyseren

Als zombieobjecten je probleem niet oplossen, is de oorzaak misschien minder triviaal. In dat geval moet u de code die wordt uitgevoerd, bekijken wanneer uw toepassing vastloopt. Dit kan omslachtig en tijdrovend zijn.

Om u te helpen bij het vinden van problemen in uw codebasis, kunt u Xcode vragen uw code te analyseren om u te helpen problematische gebieden te vinden. Merk op dat Xcode uw project analyseert, wat betekent dat het op elk potentieel probleem wijst dat het tegenkomt.

Om Xcode te vertellen om uw project te analyseren, kiest u Analyseren van Xcode's Artikel menu of druk op Shift-Command-B. Het kost Xcode enkele ogenblikken, maar als het klaar is, ziet u een lijst met problemen in de Geef Navigator uit aan de linkerzijde. Problemen die door de analyse zijn gevonden, worden blauw gemarkeerd.

Wanneer u op een probleem klikt, neemt Xcode u mee naar het codeblok dat uw aandacht vereist. Merk op dat Xcode alleen een suggestie doet. In sommige gevallen is het mogelijk dat het probleem niet relevant is en niet hoeft te worden verholpen.

Als u de fout die EXC_BAD_ACCESS veroorzaakt, niet kunt vinden, is het belangrijk om elk probleem dat Xcode tijdens de analyse van uw project heeft gevonden nauwkeurig te onderzoeken..

Conclusie

EXC_BAD_ACCESS is een veel voorkomende frustratie bij ontwikkelaars en is inherent aan handmatig geheugenbeheer. Problemen met betrekking tot geheugenbeheer zijn minder frequent sinds de introductie van ARC (Automatic Reference Counting), maar ze zijn nog lang niet verdwenen.