logo

Segmenteringsfeil kjerne dumpet Ubuntu

Hva er en segmenteringsfeil?

Segmenteringsfeil eller tilgangsbrudd ( segfault kort sagt) er en feiltilstand eller feil som oppstår av maskinvare med minnebeskyttelse, som varsler et operativsystem programvaren har forsøkt å få tilgang til et begrenset minneområde (en brudd på minnetilgang).

Det er en generell beskyttelsesfeil på standard x86-systemer. Som svar vil kjernen i operativsystemet vanligvis implementere noen få korrigerende operasjoner, vanligvis overføre denne feilen til den fornærmende prosessen ved å overføre et signal til prosessen.

I noen tilfeller kan prosesser installere en signalbehandler, slik at de kan gjenopprette på egen hånd, men ellers brukes standardsignalbehandleren til operativsystemet, noe som vanligvis fører til prosessens unormale avslutning, og noen ganger en kjernedump.

  • Segmenteringsfeil er en grunnleggende feilklasse i programmer spesifisert på mange språk som f.eks C språk som tilbyr lavt nivå minnetilgang og noen å vite sikkerhetssjekker.
  • Primært oppstår de på grunn av mange feil i pekere som brukes til virtuell minneadressering, spesielt ulovlig tilgang.
  • Andre typer minnetilgangsfeil er en buss feil , som også inkluderer flere årsaker.
  • Disse vises først og fremst på grunn av unøyaktig fysisk minneadressering eller feiljustert minnetilgang.
  • Dette er noen minnereferanser som maskinvaren ikke kan adressere i stedet for referanser som prosessen ikke har tillatelse til å adressere.
  • Flere programmeringsspråk kan bruke mekanismer laget for å unngå segmenteringsfeil og utvikle minnesikkerhet. For eksempel, de Rust programmeringsspråk bruker en eierskapsbasert modell for å sikre minnesikkerhet. Et annet språk som Java og Lisp bruker søppelinnsamling, som ignorerer mange minnefeilklasser som kan forårsake segmenteringsfeil.

Oversikt over segmenteringsfeil

  • En segmenteringsfeil vises når et program forsøker å få tilgang til et minnested som det ikke er tillatt å få tilgang til, eller forsøk på å få tilgang til et minnested på en måte som ikke er tillatt (for eksempel forsøk på å skrive til en skrivebeskyttet plassering, eller for å overskrive operativsystemdel).
  • I databehandling, ordet 'segmentering' har flere bruksområder. I form av segmenteringsfeil, et ord brukt siden 1950, definerer det adresserommet til programmet, bare adresserommet til programmet er lesbart med minnebeskyttelse, og av dette er det bare stabelen og datasegmentet lese-skrive-delen av programmet er skrivbart. Derfor vil forsøk på å lese utenfor adresserommet til programmet, eller skrive til den skrivebeskyttede delen av adresserommet, resultere i en segmenteringsfeil.
  • En segmenteringsfeil vises hvis maskinvaren finner et forsøk på å referere til et ikke-eksisterende segment, en plassering utenfor segmentgrensene, eller en plassering i en stil som ikke er tillatt av tillatelsene gitt for segmentet på systemene som bruker minnesegmenteringen til maskinvaren for å gi virtuelt minne.
  • Vanligvis forårsaker en ugyldig sidefeil segmenteringsfeil på systemene som kun bruker personsøking. Sidefeilene og segmenteringsfeilene er begge feil som oppstår fra det virtuelle minnestyringssystemet. Segmenteringsfeil kan også oppstå uavhengig av sidefeilene; illegitim tilgang til en hvilken som helst gyldig side er segmenteringsfeilen. Segmenteringsfeilen kan vises på midten av en side. Inne i en bufferoverløp som ligger på en side, men overskriver minne ulovlig for eksempel.
  • I utgangspunktet er feilen oppstått fra MMU ( minnestyringsenhet ) på ulovlig tilgang, som et segment av minnebeskyttelsesaspektet, eller en ugyldig sidefeil på maskinvarenivå. Hvis problemet ikke er en ugyldig logisk adresse, men snarere en ugyldig fysisk adresse, oppstår bussfeilen heller. Så disse skilles ikke alltid.
  • Denne feilen blir funnet og et signal sendes til den fornærmende prosessen, og aktiverer behandleren av prosessen for det signalet på operativsystemnivå. Ulike typer operativsystemer har distinkte signalnavn for å indikere at en segmenteringsfeil har dukket opp.
  • Et signal kjent som SIGSEGV (kort for segmenteringsbrudd ) overføres til den fornærmende prosessen på Unix-lignende operativsystemer. Den krenkende prosessen får et unntak, dvs. STATUS_ACCESS_VIOLATION på Microsoft Windows.

