Hvordan feilsøke segmenteringsfeil i C?

Hvordan feilsøke segmenteringsfeil i C?

En tilgangsbrudd skjer når CPU prøver instruksjonssettet utenfor minneområdet eller leser eller skriver til et reservert sted som ikke eksisterer, noe som resulterer i en segmenteringsfeil. Den nåværende applikasjonen stoppes som et resultat av denne handlingen, og et utfall utpekt som segmenteringsfeil genereres. Fordi data ofte deles på tvers av minneområder på et system, og programlagringsplass deles mellom applikasjoner, oppstår dette problemet.

Noen maskiner kan oppleve segmenteringsfeil, mens andre ikke gjør det. Hvis det skjer, betyr det vanligvis at du har et problem med koden din, og vi klarte å slippe unna med det på det systemet med hell. Det hele er avhengig av hvordan minne er organisert og om det er nullet eller ikke. Vi skal undersøke hvordan du identifiserer programmets segmenteringsproblem i denne artikkelen.

Hva er segmenteringsfeilen?

En segmenteringsfeil, ofte kjent som en segfault, er en slags datamaskinfeil som skjer når prosessoren prøver å få tilgang til en minneadresse utenfor programlagringsområdet på grunn av en uventet tilstand. Begrepet "segmentering" refererer til et virtuelt minnes operativsystems minnebeskyttelsesmetode. Når vi jobber med pekere i C ++/C, får vi ofte dette problemet.

Bruke GDB -kompilator for segmenteringsfeil

For å oppdage hvorfor C -programmene oppretter en segmenteringsfeil, bruker vi GDB. GDB er en C (og C ++) feilsøking. Det gjør det mulig for programmet å løpe opp til et bestemt punkt, deretter stanse og rapporterer verdiene til spesifiserte variabler i det øyeblikket, eller tråkker gjennom programmet en linje om gangen, og skriver ut verdiene til hver variabel etter at hver linje er utført. GDB -debuggeren vil hjelpe oss med å finne ut hvilke linjer som er ansvarlige for segmenteringsproblemet.

Nøkkelpunkter for å forhindre segmenteringsfeil

Mens feiltilgangsfeil forårsaker flertallet av segmenteringsfeilene, er det viktig å sikre at pekere som brukes i et program alltid refererer til akseptable dataplokasjoner. Følgende er måtene å forhindre segmenteringsfeil.

  • Ettersom feiltilgangsfeilene forårsaker flertallet av segmenteringsfeilene, er det viktig å sikre at applikasjonspekere alltid peker på gyldige datalokasjoner.
  • Før du henviser til en mottakelig referanse, for eksempel en innebygd i en struktur som holdes i en liste eller en matrise, bør vi påkalle hevde ().
  • Husk alltid å initialisere pekere riktig.
  • En mutex eller en semafor kan brukes til å beskytte delte ressurser mot samtidig tilgang i multithreading.
  • Vi bør bruke gratis () -funksjonen

Eksempel 1: Program for segmenteringsfeil ved å gjørereferansepeker fra minneblokk i C

Vi har en illustrasjon av en segmenteringsfeil der vi prøver å få tilgang til adressen til pekeren som har frigjort. I den følgende C -programmet hovedfunksjon har vi pekervariabel erklæring “Int* A”, og vi har tildelt minnet til pekervariabelen “A”. En segmenteringsfeil vil bli generert når programmet prøver å lese fra derferencingpekeren *a.

#inkludere
int main (int argc, char ** argv)

int* a;
*a = 50;
retur 0;

Ved sammenstilling av ovennevnte kode som er sett på skjermen nedenfor, forårsaker linjen *A = 50 en segmenteringsfeil.

Eksempel 2: Program for segmenteringsfeil ved å få tilgang til matrise ut av obligasjonen i C

En segmenteringsfeil oppstår i de fleste tilfeller når et program prøver å lese eller skrive minne utover grensene. I det følgende programmet har vi erklært en rekke indekser "10". Da prøver vi å hente indeksen for en matrise som er utenfor bundet og initialisert den med den numeriske verdien. Dette er poenget der vi vil få segmenteringsfeil etter å ha utført den utenfor grunne linjen i programmet.

#inkludere
int main (int argc, char ** argv)

int myarr [10];
Myarr [1000] = 2;
retur 0;

Vi er i GDB -kompilatoren der vi har brukt GDB -listekommandoen. GDB -listekommandoen har skrevet ut kodelinjen fra ventilprogrammet. Fra linjen “Myarr [1000] = 2”, har vi en segmenteringsfeil. Du kan se det i følgende GDB -konsoll.

Eksempel 3: Program for segmenteringsfeil ved Dereferencing Null Pointer i C

Referanser er pekere i programmeringsspråk som indikerer hvor et element er lagret i minnet. En nullpeker er en peker som peker på ingen gyldig minneplassering. I programmet nedenfor har vi erklært en pekervariabel "Pointerval" og tildelt den en nullverdi. Nullpekerens unntak blir kastet eller segmenteringsfeil oppstår når en nullpeker blir dureferanser på linjen “*Pointerval = 10”.

#inkludere
int main (int argc, char ** argv)

int *pointerval = null;
*Pointerval = 10;
retur 0;

Utfallet av ovennevnte program har kastet segmenteringsfeilen ved utførelse på linje “*Pointerval = 10” vist nedenfor.

Eksempel 4: Program for segmenteringsfeil ved stabeloverløp i C

Selv om koden ikke har en eneste peker, er det ikke et pekerproblem. Stabeloverløpet oppstår da når den rekursive funksjonen påberopes gjentatte ganger, og konsumerer alt stabelminnet. Minnekorrupsjon kan også skje når stabelen går tom for verdensrommet. Det kan fikses ved å komme tilbake fra den rekursive funksjonen med en basetilstand.

Her i programmet har vi hovedfunksjonen og i hovedfunksjonen har vi påkalt en annen hovedfunksjon. Dette fører til segmenteringsfeil på grunn av bunkeoverløp.

#inkludere
Int Main (Void)

hoved();
retur 0;

Du kan se at GDB -kompilatoren gir segmenteringsfeilen på nettet der vi har påkalt hovedfunksjonen i programmet hovedfunksjonsblokk.

Konklusjon

Artikkelen kaster litt lys over hva som er segmenteringsfeil og hvordan vi kan feilsøke dem ved å bruke GDB -kompilatoren. GDB -kompilatoren bestemmer hvilke linjer som er ansvarlige for segmenteringsfeilen. Feilsøkingsøkten med segmenteringsfeil er veldig enkelt å håndtere med en GDB -kompilator i C -programmering. Da har vi tatt forskjellige scenarier der segmenteringsfeil kan oppstå. Jeg håper denne artikkelen avklarte segmenteringsfeilproblemene.