wat te doen met een Segmentatiefout 11
om de een of andere reden besloot ik een product te bouwen met gewoon C. Als het doel code-efficiëntie was, was het een ramp. Maar als een hulpmiddel voor persoonlijke groei, denk ik dat ik veel meer heb geleerd over programmeren in het proces.
bijvoorbeeld, Ik weet nu meer precies waarom een python woordenboek en een lijst zich anders gedragen, en wat het echt betekent om “door referentie te gaan.”
echter, als er één barrière was waardoor ik nooit meer terug zou willen naar C, zou het de gevreesde “Segmentation Fault 11” zijn, op de voet gevolgd door “Abort Trap 6.”
deze twee fouten treden op tijdens de looptijd, waardoor ze moeilijk te debuggen zijn. XCode, Eclipse of andere debugging tools zijn echt nuttig, maar ik heb geleerd dat het veel belangrijker om te leren wat deze dingen zijn en komen met procedures om het debuggen proces aan te pakken. Dit zijn gewoon mijn notities over mijn eigen veel voorkomende fouten. Ik hoop dat dit een probleemoplossing lijst voor iedereen die zijn eigen problemen. Ik wil op zijn minst mijn stomme problemen dekken, zodat je je kunt concentreren op echte codeerproblemen.
een segmentatiefout betekent dat uw programma probeerde toegang te krijgen tot iets wat het niet had mogen doen. Dat is een deel van het probleem. Er zijn vele redenen waarom een programma toegang kan krijgen tot dingen die niet verondersteld worden, maar gecompileerde code zegt eigenlijk gewoon “#$ # @^*&!” daarvan. Als je erover nadenkt, zou je niet aan iemand willen uitleggen waarom ze je op een gevoelige plek steken je kwaad maakt. Je wilt gewoon dat ze ermee ophouden. Gelukkig zijn computers dom en verrassend geduldig na ongeveer 75 jaar engineering. Ze zullen blijven sturen Seg fouten, maar (meestal) zal niet stoppen met vrienden na het gebeurt de 1000e keer.
Wat is Abort Trap?
Het is niet zo veel anders. Ergens zei je computer tegen zichzelf om het programma af te breken. Nogmaals, niet erg behulpzaam. Het komt echter meestal voor als u iets probeert te doen als toegang tot string
van een tekenreeks met twee karakters "nw"
of onvoldoende geheugen toewijzen char string
voor een tekenreeks of array zoals "way"
.
Wat moet u doen met een Seg-fout?
de tutorials die ik lees hebben de neiging om zich te concentreren op het gebruik van foutopsporing tools zoals lldb, gdb en ga zo maar door. Dat is allemaal prima en dandy. Ja, voer eerst gcc -g
uit en daarna lldb executable_name
en vervolgens run -flag1 -flag2
om te zien of dat u helpt het uit te zoeken. Maar soms is er helemaal geen hulp. Ik heb wel een lijst met dingen om te controleren.
- Controleer of de benodigde globale variabelen van het programma waarden hebben. Dit gebeurde vooral omdat ik vlaggen die in een bos van waarden die nodig zijn om te worden ingesteld voor het uitvoeren had gemaakt. Maar wat als ze er niets in doen? Seg Breuk 11! Er waren een aantal keren dat ik *dacht* vars waren ingesteld als ze niet waren en dat gemaakt voor uitdagende bugs. Beter nog, probeer globals tot een limiet te houden, zodat ze gemakkelijker te volgen zijn.
- malloc is zowel je vriend als je vijand. Vooral met user entries, kan het zeer uitdagend zijn om geheugen toe te wijzen en vervolgens kopiëren, samenvoegen en doen wat anders op de weg. Ken dit commando goed en hoe het werkt. En vergeet niet om
free()
het geheugen wanneer u klaar bent! - gebruik
char var
om de grootte van een char* voor geheugentoewijzing te bepalen. Het grootste deel van het probleem dat ik had betrokken bij het toewijzen van variabelen om uiteindelijk een string te accepteren. Ik heb andere adviezen gezien, maar als het een string is waarmee je werkt, denk ik datstrlen()
het meest consistent werkte. Je hebt de +1 nodig voor de\0
(null) om de string aan het einde te beëindigen. - gebruik
int arr) +1)]
voor arrays van andere typen. Het is een rare manier om dingen te doen, maar dat krijg je met een lage taal. -
\0
vertegenwoordigt null en zal een array beëindigen. Het kan nuttig zijn wanneer u probeert om buffer overflow problemen te voorkomen. - probeer zo veel mogelijk gedefinieerde constanten te gebruiken. Wanneer je in staat bent om dingen te definiëren bij precompile, zal het je later debuggentijd besparen.
- begrijp waar headerbestanden voor zijn. Veel van de tutorials zullen u vertellen wat een header-bestand bevat, maar het is niet altijd duidelijk waar ze voor zijn. Header bestanden worden vastgelegd op pre-compile tijd en bieden een samenvatting van variabelen en functies beschikbaar voor het programma * voordat het compileert*. Dit betekent dat de .c bestanden in het programma zullen toegang hebben tot deze functies, op voorwaarde dat
#include <headerfile.h>
aan het bestand wordt toegevoegd. Een goede conventie is het creëren van een .H bestand wanneer u een . - de meeste lussen gaan als volgt:
for (int i=0; i < stop; i++)
een eenvoudige manier om een abort trap te hebben is om een ≤ voorstop
te plaatsen. - Houd uw problemen beperkt. Probeer het zo te maken dat elk bestand een paar discrete dingen doet en niets anders. Als je moet jagen door middel van verschillende bestanden over en over, het kan maken het vinden van uw seg fout problemen echt moeilijk.
- Computer Wiskunde is moeilijk. Het is niet echt, maar kleine dingen veroorzaken grote problemen.
char variable
betekent bijvoorbeeld een array die twee items bevat, maar omdat indexen op 0 beginnen, betekent dit dat u alleen tot nummer 1 kunt gaan. - print format strings als het juiste type. Gelukkig wordt dit meestal gevangen tijdens het compileren, maar het kan nog steeds problemen veroorzaken. Zorg ervoor dat uw opmaakteken
%{whatever}
past bij elke variabele die u erin wilt plaatsen.
dat is alles wat ik nu heb. Ik hoop dat mijn ellende je wat hoofdpijn heeft bespaard. Als al het andere faalt, heb ik nu een lijst van dingen te controleren voordat ik trek mijn haar uit!