logo

Chyba segmentácie v jadre Ubuntu

Čo je to chyba segmentácie?

Porucha segmentácie alebo nasilny vstup ( segfault v skratke) je poruchový stav alebo porucha, ktorá je spôsobená hardvérom s ochranou pamäte a upozorní operačný systém, že sa softvér pokúsil získať prístup do obmedzenej oblasti pamäte (narušenie prístupu do pamäte).

abeceda očíslovaná

Je to všeobecný formulár chyby ochrany na štandardných systémoch x86. V reakcii na to jadro operačného systému zvyčajne implementuje niekoľko nápravných operácií, pričom vo všeobecnosti prenesie túto chybu na proces, ktorý sa dopúšťa, prenesením signálu do procesu.

V niektorých prípadoch môžu procesy nainštalovať obslužný program signálu, ktorý im umožní samy sa zotaviť, ale inak sa používa predvolený obslužný program signálu operačného systému, čo vo všeobecnosti vedie k abnormálnemu ukončeniu procesu a niekedy k vymazaniu jadra.

  • Segmentačné chyby sú základnou triedou chýb v programoch špecifikovaných v mnohých jazykoch ako napr C jazyk, ktorý ponúka nízkoúrovňový prístup do pamäte a niektoré poznať bezpečnostné kontroly.
  • Primárne vznikajú v dôsledku mnohých chýb v ukazovateľoch používaných na adresovanie virtuálnej pamäte, konkrétne nelegálneho prístupu.
  • Iné typy porúch prístupu do pamäte sú a chyba autobusu , čo zahŕňa aj niekoľko príčin.
  • Objavujú sa predovšetkým v dôsledku nepresného adresovania fyzickej pamäte alebo nesprávneho prístupu k pamäti.
  • Toto sú niektoré pamäťové odkazy, ktoré hardvér nedokáže adresovať, namiesto odkazov, ktoré proces nemôže adresovať.
  • Niekoľko programovacích jazykov môže použiť mechanizmy vytvorené na predchádzanie chybám segmentácie a rozvoj bezpečnosti pamäte. napr. na Hrdza programovací jazyk používa model založený na vlastníctve na zaistenie bezpečnosti pamäte. Ďalší podobný jazyk Java a Lisp aplikuje garbage collection, ktorý ignoruje mnohé triedy chýb pamäte, ktoré by mohli spôsobiť chyby segmentácie.

Prehľad chyby segmentácie

  • Chyba segmentácie sa objaví, keď sa ktorýkoľvek program pokúsi o prístup k pamäťovému miestu, ku ktorému nemá povolený prístup, alebo sa pokúsi o prístup k pamäťovému miestu spôsobom, ktorý nie je povolený (napríklad pri pokuse o zápis do miesta určeného len na čítanie alebo o prepísanie časť operačného systému).
  • Vo výpočtovej technike slovo 'segmentácia' má viacero využití. Na spôsob chyby segmentácie, slovo používaného od roku 1950, definuje adresný priestor programu, iba adresný priestor programu je čitateľný s ochranou pamäte, a z toho iba zásobník a časť dátového segmentu na čítanie a zápis. programu je zapisovateľný. Preto pokus o čítanie mimo adresného priestoru programu alebo zápis do časti adresného priestoru určenej len na čítanie má za následok poruchu segmentácie.
  • Chyba segmentácie sa objaví, ak hardvér nájde pokus o odkazovanie na neexistujúci segment, umiestnenie mimo hraníc segmentu alebo umiestnenie v štýle, ktorý nie je povolený povoleniami udelenými pre segment v systémoch používajúcich segmentáciu pamäte hardvér na poskytovanie virtuálnej pamäte.
  • Vo všeobecnosti neplatná chyba stránky spôsobuje chybu segmentácie v systémoch, ktoré používajú iba stránkovanie. Chyby stránky a chyby segmentácie sú chyby vyplývajúce zo systému správy virtuálnej pamäte. Chyba segmentácie sa môže vyskytnúť aj nezávisle od chýb stránky; nelegitímny prístup k akejkoľvek platnej stránke je chybou segmentácie. Chyba segmentácie sa môže objaviť v strede stránky. Vo vnútri a pretečenie vyrovnávacej pamäte ktorý sa nachádza na stránke, ale napríklad nelegálne prepisuje pamäť.
  • Spočiatku chyba vzniká z MMU ( jednotka správy pamäte ) o nelegálnom prístupe, ako časti aspektu ochrany pamäte, alebo o neplatnej chybe stránky na úrovni hardvéru. Ak problémom nie je neplatná logická adresa, ale skôr neplatná fyzická adresa, vzniká skôr chyba zbernice. Takže tieto nie sú vždy rozlíšené.
  • Táto chyba je nájdená a signál je odoslaný do porušujúceho procesu, čím sa zapne obsluha procesu pre tento signál na úrovni operačného systému. Rôzne typy operačných systémov majú odlišné názvy signálov, ktoré označujú, že sa objavila chyba segmentácie.
  • Signál známy ako SIGSEGV (skratka pre porušenie segmentácie ) sa prenesie do problematického procesu v operačných systémoch podobných Unixu. Porušujúci proces dostane výnimku, t.j. STATUS_ACCESS_VIOLATION v systéme Microsoft Windows.

