logo

Segmentacijos gedimo branduolys pašalintas Ubuntu

Kas yra segmentavimo gedimas?

Segmentacijos gedimas arba prieigos pažeidimas ( segfault Trumpai tariant) yra gedimas arba gedimas, atsirandantis dėl aparatinės įrangos su atminties apsauga, įspėjant operacinę sistemą, kurią programinė įranga bandė pasiekti apribotą atminties sritį (prieigos prie atminties pažeidimas).

Tai yra bendra apsaugos gedimo forma standartinėse x86 sistemose. Reaguodama į tai, operacinės sistemos branduolys paprastai įgyvendina keletą korekcinių operacijų, paprastai perduodamas tą gedimą pažeidimo procesui, perduodamas signalą į procesą.

Kai kuriais atvejais procesai gali įdiegti signalų tvarkyklę, leidžiančią jiems patiems atkurti, bet kitu atveju naudojama numatytoji operacinės sistemos signalų tvarkytuvė, dėl kurios paprastai procesas baigiasi neįprastai, o kartais – branduolio iškrovimas.

  • Segmentavimo gedimai yra pagrindinė klaidų klasė programose, nurodytose daugelyje kalbų, pvz C kalba, kuri suteikia prieigą prie žemo lygio atminties, o kai kurios – saugos patikros.
  • Visų pirma, jie atsiranda dėl daugybės klaidų rodyklėse, naudojamose virtualios atminties adresavimui, ypač neteisėtai prieigai.
  • Kiti atminties prieigos gedimų tipai yra a autobuso klaida , kuri taip pat apima keletą priežasčių.
  • Tai pirmiausia atsiranda dėl netikslaus fizinės atminties adresų arba netinkamos prieigos prie atminties.
  • Tai yra keletas atminties nuorodų, kurių aparatinė įranga negali išspręsti, o ne nuorodos, kurių procesui neleidžiama.
  • Keletas programavimo kalbų gali taikyti mechanizmus, sukurtus siekiant išvengti segmentavimo klaidų ir didinti atminties saugumą. Pavyzdžiui, į Rūdys programavimo kalba taiko nuosavybe pagrįstą modelį atminties saugai užtikrinti. Kita kalba kaip Java ir Lisp Taiko šiukšlių rinkimą, kuris nepaiso daugelio atminties klaidų klasių, kurios gali sukelti segmentavimo klaidas.

Segmentavimo gedimo apžvalga

  • Segmentavimo klaida atsiranda, kai kuri nors programa bando pasiekti atminties vietą, kuri jai neleidžiama, arba bando pasiekti atminties vietą neleistinu būdu (pavyzdžiui, bandant rašyti į tik skaitymo vietą arba perrašyti operacinės sistemos dalis).
  • Skaičiuojant žodis 'segmentavimas' turi keletą naudojimo būdų. Segmentavimo klaida, vartojama nuo 1950 m., apibrėžia programos adresų erdvę, tik programos adresų erdvė yra nuskaitoma naudojant atminties apsaugą, o iš to tik dėklas ir duomenų segmento skaitymo ir rašymo dalis. Programa yra rašoma. Taigi, bandant skaityti už programos adresų erdvės ribų arba rašant tik skaitomai adresų erdvės daliai, atsiranda segmentavimo klaida.
  • Segmentavimo klaida atsiranda, jei aparatinė įranga randa bandymą nurodyti neegzistuojantį segmentą, vietą, esančią už segmento ribų, arba vietą, kurios stilius neleidžia segmentui suteiktų leidimų sistemose, kuriose naudojamas atminties segmentavimas. aparatinė įranga virtualiajai atminčiai teikti.
  • Paprastai netinkamas puslapio gedimas sukelia segmentavimo gedimą sistemose, naudojančiose tik puslapius. Puslapio gedimai ir segmentavimo gedimai yra gedimai, atsirandantys dėl virtualios atminties valdymo sistemos. Be to, segmentavimo klaida gali atsirasti nepriklausomai nuo puslapio klaidų; neteisėta prieiga prie bet kurio galiojančio puslapio yra segmentavimo klaida. Segmentavimo klaida gali atsirasti puslapio viduryje. Viduje a buferio perpildymas kuri yra puslapyje, bet, pavyzdžiui, nelegaliai perrašo atmintį.
  • Iš pradžių gedimas kyla iš MMU ( atminties valdymo blokas ). Jei problema yra ne neteisingas loginis adresas, o netinkamas fizinis adresas, greičiau atsiranda magistralės klaida. Taigi, jie ne visada skiriasi.
  • Šis gedimas randamas ir signalas siunčiamas pažeidimo procesui, įjungiant to signalo proceso tvarkyklę operacinės sistemos lygiu. Įvairių tipų operacinės sistemos turi skirtingus signalų pavadinimus, nurodančius, kad atsirado segmentavimo klaida.
  • Signalas, žinomas kaip SIGSEGV (trumpai segmentacijos pažeidimas ) perkeliamas į pažeidimo procesą Unix tipo operacinėse sistemose. Pažeidimo procesui taikoma išimtis, t.y. STATUS_ACCESS_VIOLATION „Microsoft Windows“.

