Što je greška segmentacije?
Greška segmentacije ili kršenje pristupa ( segfault ukratko) je stanje kvara ili greška koju je proizveo hardver sa zaštitom memorije, upozoravajući operativni sustav koji je softver pokušao pristupiti području ograničene memorije (kršenje pristupa memoriji).
To je opći oblik pogreške zaštite na standardnim x86 sustavima. Kao odgovor, jezgra operativnog sustava obično će implementirati nekoliko korektivnih operacija, općenito prebacujući tu pogrešku procesu koji je uvredljiv prijenosom signala procesu.
U nekim slučajevima, procesi mogu instalirati rukovatelja signalima, dopuštajući im da se sami oporave, ali inače se koristi zadani rukovatelj signalima operativnog sustava, što općenito dovodi do abnormalnog prekida procesa, a ponekad i do dumpa jezgre.
- Pogreške segmentacije osnovna su klasa grešaka u programima navedenim u mnogim jezicima kao što su C jezik koji nudi pristup memoriji niske razine i neke sigurnosne provjere.
- Prvenstveno nastaju zbog brojnih grešaka u pokazivačima koji se koriste za adresiranje virtualne memorije, konkretno ilegalnog pristupa.
- Druge vrste grešaka u pristupu memoriji su a greška sabirnice , što također uključuje nekoliko uzroka.
- Pojavljuju se prvenstveno zbog netočnog adresiranja fizičke memorije ili neusklađenog pristupa memoriji.
- Ovo su neke memorijske reference koje hardver ne može adresirati umjesto referenci koje procesu nije dopušteno adresirati.
- Nekoliko programskih jezika može primijeniti mehanizme stvorene za izbjegavanje grešaka u segmentaciji i razvoj sigurnosti memorije. Na primjer, the hrđati programski jezik primjenjuje model koji se temelji na vlasništvu za osiguranje sigurnosti memorije. Drugi jezik poput Java i Lisp primjenjuje skupljanje smeća, koje zanemaruje mnoge klase memorijskih pogrešaka koje bi mogle uzrokovati pogreške u segmentaciji.
Pregled greške segmentacije
- Pogreška segmentacije pojavljuje se kada bilo koji program pokuša pristupiti memorijskoj lokaciji kojoj nije dopušteno pristupiti ili pokuša pristupiti memorijskoj lokaciji na način koji nije dopušten (na primjer, pokušaj pisanja na lokaciju samo za čitanje ili prepisivanje preko dio operativnog sustava).
- U računalstvu, riječ 'segmentacija' ima nekoliko namjena. Na način segmentation fault, riječ koja se koristi od 1950. godine, definira adresni prostor programa, samo je adresni prostor programa čitljiv sa zaštitom memorije, a od toga samo stog i segment podataka za čitanje i pisanje. programa je moguće pisati. Stoga, pokušaj čitanja izvan adresnog prostora programa ili pisanje u dio adresnog prostora koji je samo za čitanje rezultira greškom segmentacije.
- Pogreška segmentacije pojavljuje se ako hardver pronađe pokušaj upućivanja na nepostojeći segment, lokaciju izvan granica segmenta ili lokaciju u stilu koji nije dopušten dopuštenjima danim za segment na sustavima koji koriste segmentaciju memorije hardver za pružanje virtualne memorije.
- Općenito, pogreška nevažeće stranice uzrokuje pogrešku segmentacije na sustavima koji koriste samo straničenje. Pogreške stranice i pogreške segmentacije su pogreške koje proizlaze iz sustava upravljanja virtualnom memorijom. Također, greška segmentacije može se pojaviti neovisno o greškama stranice; nelegitiman pristup bilo kojoj valjanoj stranici je pogreška segmentacije. Pogreška segmentacije može se pojaviti u sredini stranice. Unutar a prekoračenje međuspremnika koji se nalazi na stranici, ali na primjer nezakonito prepisuje memoriju.
- U početku, kvar proizlazi iz MMU ( jedinica za upravljanje memorijom ) na ilegalni pristup, kao segment njegovog aspekta zaštite memorije, ili greška nevažeće stranice na hardverskoj razini. Ako problem nije nevažeća logička adresa, već nevažeća fizička adresa, radije dolazi do pogreške sabirnice. Dakle, oni se ne razlikuju uvijek.
- Ta se pogreška pronađe i signal se šalje procesu koji je povrijedio, uključivanjem rukovatelja procesa za taj signal na razini operativnog sustava. Različite vrste operativnih sustava imaju različite nazive signala koji pokazuju da se pojavila pogreška segmentacije.
- Signal poznat kao SIGSEGV (skraćeno za kršenje segmentacije ) prenosi se u prekršajni proces na operativnim sustavima sličnim Unixu. Prekršajni proces dobiva iznimku, tj. STATUS_ACCESS_VIOLATION na sustavu Microsoft Windows.
Uzroci greške segmentacije
Okolnosti pod kojima se pojavljuje greška segmentacije i kako se manifestira specifični su za operativni sustav i hardver. Različiti hardver uzrokuje različite greške u nekoliko okolnosti, a različiti operativni sustavi ih pretvaraju u različite signale koji se šalju procesima.
Nadolazeći uzrok može biti kršenje pristupa memoriji, iako je temeljni uzrok softverska greška nekoliko vrsta. Otklanjanje pogreške ili utvrđivanje temeljnog uzroka može biti lako u nekoliko slučajeva, u kojima će program stalno dovoditi do greške segmentacije. Međutim, vrećicu bi moglo biti teško reproducirati i oslanjati se na dodjelu memorije pri svakom pokretanju u drugim slučajevima.
pretvoriti niz u cijeli broj
Slijedi nekoliko tipičnih uzroka pogreške segmentacije:
- Pokušaj pristupa nepostojećoj memorijskoj adresi (izvan adresnog prostora procesa)
- Pokušaj pristupa memoriji za koju program nema prava (kao kernel strukture u kontekstu procesa)
- Pokušaj pisanja memorije samo za čitanje (kao segment koda )
- Zauzvrat, oni se često javljaju zbog mnogih programskih pogrešaka koje rezultiraju nevažećim pristupom memoriji:
- Pokušaj izvršavanja programa koji se ne kompajlira ispravno. (Nekoliko prevoditelja rezultirat će izvršnom datotekom bez obzira na postojanje pogrešaka tijekom kompajliranja.)
- Prelijevanje stoga
- Prelijevanje međuspremnika
- Dodjeljivanje ili dereferenciranje oslobođenom pokazivaču (a viseći pokazivač , što označava memoriju koja je izbrisana/deallocirana/oslobođena)
- Dodjeljivanje ili dereferenciranje na neinicijalizirani pokazivač (a divlji ptičar , što označava slučajnu memorijsku adresu)
- Dereferenciranje na a nulti pokazivač obično označava adresu koja nije dio adresnog prostora procesa
Pogreške u segmentaciji često se pojavljuju zbog pogrešaka u korištenju pokazivača, posebno u C dinamička dodjela memorije u C kodu. Dereferenciranje na a nulti pokazivač , što rezultira nedefiniranim ponašanjem, dovest će do greške segmentacije. To je zbog nultog pokazivača koji ne može biti važeća memorijska adresa. The viseće kazaljke i divlji pokazivači označavaju memoriju koja bi mogla ili ne bi mogla postojati i koja bi mogla ili ne bi mogla biti čitljiva ili pisana i stoga može rezultirati prolaznim greškama.
Riješite pogrešku segmentacije u Ubuntuu
Ova pogreška može pogoditi naš Ubuntu sustav u bilo kojem trenutku. Pogreška segmentacije je kada naš sustav pokušava pristupiti bilo kojoj stranici memorije koja ne postoji. Jezgra je bačena definira kada dio koda pokušava izvesti operaciju pisanja i čitanja na slobodnoj lokaciji ili lokaciji samo za čitanje. općenito, segfaults povezani su s datotekom pod nazivom core i događaju se u vrijeme nadogradnje.
Dok izvršavamo nekoliko naredbi u trenutku situacije s dumpom jezgre mogli bismo naići na 'Nije moguće otvoriti zaključanu datoteku' greška. To je zbog toga što sustav pokušava uzeti dio bloka koji ne postoji. To je zbog rušenja binarnih datoteka nekoliko određenih programa.
što je $home linux
Možda otklanjamo pogreške ili se vraćamo unazad kako bismo to riješili, ali rješenje je popraviti pokvarene pakete implementacijom nekih koraka koji su navedeni na sljedeći način:
1. Uklonite zaključane datoteke dostupne na različitim lokacijama.
$ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system
2. Uklanjanje predmemorije spremišta.
$ sudo apt-get clean all
3. Nadogradite i ažurirajte predmemoriju našeg repozitorija.
$ sudo apt-get update
$ sudo apt-get upgrade
4. Sada nadogradite našu distribuciju, ažurirat će naše pakete.
tipovi binarnog stabla
$ sudo apt-get dist-upgrade
5. Pretražite pokvarene pakete i uklonite ih nasilno.
$ sudo dpkg -1 | grep ^..r | apt-get purge
Sjajan način koji će uvijek funkcionirati je sljedeći osim naredbenog retka:
kmp algoritam
- U načinu pokretanja, pokrenite Ubuntu klikom na Esc ključ nakon ponovnog pokretanja.
- Odaberite ' Napredne opcije za Ubuntu
- U načinu oporavka pokrenite Ubuntu i spomenut ćemo nekoliko opcija.
- Prvo odaberite 'Popravi pokvarene pakete'
- Zatim odaberite 'Nastavi normalno pokretanje'
Sada imamo dva načina za rješavanje greške segmentacije GUI i CLI. Ponekad se također može dogoditi da naredba, tj. apt ne radi zbog segfault , pa se CLI metoda neće implementirati. U toj situaciji ne brinite jer će GUI metoda uvijek raditi za nas.
Rukovanje greškom segmentacije
Zadani zadatak za pogrešku sabirnice ili pogrešku segmentacije je abnormalno prekidanje procesa koji je naišao na nju. Datoteka s jezgrom može se proizvesti kao pomoć u otklanjanju pogrešaka, a mogu se implementirati i drugi zadaci ovisni o platformi. Na primjer, mnogi Linux sustavi koji primjenjuju grsigurnosna zakrpa može se prijaviti SIGSEGV signali za praćenje mogućih pokušaja upada s prekoračenjem međuspremnika.
Na nekoliko sustava, kao što su Windows i Linux, moguće je da sam program upravlja pogreškom segmentacije. Program koji se izvodi ne može samo upravljati događajem, već može izdvojiti nekoliko detalja o njegovom statusu kao što su vrijednosti registra procesora, dobivanje praćenja stoga, redak izvornog koda kada je naišao, memorijska adresa kojoj se pristupilo neispravno i je li zadatak bio pisanje ili čitanje, ovisno o operativnom sustavu i arhitekturi.
Međutim, pogreška segmentacije definira da program ima pogrešku koju je potrebno popraviti, također je moguće namjerno izazvati takvu pogrešku u svrhu testiranja, otklanjanja pogrešaka, kao i radi imitiranja platformi u kojima je potreban izravan pristup memoriji. Sustav bi trebao moći dopustiti izvršavanje programa čak i nakon što se pogreška dogodi u potonjem slučaju.
U ovoj situaciji, kada sustav dopušta, moguće je upravljati događajem i poboljšati brojač programa procesora 'skok' o neuspješnoj uputi da se nastavi s izvršenjem.
niz u char Javi
Primjeri grešaka segmentacije
Zapisivanje u memoriju samo za čitanje
Pojavljuje se greška segmentacije. Pojavljuje se kada program piše u dio segmenta koda ili dio segmenta podataka samo za čitanje na razinama pogreške koda jer se one učitavaju preko operativnog sustava u memoriju samo za čitanje.
Dereferencija nultog pokazivača
U C-u i drugim jezicima sličnim C-u, nulti pokazivači se koriste za značenje 'pokazivač na nijedan objekt' i kao indikator greške i dereferenciranje u nultom pokazivaču (pisanje ili čitanje iz nultog pokazivača) vrlo je osnovna programska pogreška.
Standard ne kaže da je nulti pokazivač sličan pokazivaču na 0 memorijsku adresu, iako bi to mogao biti slučaj. Gotovo svi operativni sustavi mapiraju adresu nultog pokazivača tako da njegova upotreba dovodi do pogreške segmentacije.
Ovo ponašanje nije zajamčeno niti jednim C standardom. U C-u je dereferenciranje nultog pokazivača nedefinirano ponašanje , a usklađenoj implementaciji dopušteno je pretpostaviti da pokazivač koji je dereferenciran nije null.