Помилка сегментування Ubuntu, Losst

Не завжди програми в Linux запускаються як належить. Іноді через різні причини програма замість нормальної роботи видає помилку. Але нам не потрібна помилка, нам потрібна програма, вірніше та функція, яку вона повинна виконувати. Сьогодні ми поговоримо про одну з найсерйозніших помилок. Це помилка сегментації Ubuntu. Якщо така помилка відбувається лише один раз, то на неї можна не зважати, але якщо це регулярне явище потрібно щось робити.

Звичайно, трапляється ця проблема не тільки в Ubuntu, а в усіх дистрибутивах Linux, тому наша інструкція буде актуальна для них теж. Але ми зосередимося в основному на Ubuntu. Розглянемо, що таке помилка сегментування linux, чому вона виникає, а також як з цим боротися і що робити.

Що таке помилка сегментації?

Помилка сегментації, Segmentation fault, Segfault, або SIGSEGV в Ubuntu та інших Unix подібних дистрибутивах, означає помилку роботи з пам'яттю. Коли ви отримуєте цю помилку, це означає, що спрацьовує системний механізм захисту пам'яті, тому що програма спробувала отримати доступ або записати дані до тієї частини пам'яті, до якої вона не має права звертатися.

Щоб зрозуміти чому так відбувається, давайте розглянемо як влаштована робота з пам'яттю в Linux, я спробую все спростити, але так воно і працює.

Чому виникає помилка сегментації?

І навіщо б це порядній програмі лізти, куди їй не належить? Та в принципі, нема чого. Це відбувається через помилку при написанні програм або несумісних версіях бібліотек та програмного забезпечення. Часто ця помилка зустрічається у програмах на Сі чи C++. У цій мові програмісти можуть працювати вручну з пам'яттю, а мова зі свого боку не контролює, щоб вони це робили.правильно, тому одне неправильне звернення до пам'яті може обрушити програму.

Чому ця помилка може виникати при несумісності бібліотек? З тієї ж причини – неправильне звернення до пам'яті. Припустимо, що у нас є бібліотека linux (набір функцій), в якій є функція, яка виконує певне завдання. Для роботи нашої функції потрібні дані, тому при виклику потрібно передати рядок. Наша стара версія бібліотеки очікує, що довжина рядка буде до 256 символів. Але програма була оновлена, формат запису змінився, і тепер вона передає бібліотеці рядок розміром 512 символів. Якщо оновити програму, але залишити стару версію бібліотеки, при передачі такого рядка 256 символів запишуться нормально в підготовлене місце, а ось другі 256 перезапишуть дані програми, і можливо, спробують вийти за межі сегмента, тоді і буде помилка сегментування linux.

Що робити, якщо виникла помилка сегментування?

Якщо ви думаєте, що це помилка в програмі, то вам залишається лише надіслати звіт про помилку розробникам. Але ви все-таки можете спробувати щось зробити.

Наприклад, якщо падає з помилкою сегментації невідома програма, то ми можемо вирішити, що це вина розробників, але якщо з такою помилкою падає chrome або firefox при запуску виникає питання, може ми робимо щось не так? Адже це вже добре протестовані програми.

Перше, що потрібно зробити - це оновити систему до останньої версії, можливо, був баг і його вже виправили, а може, у вас встановлені старі версії бібліотек і оновлення вирішить проблему. У Ubuntu це робиться так:

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

Якщо це не допомогло, потрібно обнулити налаштування програми до значень за промовчанням, можливо, видалитикеш. Налаштування програм у Linux зазвичай містяться в домашній папці, прихованих підкаталогах з ім'ям програми. Також, налаштування та кеш можуть міститися в каталогах

/. Cache. Просто видаліть папки програми та спробуйте її знову запустити. Якщо це не допомогло, ви можете спробувати повністю видалити програму, а потім знову її встановити, можливо, якісь залежності були пошкоджені:

sudo apt remove пакет_програми $ sudo apt-get autoremove $ sudo apt install пакет_програми

Якщо є можливість, спробуйте встановити програму з іншого джерела, наприклад, не з PPA, а старішу версію, з офіційних репозиторіїв.

Коли ви все це виконали, швидше за все, проблема не у вашому дистрибутиві, а у самій програмі. Потрібно надсилати звіт розробникам. У Ubuntu це можна зробити за допомогою програми apport-bug. Зазвичай Ubuntu пропонує це зробити відразу після того, як програма завершилася з помилкою сегментування. Якщо ж помилка сегментування Ubuntu зустрічається не в системній програмі, вам доведеться самим шукати розробників і вручну описувати що сталося.

Щоб допомогти розробникам вирішити проблему, недостатньо надіслати їм тільки повідомлення, що ви зловили Segmentation Fault, потрібно докладно описати проблему, дії, які ви виконували перед цим, так щоб розробник міг їх відтворити. Також, бажано прикріпити до звіту останні функції, які викликала програма (стек викликів функцій), це може дуже допомогти розробникам.

Розглянемо як його отримати. Це не так уже й складно. Спочатку запустіть вашу програму, потім дізнайтеся її PID за допомогою команди:

Далі запускаємо відладчик gdb:

Підключаємось до програми:

(gdb) attach ваш_pid

Після підключенняпрограма стане на паузу, продовжуємо її виконання командою:

Ubuntu

Потім вам залишилося лише викликати помилку:

losst

І набрати команду, яка виведе стек останніх викликів:

Виведення цієї команди і потрібно надсилати розробникам. Щоб відключитися від програми та вийти наберіть:

(gdb) detach (gdb) quit

Далі залишається надіслати звіт та чекати на виправлення помилки. Якщо ви не впевнені, що помилка в програмі, ви можете запитувати на форумах. Коли у вас є стек викликів, вже можна спробувати, якщо не зрозуміти в чому проблема, спробувати дізнатися, чи не стикався з подібною проблемою ще хтось.

сегментування

помилка

Ubuntu

losst

Оцініть статтю:

Засновник та адміністратор сайту losst.ru, захоплююсь відкритим програмним забезпеченням та операційною системою Linux. Як основну ОС зараз використовую Ubuntu. Крім Linux цікавлюся всім, що пов'язане з інформаційними технологіями та сучасною наукою.

Дякую, було дуже цікаво почитати про відладчика.

Насправді цього позбутися я не можу. Залишається мені все звалювати на свій старий комп'ютер із 1024 мегабайтами озу. Постійні помилки сегментування коли комплімують будь-яку програму. Щоб скомплімувати ядро, треба по мільйону разів вводити make!! Зараз викину комп і куплю новий і думаю проблема сама вирішиться.