Segmentacijos gedimo priežastys

Aplinkybės, kuriomis atsiranda segmentavimo klaida ir kaip ji pasireiškia, priklauso nuo operacinės sistemos ir aparatinės įrangos. Skirtinga aparatinė įranga sukelia skirtingus gedimus dėl kelių aplinkybių, o skirtingos operacinės sistemos paverčia juos skirtingais signalais, kurie siunčiami procesams.

Būsima priežastis gali būti prieigos prie atminties pažeidimas, nors pagrindinė priežastis yra kelių rūšių programinės įrangos klaida. Kai kuriais atvejais gali būti lengva ištaisyti klaidą arba nustatyti pagrindinę priežastį, kai programa nuolatos sukels segmentavimo gedimą. Tačiau maišelį gali būti sunku atkurti ir kitais atvejais pasikliauti atminties paskirstymu kiekvieną kartą.

xd prasmė

Toliau pateikiamos kelios tipiškos segmentavimo gedimo priežastys:

  • Bandymas pasiekti neegzistuojantį atminties adresą (išorėje proceso adresų erdvėje)
  • Bandymas pasiekti atmintį programa neturi teisių (pvz branduolio struktūros proceso kontekste)
  • Bandymas įrašyti tik skaitymo atmintį (pvz kodo segmentas )
  • Savo ruožtu tai dažnai kyla dėl daugybės programavimo klaidų, kurios sukelia netinkamą prieigą prie atminties:
  • Bandoma paleisti programą, kuri netinkamai kompiliuojama. (Kai kurie kompiliatoriai sukurs vykdomąjį failą, nepaisant kompiliavimo laiko klaidų.)
  • Krūvos perpildymas
  • Buferio perpildymas
  • Atlaisvinto rodyklės priskyrimas arba nuorodos panaikinimas (a kabantis rodyklė , kuris rodo atmintį, kuri buvo ištrinta/atskirta/atlaisvinta)
  • Priskyrimas arba nuorodos panaikinimas neinicijuotas žymeklis (a laukinis rodyklė , kuris nurodo atsitiktinį atminties adresą)
  • Nuoroda į a nulinis rodyklė paprastai nurodo adresą, kuris nėra proceso adresų erdvės dalis

Segmentavimo gedimai dažnai atsiranda dėl klaidų naudojant žymeklį, ypač į C dinaminis atminties paskirstymas C kode. Nuoroda į a nulinis rodyklė , kurios rezultatas neapibrėžtas elgesys sukels segmentavimo gedimą. Taip yra dėl nulinės rodyklės, kuri negali būti tinkamas atminties adresas. The kabantys rodyklės ir laukiniai rodyklės nurodo atmintį, kuri gali egzistuoti arba neegzistuoti ir gali būti arba negali būti įrašoma arba skaitoma, todėl gali atsirasti trumpalaikių klaidų.

Išspręskite segmentavimo gedimą Ubuntu

Ši klaida bet kuriuo metu gali ištikti mūsų Ubuntu sistemą. Segmentavimo klaida yra tada, kai mūsų sistema bando pasiekti bet kurį atminties puslapį, kurio nėra. Šerdis išmestas apibrėžia, kada kodo dalis bando atlikti rašymo ir skaitymo operaciją laisvoje arba tik skaitymo vietoje. Apskritai, segfaults yra susieti su failu, pavadintu core, ir įvyksta atnaujinimo metu.

java int kaip eilutę

Vykdydami kelias komandas pagrindinės iškelties situacijos metu galime susidurti su „Neįmanoma atidaryti užrakto failo“ klaida. Taip yra dėl to, kad sistema bando užimti nedidelį bloką, kurio nėra. Taip yra dėl kelių konkrečių programų dvejetainių failų gedimo.

Galime derinti arba atšaukti, kad tai išspręstume, tačiau sprendimas yra sugadintus paketus pataisyti, įgyvendinant kelis veiksmus, kurie paminėti taip:

1. Pašalinkite skirtingose ​​vietose esančius užrakto failus.

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

Segmentacijos gedimo branduolys pašalintas Ubuntu

2. Saugyklos talpyklos pašalinimas.

 $ sudo apt-get clean all 

Segmentacijos gedimo branduolys pašalintas Ubuntu

3. Atnaujinkite ir atnaujinkite mūsų saugyklos talpyklą.

 $ sudo apt-get update 

