Vad är ett segmenteringsfel?
Segmenteringsfel eller åtkomstfel ( segfault i korthet) är ett feltillstånd eller fel som uppstår av hårdvara med minnesskydd, som varnar ett operativsystem som programvaran har försökt komma åt ett begränsat minnesområde (ett minnesåtkomstbrott).
Det är ett allmänt skyddsfelformulär på standard x86-system. Som svar kommer kärnan i operativsystemet vanligtvis att implementera ett fåtal korrigerande operationer, i allmänhet föra det felet vidare till den kränkande processen genom att överföra en signal till processen.
I vissa fall kan processer installera en signalhanterare, vilket tillåter dem att återhämta sig på egen hand, men annars används standardsignalhanteraren för operativsystemet, vilket vanligtvis leder till att processen avslutas onormalt, och ibland en kärndump.
- Segmenteringsfel är en grundläggande felklass i program specificerade på många språk som t.ex C språk som ger tillgång till minne på låg nivå och några för att känna till säkerhetskontroller.
- I första hand uppstår de på grund av många fel i pekare som används för virtuell minnesadressering, särskilt olaglig åtkomst.
- Andra typer av minnesåtkomstfel är en bussfel , vilket också omfattar flera orsaker.
- Dessa uppträder främst på grund av felaktig fysisk minnesadressering eller felaktig minnesåtkomst.
- Det här är några minnesreferenser som hårdvaran inte kan adressera istället för referenser som processen inte är tillåten att adressera.
- Flera programmeringsspråk kan tillämpa mekanismer skapade för att undvika segmenteringsfel och utveckla minnessäkerhet. Till exempel, de Rost programmeringsspråket tillämpar en ägarbaserad modell för att säkerställa minnessäkerhet. Ett annat språk som Java och Läspa tillämpar garbage collection, som ignorerar många minnesfelklasser som kan orsaka segmenteringsfel.
Översikt över segmenteringsfel
- Ett segmenteringsfel uppstår när något program försöker komma åt en minnesplats som det inte är tillåtet att komma åt eller försöker komma åt en minnesplats på ett sätt som inte är tillåtet (till exempel försöker skriva till en skrivskyddad plats eller skriva över operativsystemsdel).
- Inom datorer, ordet 'segmentering' har flera användningsområden. I vägen för segmenteringsfel, ett ord som använts sedan 1950, definierar det programmets adressutrymme, endast programmets adressutrymme är läsbart med minnesskydd, och av detta är bara stacken och datasegmentet läs-skriv-delen av programmet är skrivbart. Försök att läsa utanför programmets adressutrymme eller skriva till den skrivskyddade delen av adressutrymmet resulterar därför i ett segmenteringsfel.
- Ett segmenteringsfel uppstår om hårdvaran hittar ett försök att hänvisa till ett icke-existerande segment, en plats utanför segmentgränserna eller en plats i en stil som inte är tillåten av de behörigheter som beviljats för segmentet på systemen som använder minnessegmenteringen av hårdvaran för att tillhandahålla virtuellt minne.
- I allmänhet orsakar ett ogiltigt sidfel segmenteringsfel på de system som endast använder personsökning. Sidfel och segmenteringsfel är båda fel som härrör från det virtuella minneshanteringssystemet. Segmenteringsfel kan också uppstå oberoende av sidfelen; olaglig åtkomst till en giltig sida är segmenteringsfelet. Segmenteringsfelet kan dyka upp i mitten av en sida. Inuti a buffer-överflöde som finns på en sida men skriver över minnet olagligt till exempel.
- Inledningsvis uppstår felet från MMU ( minneshanteringsenhet ) vid olaglig åtkomst, som en del av dess minnesskyddsaspekt, eller ett ogiltigt sidfel på hårdvarunivå. Om problemet inte är en ogiltig logisk adress utan snarare en ogiltig fysisk adress, uppstår snarare busfelet. Så dessa särskiljs inte alltid.
- Detta fel hittas och en signal skickas till den felande processen, vilket aktiverar hanteraren av processen för den signalen på operativsystemnivå. Olika typer av operativsystem har distinkta signalnamn för att indikera att ett segmenteringsfel har uppstått.
- En signal som kallas SIGSEGV (Förkortning av segmenteringsöverträdelse ) överförs till den kränkande processen på Unix-liknande operativsystem. Den kränkande processen får ett undantag, dvs. STATUS_ACCESS_VIOLATION på Microsoft Windows.
Orsaker till segmenteringsfel
Omständigheterna under vilka ett segmenteringsfel uppstår och hur det visar sig är specifika för operativsystemet och hårdvaran. Olika hårdvara uppstår olika fel för flera omständigheter och olika operativsystem omvandlar dessa till olika signaler som skickas till processerna.
Den kommande orsaken kan vara ett minnesåtkomstbrott, även om den bakomliggande orsaken är ett programvarufel av några slag. Att felsöka en bugg eller bestämma grundorsaken kan vara lätt i några få fall, där programmet kommer att leda till ett segmenteringsfel konsekvent. Påsen kan dock vara svår att reproducera och förlita sig på minnesallokeringen vid varje körning i andra fall.
Följande är några typiska orsaker till segmenteringsfelet:
- Försök att komma åt en icke-existerande minnesadress (externt till processens adressutrymme)
- Försök att komma åt minne som ett program inte har rättigheter till (som kärnstrukturer inom processsammanhang)
- Försök att skriva skrivskyddat minne (som kodsegment )
- I sin tur uppstår dessa ofta av många programmeringsfel som uppstår i ogiltig minnesåtkomst:
- Försök att köra ett program som inte kompilerar korrekt. (Några kompilatorer kommer att resultera i en körbar fil oavsett förekomsten av kompileringsfel.)
- Ett stackspill
- Ett buffertspill
- Tilldela eller hänvisa till en frigjord pekare (a dinglande pekare , vilket indikerar minne som har raderats/avallokerats/frigjorts)
- Tilldela eller därhänvisa till en oinitierad pekare (a vild pekare , vilket indikerar en slumpmässig minnesadress)
- Avvisande hänvisning till en nollpekare anger vanligtvis en adress som inte är en del av processens adressutrymme
Segmenteringsfel uppstår ofta på grund av felen i användningen av en pekare, särskilt i C dynamisk minnesallokering i C-kod. Avvisande hänvisning till en nollpekare , som utfaller i odefinierat beteende, kommer att leda till ett segmenteringsfel. Det beror på en nollpekare som inte kan vara en giltig minnesadress. De dinglande pekare och vilda tips indikerar ett minne som kanske eller kanske inte existerar och kanske eller kanske inte är skrivbart eller läsbart och därmed kan resultera i övergående buggar.
iterera karta i java
Lös segmenteringsfel i Ubuntu
Det här felet kan drabba vårt Ubuntu-system när som helst. Segmenteringsfel är när vårt system försöker komma åt en minnessida som inte finns. Kärnan dumpad definierar när en koddel försöker utföra en skriv- och läsoperation på en ledig eller skrivskyddad plats. Allmänt, segfaults är associerade med en fil med namnet core och inträffar vid tidpunkten för uppgradering.
När vi kör några kommandon vid tidpunkten för kärndumpningssituationen kan vi stöta på 'Kan inte öppna låsfilen' fel. Det beror på att systemet försöker ta lite block som inte finns. Det är på grund av att binärfiler kraschar i några specifika program.
Vi kanske felsöker eller backar för att lösa det men lösningen är att fixa de trasiga paketen genom att implementera några steg som nämns enligt följande:
1. Ta bort låsfilerna som finns på olika platser.
$ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system
2. Ta bort repository cache.
$ sudo apt-get clean all
3. Uppgradera och uppdatera vår arkivcache.
$ sudo apt-get update
$ sudo apt-get upgrade
4. Uppgradera nu vår distribution, det kommer att uppdatera våra paket.
$ sudo apt-get dist-upgrade
5. Sök igenom de trasiga paketen och ta bort dem med kraft.
$ sudo dpkg -1 | grep ^..r | apt-get purge
Ett bra sätt som alltid kommer att fungera är följande förutom kommandoraden:
ankita lokhande ålder
- I startläge, kör Ubuntu genom att klicka på Esc nyckel efter omstart.
- Välj ' Avancerade alternativ för Ubuntu
- Kör Ubuntu i återställningsläge och vi kommer att nämnas flera alternativ.
- Välj först 'Reparera trasiga paket'
- Välj sedan 'Återuppta normal start'
Nu har vi två sätt att lösa segmenteringsfel GUI och CLI. Ibland kan det också hända att kommandot, d.v.s. apt inte fungerar på grund av segfault , så CLI-metoden kommer inte att implementeras. I den situationen, oroa dig inte eftersom GUI-metoden alltid kommer att fungera för oss.
Hantering av segmenteringsfel
Standarduppgiften för ett bussfel eller segmenteringsfel är den onormala avslutningen av en process som stötte på det. En kärnfil kan skapas för att hjälpa till att felsöka, och andra plattformsberoende uppgifter kan också implementeras. Till exempel många Linux-system som tillämpar grsäkerhetspatch kan logga SIGSEGV-signaler för övervakning av eventuella intrångsförsök med buffertspill.
Java abstrakt klass
På ett fåtal system, som Windows och Linux, är det möjligt för ett program själv att hantera ett segmenteringsfel. Det pågående programmet kan inte bara hantera händelsen utan kan extrahera några detaljer om dess status som värdena på processorregistret, få en stackspårning, raden i en källkod när den påträffades, minnesadress som var ogiltig åtkomst och om uppgiften var en skrivning eller en läsning beroende på operativsystem och arkitektur.
Men ett segmenteringsfel definierar att ett program har ett fel som kräver fixning, det är också möjligt att orsaka ett sådant fel avsiktligt för teständamålet, felsökning och även för att imitera plattformar där direktåtkomst krävs till minnet. Systemet bör kunna tillåta att programmet körs även efter att felet inträffat i det senare fallet.
I den här situationen, när systemet tillåter, är det möjligt att hantera händelsen och förbättra processorprogrammet mot 'hoppa' på den misslyckade instruktionen att fortsätta med utförandet.
Exempel på segmenteringsfel
Skriver till skrivskyddat minne
Det uppstår ett segmenteringsfel. Det dyker upp när programmet skriver till en del av sitt kodsegment eller den läsbara delen av datasegmentet på kodfelsnivåerna eftersom dessa laddas via operativsystemet till läsminnet.
Noll pekaredereferens
I C och andra C-liknande språk används nollpekarna för betydelse 'pekare till inget objekt' och eftersom felindikatorn och dereferensen i nollpekaren (en skrivning eller läsning från en nollpekare) är ett mycket grundläggande programfel.
Standarden säger inte att nollpekaren liknar pekaren till 0-minnesadressen, även om det kan vara fallet. Nästan alla operativsystem mappar adressen till nollpekaren så att användningen av den leder till ett segmenteringsfel.
Detta beteende garanteras inte av någon C-standard. I C är nollpekaren därav odefinierat beteende , och en överensstämmande implementering är tillåten att anta att en pekare som har avreferens inte är null.