Årsaker til segmenteringsfeil

Omstendighetene der en segmenteringsfeil oppstår og hvordan den manifesterer seg er spesifikke for operativsystemet og maskinvaren. Ulik maskinvare oppstår ulike feil for flere forhold og ulike operativsystemer transformerer disse til ulike signaler som sendes til prosessene.

Den kommende årsaken kan være et brudd på minnetilgangen, selv om den underliggende årsaken er en programvarefeil av noen få slag. Å feilsøke en feil eller bestemme rotårsaken kan være enkelt i noen få tilfeller, der programmet vil føre til en segmenteringsfeil konsekvent. Imidlertid kan posen være vanskelig å reprodusere og stole på minnetildelingen på hver kjøring i andre tilfeller.

Følgende er noen typiske årsaker til segmenteringsfeilen:

  • Forsøk på å få tilgang til en ikke-eksisterende minneadresse (eksternt til prosessens adresserom)
  • Forsøk på å få tilgang til minne har et program ikke rettigheter til (som kjernestrukturer i prosesskonteksten)
  • Forsøk på å skrive skrivebeskyttet minne (som kodesegment )
  • På sin side er disse ofte oppstått av mange programmeringsfeil som resulterer i ugyldig minnetilgang:
  • Forsøk på å kjøre et program som ikke kompilerer riktig. (Noen få kompilatorer vil resultere i en kjørbar fil uavhengig av om det finnes kompileringsfeil.)
  • Et stabeloverløp
  • Et bufferoverløp
  • Tilordne eller derifisere til en frigjort peker (a dinglende peker , som indikerer minne som har blitt slettet/avallokert/frigjort)
  • Tilordne eller derifisere til en uinitialisert peker (en vill peker , som indikerer en tilfeldig minneadresse)
  • Å referere til en null-peker indikerer vanligvis en adresse som ikke er en del av adresserommet til prosessen

Segmenteringsfeil oppstår ofte på grunn av feil ved bruk av en peker, spesielt i C dynamisk minnetildeling i C-kode. Å referere til en null-peker , som resulterer i udefinert atferd, vil føre til en segmenteringsfeil. Det er på grunn av en null-peker som ikke kan være en gyldig minneadresse. De dinglende pekere og ville tips indikere et minne som kanskje eller kanskje ikke eksisterer og kanskje eller kanskje ikke er skrivbart eller lesbart og dermed kan utfalle i forbigående feil.

java heltall

Løs segmenteringsfeil i Ubuntu

Denne feilen kan ramme Ubuntu-systemet vårt når som helst. Segmenteringsfeil er når systemet vårt prøver å få tilgang til en side med minne som ikke eksisterer. Kjerne dumpet definerer når en kodedel prøver å utføre en skrive- og leseoperasjon på et ledig eller skrivebeskyttet sted. Som regel, segfaults er assosiert med en fil med navnet core og skjer på tidspunktet for oppgradering.

Mens vi utfører noen få kommandoer på tidspunktet for kjernedump-situasjonen, kan vi støte på 'Kan ikke åpne låsefilen' feil. Det er på grunn av at systemet prøver å ta en bit av blokkeringen som ikke eksisterer. Det er på grunn av krasj av binærfiler for noen få spesifikke programmer.

Vi kan feilsøke eller gå tilbake for å løse det, men løsningen er å fikse de ødelagte pakkene ved å implementere noen trinn som er nevnt som følger:

1. Fjern låsefilene som er tilgjengelige på forskjellige steder.

 $ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system 

Segmenteringsfeil kjerne dumpet Ubuntu

2. Fjerning av depotbuffer.

 $ sudo apt-get clean all 

Segmenteringsfeil kjerne dumpet Ubuntu