Segmentacijos gedimo branduolys pašalintas Ubuntu
 $ sudo apt-get upgrade 

Segmentacijos gedimo branduolys pašalintas Ubuntu

4. Dabar atnaujinkite platinimą, tai atnaujins mūsų paketus.

neapibrėžtas nuolydis
 $ sudo apt-get dist-upgrade 

Segmentacijos gedimo branduolys pašalintas Ubuntu

5. Suraskite sulaužytas pakuotes ir išimkite jas jėga.

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

Puikus būdas, kuris visada veiks, yra toks, išskyrus komandinę eilutę:

  1. Paleisties režimu paleiskite Ubuntu spustelėdami Esc raktas po perkrovimo.
  2. pasirinkti ' Išplėstinės Ubuntu parinktys
    Segmentacijos gedimo branduolys pašalintas Ubuntu
  3. Atkūrimo režimu paleiskite Ubuntu ir bus paminėtos kelios parinktys.
  4. Pirmiausia pasirinkite „Pataisyti sugedusias pakuotes“
    Segmentacijos gedimo branduolys pašalintas Ubuntu
  5. Tada pasirinkite „Tęsti įprastą paleidimą“
    Segmentacijos gedimo branduolys pašalintas Ubuntu

Dabar turime du būdus, kaip išspręsti segmentavimo gedimą GUI ir CLI. Kartais taip pat gali atsitikti taip, kad komanda, ty apt, neveikia dėl segfault , todėl CLI metodas nebus įgyvendintas. Esant tokiai situacijai, nesijaudinkite, nes GUI metodas mums visada tiks.

Segmentavimo gedimo tvarkymas

Numatytoji magistralės klaidos arba segmentavimo gedimo užduotis yra nenormalus proceso, su kuriuo ji susidūrė, nutraukimas. Gali būti sukurtas pagrindinis failas, padedantis derinti, taip pat gali būti įgyvendintos kitos nuo platformos priklausančios užduotys. Pavyzdžiui, daugelis Linux sistemų taiko grsecurity pleistras gali prisijungti SIGSEGV signalai galimų bandymų įsilaužti su buferio perpildymu stebėjimui.

Kai kuriose sistemose, pvz., „Windows“ ir „Linux“, pati programa gali valdyti segmentavimo gedimą. Vykdoma programa gali ne tik valdyti įvykį, bet gali išgauti keletą detalių apie jo būseną, pvz., procesoriaus registro reikšmes, kamino sekimo gavimą, šaltinio kodo eilutę, kai jis buvo aptiktas, atminties adresą, prie kurio buvo pasiekta netinkamai, ir ar užduotis buvo rašymas ar skaitymas, priklausomai nuo operacinės sistemos ir architektūros.

eilutė pridėti

Tačiau segmentavimo gedimas apibrėžia, kad programoje yra klaida, kurią reikia taisyti, taip pat galima tyčia sukelti tokį gedimą testavimo, derinimo tikslais, taip pat imituojant platformas, kuriose reikalinga tiesioginė prieiga prie atminties. Sistema turi turėti galimybę leisti programai vykdyti net ir įvykus klaidai pastaruoju atveju.

Esant tokiai situacijai, kai sistema leidžia, galima valdyti įvykį ir patobulinti procesoriaus programą 'šokinėti' dėl neįvykusio nurodymo tęsti vykdymą.

Segmentavimo gedimo pavyzdžiai

Segmentacijos gedimo branduolys pašalintas Ubuntu

Rašymas į tik skaitymo atmintį

Tai sukelia segmentavimo gedimą. Jis pasirodo, kai programa įrašo į savo kodo segmento dalį arba tik skaitomą duomenų segmento dalį kodo klaidų lygiais, nes jie per operacinę sistemą įkeliami į tik skaitymo atmintį.

Nulinės rodyklės nuorodos panaikinimas

C ir kitose į C panašiose kalbose nulinės rodyklės naudojamos reikšmei 'rodiklis į jokį objektą' o kaip klaidos indikatorius ir nuorodos panaikinimas nulinėje rodyklėje (rašymas arba skaitymas iš nulinės rodyklės) yra labai paprasta programos klaida.

Standartas nesako, kad nulinė rodyklė yra panaši į rodyklę į 0 atminties adresą, nors taip gali būti. Beveik visos operacinės sistemos nulinės rodyklės adresą susieja taip, kad naudojant jį atsiranda segmentavimo klaida.

Tokio elgesio negarantuoja joks C standartas. C kalboje nulinės rodyklės panaikinimas yra neapibrėžtas elgesys , o atitinkamam įgyvendinimui leidžiama daryti prielaidą, kad rodyklė, kurios nuoroda nėra, nėra nulinė.

Buferio perpildymas

Kamino perpildymas