Príčiny chyby segmentácie

Okolnosti, za ktorých sa chyba segmentácie objavuje a ako sa prejavuje, sú špecifické pre operačný systém a hardvér. Rôzny hardvér spôsobuje rôzne chyby za rôznych okolností a rôzne operačné systémy ich transformujú na rôzne signály, ktoré sa posielajú do procesov.

Nastávajúcou príčinou môže byť porušenie prístupu k pamäti, hoci základnou príčinou je softvérová chyba niekoľkých druhov. Ladenie chyby alebo rozhodnutie o hlavnej príčine môže byť jednoduché v niekoľkých prípadoch, v ktorých program bude viesť k chybe segmentácie dôsledne. Vak však môže byť ťažké reprodukovať a v iných prípadoch sa môže spoliehať na pridelenie pamäte pri každom spustení.

Nasleduje niekoľko typických príčin chyby segmentácie:

  • Pokus o prístup k neexistujúcej adrese pamäte (externá k adresnému priestoru procesu)
  • Pokus o prístup k pamäti, na ktorú program nemá práva (napr štruktúry jadra v kontexte procesu)
  • Pokus o zápis pamäte iba na čítanie (napr segment kódu )
  • Na druhej strane, tieto sú často spôsobené mnohými chybami programovania, ktoré vedú k neplatnému prístupu k pamäti:
  • Pokus o spustenie programu, ktorý sa neskompiluje správne. (Niekoľko kompilátorov bude mať za následok spustiteľný súbor bez ohľadu na existenciu chýb v čase kompilácie.)
  • Pretečenie zásobníka
  • Pretečenie vyrovnávacej pamäte
  • Priradenie alebo dereferencovanie k uvoľnenému ukazovateľu (a visiaci ukazovateľ , čo označuje pamäť, ktorá bola vymazaná/uvoľnená/uvoľnená)
  • Priradenie alebo dereferencovanie k an neinicializovaný ukazovateľ (a divoký ukazovateľ , čo označuje adresu náhodnej pamäte)
  • Dereferencovanie na a nulový ukazovateľ zvyčajne označuje adresu, ktorá nie je súčasťou adresného priestoru procesu

Chyby segmentácie sa často objavujú v dôsledku chýb v používaní ukazovateľa, konkrétne v C dynamická alokácia pamäte v C kóde. Dereferencovanie na a nulový ukazovateľ , ktorého výsledkom je nedefinované správanie, povedie k chybe segmentácie. Je to kvôli nulovému ukazovateľu, ktorý nemôže byť platnou adresou pamäte. The visiace ukazovatele a divoké ukazovatele označujú pamäť, ktorá môže alebo nemusí existovať a môže alebo nemusí byť zapisovateľná alebo čitateľná, a preto môže viesť k prechodným chybám.

Vyriešte chybu segmentácie v Ubuntu

Táto chyba môže kedykoľvek zasiahnuť náš systém Ubuntu. Chyba segmentácie je, keď sa náš systém pokúsi o prístup k akejkoľvek stránke pamäte, ktorá neexistuje. Jadro vysypané definuje, kedy sa časť kódu pokúša vykonať operáciu zápisu a čítania na voľnom mieste alebo umiestnení len na čítanie. vo všeobecnosti segfaults sú spojené so súborom s názvom core a vyskytujú sa v čase upgradovania.

Pri vykonávaní niekoľkých príkazov v čase situácie s výpisom jadra sa môžeme stretnúť s 'Nie je možné otvoriť súbor zámku' chyba. Je to kvôli tomu, že sa systém pokúša odobrať kúsok bloku, ktorý neexistuje. Je to kvôli zlyhaniu binárnych súborov niekoľkých špecifických programov.

Môžeme ladiť alebo ustupovať, aby sme to vyriešili, ale riešením je opraviť poškodené balíky vykonaním niektorých krokov, ktoré sú uvedené nižšie:

1. Odstráňte súbory zámku dostupné na odlišných miestach.

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

Chyba segmentácie v jadre Ubuntu

