Hvad er en segmenteringsfejl?
Segmenteringsfejl eller adgangskrænkelse ( sigfault kort sagt) er en fejltilstand eller fejl, der er opstået af hardware med hukommelsesbeskyttelse, der advarer et operativsystem, softwaren har forsøgt at få adgang til et begrænset hukommelsesområde (en overtrædelse af hukommelsesadgang).
Det er en generel beskyttelsesfejlform på standard x86-systemer. Som svar vil kernen i operativsystemet normalt implementere et par korrigerende handlinger, og generelt sende denne fejl videre til den fornærmende proces ved at overføre et signal til processen.
I nogle tilfælde kan processer installere en signalbehandler, hvilket giver dem mulighed for at gendanne på egen hånd, men ellers bruges operativsystemets standardsignalbehandler, hvilket generelt fører til processens unormale afslutning og nogle gange et kernedump.
- Segmenteringsfejl er en grundlæggende fejlklasse i programmer specificeret på mange sprog som f.eks C sprog, der tilbyder hukommelsesadgang på lavt niveau og nogle at vide sikkerhedstjek.
- Primært opstår de på grund af mange fejl i pointere, der bruges til virtuel hukommelsesadressering, specifikt ulovlig adgang.
- Andre typer hukommelsesadgangsfejl er en bus fejl , som også omfatter flere årsager.
- Disse vises primært på grund af unøjagtig fysisk hukommelsesadressering eller forkert justeret hukommelsesadgang.
- Dette er nogle hukommelsesreferencer, som hardwaren ikke kan adressere i stedet for referencer, som processen ikke har tilladelse til at adressere.
- Flere programmeringssprog kan anvende mekanismer skabt til at undgå segmenteringsfejl og udvikle hukommelsessikkerhed. For eksempel, det Rust programmeringssprog anvender en ejerskabsbaseret model for at sikre hukommelsessikkerhed. Et andet sprog som Java og Lisp anvender garbage collection, som ignorerer mange hukommelsesfejlklasser, der kan forårsage segmenteringsfejl.
Oversigt over segmenteringsfejl
- En segmenteringsfejl opstår, når et program forsøger at få adgang til en hukommelsesplacering, som det ikke er tilladt at få adgang til, eller forsøg på at få adgang til en hukommelsesplacering på en måde, der ikke er tilladt (f.eks. forsøg på at skrive til en skrivebeskyttet placering eller for at overskrive operativsystemdel).
- I computeren, ordet 'segmentering' har flere anvendelsesmuligheder. I form af segmenteringsfejl, et ord brugt siden 1950, definerer det programmets adresserum, kun programmets adresserum kan læses med hukommelsesbeskyttelse, og heraf kun stakken og datasegmentets læse-skrivedel af programmet er skrivbar. Derfor vil forsøg på at læse uden for programmets adresserum eller skrive til den skrivebeskyttede del af adresserummet resultere i en segmenteringsfejl.
- En segmenteringsfejl opstår, hvis hardwaren finder et forsøg på at henvise til et ikke-eksisterende segment, en placering uden for segmentgrænserne eller en placering i en stil, der ikke er tilladt af de tilladelser, der er givet til segmentet på systemerne ved hjælp af hukommelsessegmenteringen af hardwaren til at levere virtuel hukommelse.
- Generelt forårsager en ugyldig sidefejl segmenteringsfejl på de systemer, der kun bruger personsøgning. Sidefejlene og segmenteringsfejlene er begge fejl, der stammer fra det virtuelle hukommelsesstyringssystem. Segmenteringsfejl kan også forekomme uafhængigt af sidefejlene; illegitim adgang til enhver gyldig side er segmenteringsfejlen. Segmenteringsfejlen kan forekomme i midten af en side. Inde i en bufferoverløb der ligger på en side, men overskriver hukommelsen ulovligt f.eks.
- I første omgang er fejlen opstået fra MMU ( hukommelsesstyringsenhed ) på ulovlig adgang, som et segment af dets hukommelsesbeskyttelsesaspekt, eller en ugyldig sidefejl på hardwareniveau. Hvis problemet ikke er en ugyldig logisk adresse, men snarere en ugyldig fysisk adresse, opstår busfejlen snarere. Så disse skelnes ikke altid.
- Denne fejl er fundet, og et signal sendes til den fornærmende proces, der aktiverer behandleren af processen for dette signal på operativsystemniveau. Forskellige typer operativsystemer har forskellige signalnavne for at angive, at der er opstået en segmenteringsfejl.
- Et signal kendt som SIGSEGV (forkortelse for segmenteringsovertrædelse ) overføres til den fornærmende proces på de Unix-lignende operativsystemer. Den krænkende proces får en undtagelse, dvs. STATUS_ACCESS_VIOLATION på Microsoft Windows.
Årsager til segmenteringsfejl
De omstændigheder, hvorunder en segmenteringsfejl opstår, og hvordan den manifesterer sig, er specifikke for operativsystemet og hardwaren. Forskellig hardware opstår forskellige fejl under flere omstændigheder, og forskellige operativsystemer omdanner disse til forskellige signaler, der sendes til processerne.
Den kommende årsag kan være en overtrædelse af hukommelsesadgang, selvom den underliggende årsag er en softwarefejl af nogle få slags. I nogle få tilfælde kan det være let at fejlfinde en fejl eller afgøre årsagen, hvor programmet konsekvent vil føre til en segmenteringsfejl. Posen kan dog være svær at reproducere og stole på hukommelsestildelingen ved hver kørsel i andre tilfælde.
Følgende er et par typiske årsager til segmenteringsfejlen:
- Forsøg på at få adgang til en ikke-eksisterende hukommelsesadresse (eksternt i forhold til processens adresserum)
- Forsøg på at få adgang til hukommelsen har et program ikke rettigheder til (som kernestrukturer i processammenhæng)
- Forsøg på at skrive skrivebeskyttet hukommelse (som kodesegment )
- Til gengæld er disse ofte opstået af mange programmeringsfejl, der resulterer i ugyldig hukommelsesadgang:
- Forsøg på at udføre et program, der ikke kompilerer korrekt. (Nogle få kompilatorer vil resultere i en eksekverbar fil uanset eksistensen af kompileringsfejl.)
- Et stak overløb
- Et bufferoverløb
- Tildeling eller derhenvisning til en frigjort pointer (a dinglende pointer , som angiver hukommelse, der er blevet slettet/deallokeret/frigivet)
- Tildeling eller dereference til en uinitialiseret markør (en vild pointer , som angiver en tilfældig hukommelsesadresse)
- Der henvises til en nul pointer angiver normalt en adresse, der ikke er en del af processens adresserum
Segmenteringsfejl opstår ofte på grund af fejl i brugen af en pointer, specifikt i C dynamisk hukommelsestildeling i C-kode. Der henvises til en nul pointer , som resulterer i udefineret adfærd, vil føre til en segmenteringsfejl. Det skyldes en nul-pointer, der ikke kan være en gyldig hukommelsesadresse. Det dinglende pointer og vilde pointer indikere en hukommelse, der måske eller måske ikke eksisterer og måske eller måske ikke er skrivbar eller læsbar og kan således resultere i forbigående fejl.
algoritme for binær søgning
Løs segmenteringsfejl i Ubuntu
Denne fejl kan ramme vores Ubuntu-system på ethvert tidspunkt. Segmenteringsfejl er, når vores system forsøger at få adgang til en hukommelsesside, der ikke eksisterer. Kerne dumpet definerer, hvornår en kodedel forsøger at udføre en skrive- og læseoperation på en ledig eller skrivebeskyttet placering. Generelt, afvigelser er forbundet med en fil med navnet core og sker på tidspunktet for opgradering.
Mens vi udfører et par kommandoer på tidspunktet for kernedump-situationen, kan vi støde på 'Kan ikke åbne låsefil' fejl. Det skyldes, at systemet forsøger at tage en smule blokering, der ikke eksisterer. Det er på grund af nedbrud af binære filer i nogle få specifikke programmer.
Vi fejler måske eller går tilbage for at løse det, men løsningen er at rette de ødelagte pakker ved at implementere nogle trin, der er nævnt som følger:
1. Fjern de låsefiler, der er tilgængelige på forskellige steder.
$ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system
2. Fjernelse af lagercache.
$ sudo apt-get clean all
3. Opgrader og opdater vores lagercache.
$ sudo apt-get update
$ sudo apt-get upgrade
4. Opgrader nu vores distribution, det vil opdatere vores pakker.
$ sudo apt-get dist-upgrade
5. Søg i de ødelagte pakker, og fjern dem kraftigt.
$ sudo dpkg -1 | grep ^..r | apt-get purge
En fantastisk måde, som altid vil fungere, er som følger bortset fra kommandolinjen:
sammenligne metode java
- I opstartstilstand skal du køre Ubuntu ved at klikke på Esc nøgle efter genstart.
- Vælg ' Avancerede muligheder for Ubuntu
- Kør Ubuntu i gendannelsestilstand, og vi vil blive nævnt flere muligheder.
- Først skal du vælge 'Reparer ødelagte pakker'
- Vælg derefter 'Genoptag normal opstart'
Nu har vi to måder at løse segmenteringsfejl GUI og CLI på. Nogle gange kan det også ske, at kommandoen, dvs. apt, ikke virker på grund af sigfault , så CLI-metoden implementeres ikke. I den situation skal du ikke bekymre dig, fordi GUI-metoden altid vil fungere for os.
Håndtering af segmenteringsfejl
Standardopgaven for en busfejl eller segmenteringsfejl er den unormale afslutning af en proces, der stødte på den. En kernefil kan produceres for at hjælpe med at fejlfinde, og andre platformafhængige opgaver kan også implementeres. For eksempel anvender mange Linux-systemer grsikkerhedspatch kan logge SIGSEGV-signaler til overvågning af mulige indbrudsforsøg med bufferoverløb.
På nogle få systemer, som Windows og Linux, er det muligt for et program selv at håndtere en segmenteringsfejl. Det kørende program kan ikke kun administrere hændelsen, men kan muligvis udtrække nogle få detaljer om dets status, såsom værdierne af processorregisteret, få en staksporing, linjen i en kildekode, da den blev stødt på, hukommelsesadresse, der blev tilgået ugyldigt, og om opgaven var en skrivning eller en læsning afhængigt af operativsystemet og arkitekturen.
En segmenteringsfejl definerer imidlertid, at et program har en fejl, der kræver reparation, det er også muligt at forårsage en sådan fejl med vilje til testformål, fejlretning og også for at efterligne platforme, hvor der kræves direkte adgang til hukommelsen. Systemet bør være i stand til at tillade programmet at køre, selv efter fejlen opstår i sidstnævnte tilfælde.
I denne situation, når systemet tillader det, er det muligt at styre hændelsen og forbedre processorprogrammet i modsætning til 'hoppe' på den manglende instruks om at gå videre med udførelsen.
Eksempler på segmenteringsfejl
Skrivning til skrivebeskyttet hukommelse
Det opstår en segmenteringsfejl. Det vises, når programmet skriver til en del af sit kodesegment eller den skrivebeskyttede del af datasegmentet på kodefejlniveauerne, fordi disse indlæses via operativsystemet i den skrivebeskyttede hukommelse.
b+ træer
Nul pointer dereference
I C og andre C-lignende sprog bruges nul-pegerne til betydning 'peger til intet objekt' og da fejlindikatoren og dereferencing i nul-markøren (en skrivning eller læsning fra en nul-markør) er en meget grundlæggende programfejl.
Standarden siger ikke, at null-markøren ligner pointeren til 0-hukommelsesadressen, selvom det kan være tilfældet. Næsten alle operativsystemer kortlægger adressen på nul-markøren, således at brugen af den fører til en segmenteringsfejl.
Denne adfærd er ikke garanteret af nogen C-standard. I C er nul-markøren derfra udefineret adfærd , og en overensstemmende implementering er tilladt at antage, at en pointer, der er derefereret til, ikke er nul.