Грешка в сегментирането на Ubuntu

Програмите в Linux не винаги се изпълняват според очакванията. Понякога по различни причини програмата дава грешка вместо нормална работа. Но ние не се нуждаем от грешка, ние се нуждаем от програма или по-скоро от функцията, която тя трябва да изпълнява. Днес ще говорим за една от най-сериозните и неразбираеми грешки. Това е грешка в сегментирането на Ubuntu. Ако такава грешка се появи само веднъж, тогава можете да я игнорирате, но ако това е редовно, трябва да направите нещо.

Разбира се, този проблем се случва не само в Ubuntu, но и във всички Linux дистрибуции, така че нашите инструкции ще бъдат от значение и за тях. Но ще се съсредоточим основно върху Ubuntu. Помислете какво е грешка в сегментирането на Linux, защо се появява, както и как да се справите с нея и какво да направите.

Какво представлява грешката в сегментирането?

Грешка в сегментирането, грешка в сегментирането или Segfault или SIGSEGV в Ubuntu и други Unix-подобни дистрибуции означава грешка в паметта. Когато получите тази грешка, това означава, че механизмът за защита на системната памет се задейства, тъй като програмата се е опитала да осъществи достъп или да напише данни в част от паметта, която няма разрешение за достъп.

За да разберем защо се случва това, нека разгледаме как работи работата с паметта в Linux, ще се опитам да опростя всичко, но това е приблизително как работи.

Защо възниква грешка в сегментирането?

И защо една прилична програма да се изкачва там, където не би трябвало? Да, по принцип няма нужда. Това се случва поради грешка в писането на програми или несъвместими версии на библиотеки и софтуер. Тази грешка често се появява в C или C ++ програми. На този език програмистите могат да работят ръчно с памет и езикът от своя страна не контролира, че го правят правилно, така че един неправилен достъп до паметта може да срине програмата.

Защо мога да получа тази грешка, когато библиотеките са несъвместими? По същата причина - неправилен достъп до паметта. Представете си, че имаме Linux библиотека (набор от функции), която има функция, която изпълнява конкретна задача. Нашата функция се нуждае от данни, за да работи, така че трябва да предаде низ, когато се извика. Нашата стара версия на библиотеката очаква низът да бъде с дължина до 256 знака. Но програмата е актуализирана, форматът на запис се е променил и сега тя прехвърля низ от 512 знака в библиотеката. Ако актуализирате програмата, но оставите старата версия на библиотеката, тогава при прехвърляне на такъв низ 256 символа ще бъдат записани нормално на подготвеното място, но вторият 256 ще замени данните на програмата и вероятно ще се опита да надхвърли сегмент, тогава ще има грешка в сегментирането на Linux.

Какво да направите, ако възникне грешка в сегментирането?

Ако смятате, че това е грешка в програмата, просто трябва да изпратите доклад за грешка на разработчиците. Но все пак можете да опитате да направите нещо.

Например, ако неизвестна програма се срине с грешка в сегментирането, тогава можем да решим, че вината е на разработчиците, но ако chrome или firefox се срине с такава грешка при стартиране, възниква въпросът, правим ли нещо нередно? В крайна сметка това са вече добре тествани програми.

Първото нещо, което трябва да направите, е да актуализирате системата до последната версия, може би е имало грешка и тя вече е била отстранена, или може би имате инсталирани стари версии на библиотеки и актуализацията ще реши проблема. Ubuntu го прави по следния начин:

sudo apt-get update
$ sudo apt-get dist-upgrade

Ако това не помогне, трябва да възстановите настройките на програмата до стойностите по подразбиране, евентуално да изтриете кеша. Настройките на програмата в Linux обикновено се съдържат в домашната папка, скрити поддиректории с името на програмата. Също така, настройките и кешът могат да се съдържат в директории

/.cache. Просто изтрийте програмните папки и опитайте да го стартирате отново. Ако това не помогне, можете да опитате да деинсталирате програмата напълно и след това да я инсталирате отново, може би някои зависимости са повредени:

sudo apt премахнете program_package
$ sudo apt-get autoremove
$ sudo apt инсталира program_package

Ако е възможно, опитайте да инсталирате програмата от друг източник, например не от PPA, а по-стара версия, от официалните хранилища.

Когато сте направили всичко това, най-вероятно проблемът не е във вашата дистрибуция, а в самата програма. Трябва да изпратите отчет на разработчиците. В Ubuntu това може да стане с помощта на програмата apport-bug. Ubuntu обикновено ви подканва да направите това веднага след излизането на програмата с грешка в сегментирането. Ако грешката при сегментирането на Ubuntu не се появи в системната програма, ще трябва сами да потърсите разработчиците и ръчно да опишете какво се е случило.

За да помогнете на разработчиците да разрешат проблема, не е достатъчно да им изпратите само съобщение, че сте открили грешка в сегментирането, трябва да опишете проблема подробно, стъпките, които сте извършили преди, за да може разработчикът да ги възпроизведе. Също така е препоръчително да прикачите към отчета последните функции, които програмата е извикала (стекът от извиквания на функции), това може значително да помогне на разработчиците.

Нека да видим как да го получим. Не е толкова трудно. Първо стартирайте програмата си, след това разберете нейния PID с командата:

След това стартирайте дебъгера на gdb:

Свързваме се с програмата:

(gdb) прикачете your_pid

След като свържете програмата на пауза, ние продължаваме нейното изпълнение с командата:

грешка

Тогава всичко, което трябва да направите, е да хвърлите грешка:

сегментирането

И въведете командата, която ще покаже стека на последните повиквания:

Резултатът от тази команда трябва да бъде изпратен на разработчиците. За да прекратите връзката с програмата и да излезете, напишете:

(gdb) отделяне
(gdb) напусна

След това остава да изпратите отчет и да изчакате грешката да бъде коригирана. Ако не сте сигурни каква е грешката в програмата, можете да попитате във форумите. Когато имате стек разговори, вече можете да опитате, ако не разбирате какъв е проблемът, опитайте да разберете дали някой друг е срещал подобен проблем.

сегментирането

ubuntu

сегментирането

сегментирането

Оценете статията:

Основател и администратор на сайта losst.ru, обичам софтуера с отворен код и операционната система Linux. В момента използвам Ubuntu като основната си операционна система. Освен Linux, аз се интересувам от всичко, свързано с информационните технологии и съвременната наука.

Благодаря, беше много интересно да прочета за дебъгера.

Всъщност не мога да се отърва от това. Остава ми да зарежа всичко на стария си компютър с 1024 мегабайта RAM. Постоянни грешки при сегментиране, когато правя комплимент на програма. За да компилирате ядрото, трябва да напишете направи милион пъти ! Точно сега ще изхвърля компютъра и ще си купя нов и мисля, че проблемът ще бъде решен от само себе си.