2. Odstránenie vyrovnávacej pamäte úložiska.

 $ sudo apt-get clean all 

Chyba segmentácie v jadre Ubuntu

3. Inovujte a aktualizujte vyrovnávaciu pamäť nášho úložiska.

 $ sudo apt-get update 

Chyba segmentácie v jadre Ubuntu
 $ sudo apt-get upgrade 

Chyba segmentácie v jadre Ubuntu

4. Teraz aktualizujte našu distribúciu, čím sa aktualizujú naše balíčky.

 $ sudo apt-get dist-upgrade 

Chyba segmentácie v jadre Ubuntu

5. Prehľadajte rozbité balíky a násilne ich odstráňte.

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

Skvelý spôsob, ktorý bude vždy fungovať, je okrem príkazového riadku aj nasledujúci:

  1. V režime spustenia spustite Ubuntu kliknutím na Esc kľúč po reštarte.
  2. Vyberte ' Pokročilé možnosti pre Ubuntu
    Chyba segmentácie v jadre Ubuntu
  3. V režime obnovenia spustite Ubuntu a spomenieme niekoľko možností.
  4. Najprv vyberte 'Opravte poškodené balíky'
    Chyba segmentácie v jadre Ubuntu
  5. Potom vyberte „Obnoviť normálne zavádzanie“
    Chyba segmentácie v jadre Ubuntu

Teraz máme dva spôsoby, ako vyriešiť poruchu segmentácie GUI a CLI. Niekedy sa tiež môže stať, že príkaz, t.j. apt nefunguje z dôvodu segfault , takže metóda CLI nebude implementovaná. V takejto situácii sa nemusíte obávať, pretože metóda GUI bude pre nás vždy fungovať.

Riešenie chyby segmentácie

Predvolenou úlohou pre chybu zbernice alebo chybu segmentácie je abnormálne ukončenie procesu, ktorý sa s ňou stretol. Môže byť vytvorený základný súbor na pomoc pri ladení a môžu byť implementované aj iné úlohy závislé od platformy. Napríklad mnohé systémy Linux používajúce grsecurity patch môže sa prihlásiť signály SIGSEGV na monitorovanie možných pokusov o prienik s pretečením vyrovnávacej pamäte.

Na niekoľkých systémoch, ako sú Windows a Linux, je možné, aby chybu segmentácie spravoval samotný program. Spustený program nemôže udalosť len spravovať, ale môže extrahovať aj niekoľko podrobností o jej stave, ako sú hodnoty registra procesora, získanie sledovania zásobníka, riadok zdrojového kódu, keď naň narazil, adresa pamäte, ku ktorej sa pristupovalo neplatne a či išlo o zápis alebo čítanie v závislosti od operačného systému a architektúry.

Porucha segmentácie však definuje, že program má chybu, ktorá vyžaduje opravu, je tiež možné spôsobiť takúto poruchu úmyselne za účelom testovania, ladenia a tiež napodobňovania platforiem, v ktorých sa vyžaduje priamy prístup do pamäte. Systém by mal byť schopný povoliť spustenie programu aj po výskyte chyby v druhom prípade.

V tejto situácii, keď to systém dovolí, je možné riadiť udalosť a zlepšiť počítadlo programu procesora 'skok' o neúspešnom pokyne pokračovať v exekúcii.

Príklady segmentačnej chyby

Chyba segmentácie v jadre Ubuntu

Zápis do pamäte iba na čítanie

Vzniká segmentačná chyba. Objaví sa, keď program zapíše do časti svojho segmentu kódu alebo do časti segmentu údajov len na čítanie na úrovniach chýb kódu, pretože tieto sa načítavajú cez operačný systém do pamäte určenej len na čítanie.

Dereferencia nulového ukazovateľa

V C a iných jazykoch podobných C sa na význam používajú nulové ukazovatele 'ukazovateľ na žiadny objekt' a ako indikátor chyby a dereferencovanie v nulovom ukazovateli (zápis alebo čítanie z nulového ukazovateľa) je veľmi základná chyba programu.

Štandard nehovorí, že nulový ukazovateľ je podobný ukazovateľu na 0 pamäťovú adresu, hoci to tak môže byť. Takmer všetky operačné systémy mapujú adresu nulového ukazovateľa tak, že jeho použitie vedie k chybe segmentácie.

Toto správanie nie je zaručené žiadnym štandardom C. V C je dereferencovanie nulového ukazovateľa nedefinované správanie a vyhovujúca implementácia môže predpokladať, že ukazovateľ, ktorý je dereferencovaný, nie je nulový.

Pretečenie vyrovnávacej pamäte

Pretečenie zásobníka