3. Oppgrader og oppdater depotbufferen vår.

 $ sudo apt-get update 

Segmenteringsfeil kjerne dumpet Ubuntu
 $ sudo apt-get upgrade 

Segmenteringsfeil kjerne dumpet Ubuntu

4. Oppgrader distribusjonen vår, den vil oppdatere pakkene våre.

 $ sudo apt-get dist-upgrade 

Segmenteringsfeil kjerne dumpet Ubuntu

5. Søk i de ødelagte pakkene og fjern dem med kraft.

 $ sudo dpkg -1 | grep ^..r | apt-get purge 

En flott måte som alltid vil fungere er som følger bortsett fra kommandolinjen:

... i java
  1. I oppstartsmodus, kjør Ubuntu ved å klikke på Esc nøkkel etter omstart.
  2. Velg ' Avanserte alternativer for Ubuntu
    Segmenteringsfeil kjerne dumpet Ubuntu
  3. I gjenopprettingsmodus kjør Ubuntu og vi vil bli nevnt flere alternativer.
  4. Velg først 'Reparer ødelagte pakker'
    Segmenteringsfeil kjerne dumpet Ubuntu
  5. Deretter velger du 'Gjenoppta normal oppstart'
    Segmenteringsfeil kjerne dumpet Ubuntu

Nå har vi to måter å løse segmenteringsfeil GUI og CLI på. Noen ganger kan det også skje at kommandoen, dvs. apt, ikke fungerer på grunn av segfault , så CLI-metoden vil ikke implementeres. I den situasjonen, ikke bekymre deg fordi GUI-metoden alltid vil fungere for oss.

Håndtering av segmenteringsfeil

Standardoppgaven for en bussfeil eller segmenteringsfeil er den unormale avslutningen av en prosess som oppdaget den. En kjernefil kan produseres for å hjelpe til med feilsøking, og andre plattformavhengige oppgaver kan også implementeres. For eksempel, mange Linux-systemer bruker grsikkerhetsoppdatering kan logge SIGSEGV-signaler for overvåking for mulige innbruddsforsøk med bufferoverløp.

På noen få systemer, som Windows og Linux, er det mulig for et program selv å håndtere en segmenteringsfeil. Det kjørende programmet kan ikke bare administrere hendelsen, men kan trekke ut noen få detaljer om statusen som verdiene til prosessorregisteret, få en stabelsporing, linjen i en kildekode da den ble oppdaget, minneadressen som ble åpnet ugyldig og om oppgaven var en skriving eller en lesing avhengig av operativsystem og arkitektur.

En segmenteringsfeil definerer imidlertid at et program har en feil som krever fiksing, det er også mulig å forårsake en slik feil med vilje for testformålet, feilsøking, og også for å imitere plattformer der det kreves direkte tilgang til minnet. Systemet skal kunne tillate programmet å kjøre selv etter at feilen oppstår i sistnevnte tilfelle.

I denne situasjonen, når systemet tillater det, er det mulig å administrere hendelsen og forbedre prosessorprogrammet i motsetning til 'hoppe' på den manglende instruksen om å fortsette med utførelsen.

Eksempler på segmenteringsfeil

Segmenteringsfeil kjerne dumpet Ubuntu

Skriver til skrivebeskyttet minne

Det oppstår en segmenteringsfeil. Det vises når programmet skriver til en del av kodesegmentet sitt eller den skrivebeskyttede delen av datasegmentet på kodefeilnivåene fordi disse lastes via operativsystemet inn i skrivebeskyttet minne.

b+ trær

Null peker dereference

I C og andre C-lignende språk brukes null-pekerne for mening 'peker til ingen objekt' og da feilindikatoren og derereferansen i null-pekeren (en skriving eller lesing fra en null-peker) er en veldig grunnleggende programfeil.

Standarden sier ikke at null-pekeren ligner på pekeren til 0-minneadressen, selv om det kan være tilfelle. Nesten alle operativsystemer kartlegger adressen til null-pekeren slik at bruk av den fører til en segmenteringsfeil.

Denne oppførselen er ikke garantert av noen C-standard. I C er det å referere til null-pekeren udefinert oppførsel , og en samsvarende implementering er tillatt å anta at en peker som er dereferert ikke er null.

Bufferoverløp

Stabeloverløp