Шта је грешка сегментације?
Грешка сегментације или кршење приступа ( сегфаулт укратко) је стање квара или грешка која настаје због хардвера са заштитом меморије, упозоравајући оперативни систем који је софтвер покушао да приступи ограниченој меморијској области (кршење приступа меморији).
То је општа заштитна грешка на стандардним к86 системима. Као одговор, језгро оперативног система ће обично имплементирати неколико корективних операција, углавном пребацујући ту грешку на процес који крши процес преносом сигнала у процес.
У неким случајевима, процеси могу да инсталирају обрађивач сигнала, што им омогућава да се сами опораве, али у супротном се користи подразумевани руковалац сигналом оперативног система, што генерално доводи до абнормалног завршетка процеса, а понекад и до думп-а језгра.
- Грешке сегментације су основна класа грешака у програмима наведеним на многим језицима као нпр Ц језик који нуди приступ меморији ниског нивоа и неке да знају безбедносне провере.
- Пре свега, они настају због многих грешака у показивачима који се користе за адресирање виртуелне меморије, посебно илегалног приступа.
- Друге врсте грешака у приступу меморији су а грешка аутобуса , што такође укључује неколико узрока.
- Оне се појављују првенствено због нетачног адресирања физичке меморије или неусклађеног приступа меморији.
- Ово су неке меморијске референце које хардвер не може да адресира уместо референци које процесу није дозвољено да адресира.
- Неколико програмских језика може применити механизме креиране за избегавање грешака у сегментацији и развој безбедности меморије. На пример, тхе Руст програмски језик примењује модел заснован на власништву за обезбеђивање безбедности меморије. Други језик као Јава и Лисп примењује сакупљање смећа, које игнорише многе класе грешака у меморији које могу изазвати грешке у сегментацији.
Преглед грешке сегментације
- Грешка сегментације се појављује када било који програм покуша да приступи меморијској локацији којој није дозвољен приступ или покуша да приступи меморијској локацији на начин који није дозвољен (на пример, покушај да упише на локацију само за читање или да препише део оперативног система).
- У рачунарству, реч 'сегментација' има неколико употреба. У смислу грешке сегментације, реч која се користи од 1950. године, дефинише адресни простор програма, само је адресни простор програма читљив са заштитом меморије, а од тога само стек и део за читање-уписивање сегмента података програма је уписив. Отуда, покушај читања изван адресног простора програма или уписивање у део адресног простора који је само за читање резултира грешком сегментације.
- Грешка сегментације се појављује ако хардвер пронађе покушај упућивања на непостојећи сегмент, локацију изван граница сегмента или локацију у стилу који није дозвољен дозволама датим за сегмент на системима који користе сегментацију меморије хардвер за обезбеђивање виртуелне меморије.
- Уопштено, грешка неважеће странице узрокује грешку сегментације на системима који користе само странице. Грешке странице и грешке сегментације су грешке које произилазе из система управљања виртуелном меморијом. Такође, грешка сегментације се може појавити независно од грешака странице; нелегитиман приступ било којој валидној страници је грешка сегментације. Грешка сегментације се може појавити у средини странице. Унутар а буффер оверфлов који се налази на страници, али незаконито преписује меморију, на пример.
- У почетку, грешка је настала из ММУ ( јединица за управљање меморијом ) о незаконитом приступу, као сегменту његовог аспекта заштите меморије, или неважећој грешци странице на нивоу хардвера. Ако проблем није неважећа логичка адреса, већ неважећа физичка адреса, пре настаје грешка магистрале. Дакле, ови се не разликују увек.
- Ова грешка је пронађена и сигнал се шаље процесу који је прекршио, чиме се укључује руковалац процеса за тај сигнал на нивоу оперативног система. Различити типови оперативних система имају различита имена сигнала за индикацију да се појавила грешка сегментације.
- Сигнал познат као СИГСЕГВ (кратак за кршење сегментације ) се преноси у процес који крши Уник оперативне системе. Прекршајни процес добија изузетак, тј. СТАТУС_АЦЦЕСС_ВИОЛАТИОН на Мицрософт Виндовс-у.
Узроци грешке сегментације
Околности под којима се појављује грешка сегментације и како се манифестује специфичне су за оперативни систем и хардвер. Различити хардвер изазива различите грешке у неколико околности и различити оперативни системи их трансформишу у различите сигнале који се шаљу процесима.
Предстојећи узрок може бити кршење приступа меморији, иако је основни узрок софтверска грешка неколико врста. Отклањање грешака или утврђивање основног узрока може бити лако у неколико случајева, у којима ће програм доследно довести до грешке сегментације. Међутим, торбу би могло бити тешко за репродукцију и ослањати се на додељивање меморије при сваком покретању у другим случајевима.
гб вс мб
Ево неколико типичних узрока грешке сегментације:
- Покушај приступа непостојећој меморијској адреси (спољашње у односу на адресни простор процеса)
- Покушај приступа меморији програм нема права на (нпр структуре језгра у контексту процеса)
- Покушај писања меморије само за читање (нпр сегмент кода )
- Заузврат, до њих често долази услед многих програмских грешака које резултирају неважећим приступом меморији:
- Покушај извршавања програма који се не компајлира исправно. (Неколико компајлера ће резултирати извршном датотеком без обзира на постојање грешака у времену компајлирања.)
- Преливање стека
- Преливање бафера
- Додељивање или дереференцирање ослобођеног показивача (а висећи показивач , што указује на меморију која је обрисана/делоцирана/ослобођена)
- Додељивање или дереференцирање ан неиницијализовани показивач (а дивљи показивач , што указује на случајну меморијску адресу)
- Дереференцирање на а нулл показивач обично означава адресу која није део адресног простора процеса
Грешке у сегментацији се често појављују због грешака у коришћењу показивача, посебно у Ц динамичка алокација меморије у Ц коду. Дереференцирање на а нулл показивач , који резултира у недефинисаном понашању, довешће до грешке сегментације. То је због нултог показивача који не може бити важећа меморијска адреса. Тхе висећи показивачи и дивљи показивачи указују на меморију која може или не мора постојати и може или не мора бити уписива или читљива и стога може довести до пролазних грешака.
Решите грешку сегментације у Убунту-у
Ова грешка може погодити наш Убунту систем у било ком тренутку. Грешка сегментације је када наш систем покушава да приступи било којој страници меморије која не постоји. Језгро бачено дефинише када део кода покушава да изврши операцију писања и читања на слободној локацији или локацији само за читање. Обично, сегфаултс су повезани са датотеком под називом језгро и дешавају се у време надоградње.
Док извршавамо неколико команди у време ситуације са испуштањем језгра, могли бисмо наићи на „Није могуће отворити закључану датотеку“ грешка. То је због тога што систем покушава да преузме део блока који не постоји. То је због рушења бинарних датотека неколико специфичних програма.
јава слице
Можда отклањамо грешке или враћамо назад да бисмо то решили, али решење је да поправимо покварене пакете применом неких корака који су наведени у наставку:
1. Уклоните датотеке закључавања које су доступне на различитим локацијама.
$ sudo rm -rvf /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock and restart our system
2. Уклањање кеш меморије.
$ sudo apt-get clean all
3. Надоградите и ажурирајте наше кеш меморије.
$ sudo apt-get update
$ sudo apt-get upgrade
4. Сада надоградите нашу дистрибуцију, она ће ажурирати наше пакете.
пре-ордер обилазак дрвета
$ sudo apt-get dist-upgrade
5. Претражите поломљене пакете и на силу их уклоните.
$ sudo dpkg -1 | grep ^..r | apt-get purge
Одличан начин који ће увек радити је следећи осим командне линије:
нп.цлип
- У режиму покретања, покрените Убунту кликом на изаћи кључ након поновног покретања.
- Изабери ' Напредне опције за Убунту
- У режиму опоравка покрените Убунту и биће нам поменуто неколико опција.
- Прво, изаберите 'Поправи покварене пакете'
- Затим изаберите 'Настави нормално покретање'
Сада имамо два начина да решимо грешку сегментације ГУИ и ЦЛИ. Понекад се такође може десити да команда, односно апт не ради због сегфаулт , тако да ЦЛИ метода неће бити имплементирана. У тој ситуацији, не брините јер ће ГУИ метода увек радити за нас.
Руковање грешком сегментације
Подразумевани задатак за грешку магистрале или грешку сегментације је ненормалан завршетак процеса који је наишао. Датотека језгра може бити произведена да помогне у отклањању грешака, а могу се применити и други задаци зависни од платформе. На пример, многи Линук системи који примењују грсецурити патцх могао би се пријавити СИГСЕГВ сигнали за праћење могућих покушаја упада са преливањем бафера.
На неколико система, као што су Виндовс и Линук, могуће је да сам програм управља грешком сегментације. Програм који је покренут не може само да управља догађајем, већ може да издвоји неколико детаља о његовом статусу као што су вредности регистра процесора, добијање трага стека, линија изворног кода када је наишао, меморијска адреса којој се приступило неисправно и да ли је задатак био писање или читање у зависности од оперативног система и архитектуре.
Међутим, грешка сегментације дефинише да програм има грешку која захтева исправљање, такође је могуће да се такав квар намерно изазове у сврху тестирања, отклањања грешака, као и да се имитирају платформе у којима је потребан директан приступ меморији. Систем би требало да буде у стању да дозволи програму да се изврши чак и након што се грешка догоди у последњем случају.
У овој ситуацији, када систем дозвољава, могуће је управљати догађајем и побољшати бројач програма процесора 'скок' по неуспешној инструкцији да се настави са извршењем.
јавасцрипт коментар
Примери грешке сегментације
Писање у меморију само за читање
Настаје грешка сегментације. Појављује се када програм упише део свог сегмента кода или део сегмента података само за читање на нивоима грешке кода јер се они учитавају преко оперативног система у меморију само за читање.
Дереференцирање нулте показивача
У Ц и другим језицима сличним Ц, нулти показивачи се користе за значење 'показивач на ниједан објекат' а као индикатор грешке и дереференцирање у нултом показивачу (уписивање или читање из нул показивача) је врло основна програмска грешка.
Стандард не каже да је нулти показивач сличан показивачу на меморијску адресу 0, иако би то могао бити случај. Скоро сви оперативни системи мапирају адресу нултог показивача тако да његово коришћење доводи до грешке сегментације.
Ово понашање није гарантовано ниједним Ц стандардом. У Ц, дереференцирање нултог показивача је недефинисано понашање , а усклађеној имплементацији је дозвољено да претпостави да показивач који је дереференциран није нулл.