Ce este o eroare de segmentare?
Eroare de segmentare sau violare de acces ( segfault pe scurt) este o condiție de defecțiune sau o defecțiune care apare de hardware cu protecție a memoriei, alertând un sistem de operare pe care software-ul a încercat să acceseze o zonă de memorie restricționată (o încălcare a accesului la memorie).
Este o formă de eroare de protecție generală pe sistemele x86 standard. Ca răspuns, nucleul sistemului de operare va implementa, de obicei, câteva operațiuni corective, în general, transferând acea defecțiune procesului care agravează prin transferarea unui semnal către proces.
În unele cazuri, procesele pot instala un handler de semnal, permițându-le să se recupereze pe cont propriu, dar în caz contrar, se folosește handlerul de semnal implicit al sistemului de operare, ceea ce duce în general la terminarea anormală a procesului și, uneori, la o descărcare de bază.
- Defecțiunile de segmentare sunt o clasă de eroare de bază în programele specificate în multe limbi, cum ar fi C limbaj care oferă acces la memorie de nivel scăzut și unele pentru a cunoaște verificările de siguranță.
- În primul rând, apar din cauza multor erori în pointerii utilizați pentru adresarea memoriei virtuale, în special din cauza accesului ilegal.
- Alte tipuri de erori de acces la memorie sunt a eroare de magistrală , care include și mai multe cauze.
- Acestea apar în principal din cauza adreselor inexacte ale memoriei fizice sau a accesului nealiniat la memorie.
- Acestea sunt niște referințe de memorie pe care hardware-ul nu le poate aborda în loc de referințe pe care procesul nu este permis să le abordeze.
- Mai multe limbaje de programare ar putea aplica mecanisme create pentru evitarea erorilor de segmentare și dezvoltarea siguranței memoriei. De exemplu, cel Rugini limbajul de programare aplică un model bazat pe proprietate pentru a asigura siguranța memoriei. O altă limbă ca Java și Lisp aplică colectarea gunoiului, care ignoră multe clase de erori de memorie care ar putea cauza erori de segmentare.
Prezentare generală a erorii de segmentare
- O eroare de segmentare apare atunci când orice program încearcă să acceseze o locație de memorie care nu este permisă pentru accesare sau încearcă să acceseze o locație de memorie într-un mod care nu este permis (de exemplu, încercarea de a scrie într-o locație numai pentru citire sau pentru suprascrierea partea sistemului de operare).
- În informatică, cuvântul 'segmentare' are mai multe utilizări. La modul de eroare de segmentare, cuvânt folosit din 1950, definește spațiul de adrese al programului, doar spațiul de adrese al programului este citibil cu protecție de memorie, iar din aceasta, doar stiva și porțiunea de citire-scriere a segmentului de date. programului este inscriptibil. Prin urmare, încercarea de citire în afara spațiului de adresă al programului sau scrierea în partea de numai citire a spațiului de adrese are ca rezultat o eroare de segmentare.
- Apare o eroare de segmentare dacă hardware-ul găsește o încercare de referire la un segment inexistent, o locație externă limitelor segmentului sau o locație într-un stil nepermis de permisiunile acordate pentru segment pe sistemele care utilizează segmentarea de memorie a hardware-ul pentru furnizarea memoriei virtuale.
- În general, o eroare de pagină nevalidă cauzează o eroare de segmentare a sistemelor care utilizează numai paginarea. Defecțiunile de pagină și erorile de segmentare sunt ambele defecțiuni care decurg din sistemul de gestionare a memoriei virtuale. De asemenea, defecțiunile de segmentare pot apărea independent de erorile de pagină; accesul nelegitim la orice pagină validă este vina de segmentare. Eroare de segmentare poate apărea în mijlocul unei pagini. În interiorul a depășirea tamponului care se află într-o pagină, dar suprascrie memoria ilegal, de exemplu.
- Inițial, vina provine din MMU ( unitate de gestionare a memoriei ) privind accesul ilegal, ca segment al aspectului său de protecție a memoriei, sau o eroare de pagină nevalidă la nivel hardware. Dacă problema nu este o adresă logică invalidă, ci mai degrabă o adresă fizică invalidă, apare mai degrabă eroarea magistralei. Deci, acestea nu se disting întotdeauna.
- Această defecțiune este găsită și este trimis un semnal către procesul ofensator, activând handlerul procesului pentru acel semnal la nivelul sistemului de operare. Diferite tipuri de sisteme de operare au nume distincte de semnal pentru a indica faptul că a apărut o eroare de segmentare.
- Un semnal cunoscut ca SIGSEGV (scurt pentru încălcarea segmentării ) este transferat la procesul ofensator pe sistemele de operare asemănătoare Unix. Procesul infracțional primește o excepție, și anume, STATUS_ACCESS_VIOLATION pe Microsoft Windows.
Cauzele erorii de segmentare
Circumstanțele în care apare o eroare de segmentare și modul în care se manifestă sunt specifice sistemului de operare și hardware-ului. Hardware diferit apare diferite defecte pentru mai multe circumstanțe și diferite sisteme de operare le transformă în semnale diferite care sunt trimise proceselor.
Cauza viitoare poate fi o încălcare a accesului la memorie, deși cauza de bază este o eroare software de câteva feluri. Depanarea unei erori sau decizia cauzei principale poate fi ușoară în câteva cazuri, în care programul va duce la o eroare de segmentare în mod constant. Cu toate acestea, geanta ar putea fi dificil de reprodus și să se bazeze pe alocarea memoriei la fiecare rulare în alte cazuri.
Următoarele sunt câteva cauze tipice ale defecțiunii de segmentare:
- Încercarea de a accesa o adresă de memorie inexistentă (externă spațiului de adrese al procesului)
- Încercarea de a accesa memoria unui program nu are drepturi (cum ar fi structurile nucleului în contextul procesului)
- Încercarea de a scrie memorie numai pentru citire (cum ar fi segment de cod )
- La rândul lor, acestea apar adesea de multe erori de programare care au ca rezultat accesul nevalid la memorie:
- Încercarea de a executa un program care nu se compila corect. (Câteva compilatoare vor avea ca rezultat un fișier executabil, indiferent de existența erorilor de compilare.)
- Un preaplin de stivă
- O depășire a tamponului
- Atribuirea sau dereferențiarea unui pointer eliberat (a indicatorul atârnând , care indică memoria care a fost ștearsă/dealocată/eliberată)
- Atribuirea sau dereferențiarea unui indicator neinițializat (A indicator sălbatic , care indică o adresă de memorie aleatorie)
- Dereferentarea la a indicator nul de obicei indică o adresă care nu face parte din spațiul de adrese al procesului
Defecțiunile de segmentare apar adesea din cauza erorilor în utilizarea unui pointer, în special în C alocarea memoriei dinamice în codul C. Dereferentarea la a indicator nul , care are ca rezultat un comportament nedefinit, va duce la o eroare de segmentare. Se datorează unui pointer nul care nu poate fi o adresă de memorie validă. The indicatori atârnând și indicatoare sălbatice indică o memorie care ar putea sau nu să existe și care ar putea sau nu poate fi scrisă sau citită și, astfel, poate avea ca rezultat erori tranzitorii.
Rezolvați eroarea de segmentare în Ubuntu
Această eroare ar putea lovi sistemul nostru Ubuntu în orice moment. Eroare de segmentare este atunci când sistemul nostru încearcă să acceseze orice pagină de memorie care nu există. Miez aruncat definește când o parte de cod încearcă să efectueze o operație de scriere și citire într-o locație liberă sau numai pentru citire. În general, defecte de seg sunt asociate cu un fișier numit core și au loc în momentul actualizării.
În timp ce executăm câteva comenzi în momentul situației de descărcare de bază, am putea întâlni „Nu se poate deschide fișierul de blocare” eroare. Se datorează faptului că sistemul încearcă să ia un bloc care nu există. Este din cauza prăbușirii fișierelor binare ale câtorva programe specifice.
Este posibil să depanăm sau să facem înapoi pentru a o rezolva, dar soluția este să remediam pachetele rupte prin implementarea unor pași care sunt menționați după cum urmează:
1. Eliminați fișierele de blocare disponibile în locații distincte.
alfabet și numere
$ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system
2. Eliminarea memoriei cache a depozitului.
$ sudo apt-get clean all
3. Actualizați și actualizați memoria cache a depozitului.
$ sudo apt-get update
$ sudo apt-get upgrade
4. Acum actualizați distribuția noastră, va actualiza pachetele noastre.
$ sudo apt-get dist-upgrade
5. Căutați pachetele sparte și îndepărtați-le cu forță.
$ sudo dpkg -1 | grep ^..r | apt-get purge
O modalitate excelentă care va funcționa întotdeauna este următoarea, în afară de linia de comandă:
- În modul de pornire, rulați Ubuntu făcând clic pe Esc cheie după repornire.
- alege ' Opțiuni avansate pentru Ubuntu
- În modul de recuperare rulați Ubuntu și vom fi menționate mai multe opțiuni.
- În primul rând, alegeți „Reparați pachetele rupte”
- Apoi, alegeți „Reluați încărcarea normală”
Acum, avem două moduri de a rezolva erorile de segmentare GUI și CLI. Uneori, se poate întâmpla și ca comanda, adică apt să nu funcționeze din cauza segfault , deci metoda CLI nu se va implementa. În această situație, nu vă faceți griji, deoarece metoda GUI va funcționa întotdeauna pentru noi.
Manevrarea erorii de segmentare
Sarcina implicită pentru o eroare de magistrală sau o eroare de segmentare este terminarea anormală a unui proces care a întâlnit-o. Un fișier de bază poate fi produs pentru a ajuta la depanare și pot fi, de asemenea, implementate alte sarcini dependente de platformă. De exemplu, multe sisteme Linux care aplică plasture grsecurity s-ar putea înregistra semnale SIGSEGV pentru monitorizarea posibilelor tentative de intruziune cu depășiri de buffer.
Pe câteva sisteme, precum Windows și Linux, este posibil ca un program însuși să gestioneze o eroare de segmentare. Programul care rulează nu poate doar să gestioneze evenimentul, ci ar putea extrage câteva detalii despre starea acestuia, cum ar fi valorile registrului procesorului, obținerea unei urme a stivei, linia unui cod sursă când a fost întâlnit, adresa de memorie care a fost accesată incorect și dacă sarcina a fost o scriere sau o citire în funcție de sistemul de operare și arhitectură.
Cu toate acestea, o eroare de segmentare definește că un program are o eroare care necesită remediere, este, de asemenea, posibil să provoace o astfel de eroare în mod intenționat în scopul testării, depanării și, de asemenea, pentru a imita platformele în care este necesar accesul direct la memorie. Sistemul ar trebui să poată permite programului să se execute chiar și după ce eroarea apare în ultimul caz.
În această situație, atunci când sistemul permite, este posibil să se gestioneze evenimentul și să îmbunătățească contorul programului procesorului 'a sari' asupra instrucțiunii eșuate de a continua execuția.
Exemple de eroare de segmentare
Scrierea în memoria numai pentru citire
Apare o eroare de segmentare. Apare atunci când programul scrie într-o parte a segmentului său de cod sau în partea de numai citire a segmentului de date la nivelurile de eroare a codului, deoarece acestea sunt încărcate prin sistemul de operare în memoria de numai citire.
Dereferința indicatorului nul
În C și în alte limbaje asemănătoare C, pointerii nuli sunt folosiți pentru semnificație „indicator către niciun obiect” și ca indicator de eroare și dereferențierea în pointerul nul (o scriere sau citire dintr-un pointer nul) este o eroare de program foarte de bază.
Standardul nu spune că pointerul nul este similar cu indicatorul către adresa de memorie 0, deși acesta ar putea fi cazul. Aproape toate sistemele de operare mapează adresa pointerului nul astfel încât utilizarea acestuia duce la o eroare de segmentare.
Acest comportament nu este garantat de niciun standard C. În C, dereferențiarea pointerului nul este comportament nedefinit , iar o implementare conformă este permisă să presupună că un pointer care este dereferențiat nu este nul.