Помилка сегментування ubuntu

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

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

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

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

Відео: Як прибрати помилку часу при використанні Ubuntu 16.04 і Windows 10

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

Припустимо, у вашій системі є 6 Гігабайт оперативної пам`яті, кожній програмі потрібно виділити певну область, куди буде записана вона сама, її дані і нові дані, які вона буде створювати. Щоб дати можливість кожній з запущених програм використовувати всі шість гігабайт пам`яті був придуманий механізм віртуального адресного простору. Створюється віртуальний простір дуже великого розміру, а з нього вже виділяється по 6 Гб для кожної програми. Якщо цікаво, це адресний простір можна знайти в файлі / proc / kcore, тільки не здумайте нікуди його копіювати.

Виділене адресний простір для програми називається сегментом. Як тільки програма спробує записати або прочитати дані не зі свого сегмента, ядро ​​відправить їй сигнал SIGSEGV і програма завершиться з нашою помилкою. Більш того, кожен сегмент поділений на секції, в деякі з них запис неможливий, інші не можна виконувати, якщо програма і тут спробує зробити щось заборонене, ми знову отримаємо помилку сегментації Ubuntu.

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

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

Відео: War Thunder 1.43. / Linux Native

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

Що робити якщо виникла помилка сегментації?




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

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

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


$ Sudo apt-get dist-upgrade

Якщо це не допомогло, потрібно обнулити настройки програми до значень за замовчуванням, можливо, видалити кеш. Налаштування програм в Linux зазвичай містяться в домашній папці, прихованих підкаталогах з ім`ям програми. Також, настройки і кеш можуть міститися в каталогах ~ / .config і ~ / .cache. Просто видаліть папки програми і спробуйте знову її запустити. Якщо і це не допомогло, ви можете спробувати повністю видалити програму, а потім знову її встановити, можливо, якісь залежності були пошкоджені:

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


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

Відео: # 1 Voice Identification and Recognition System Project in MATLAB.avi

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

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

Відео: How to activate gnome-shell in Kali Linux

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

$ Sudo gdb -q

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

(Gdb) continue

segfault

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

segfault1

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

(Gdb) detach
(Gdb) quit

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

висновки

Тепер у вас є приблизний план дій, що потрібно робити, коли з`являється помилка сегментування зроблений дамп пам`яті ubuntu. Якщо ви знаєте інші способи вирішити цю проблему, напишіть в коментарях!

Поділися в соціальних мережах:

Схожі
Помилка 738Помилка 738
Установка vlc ubuntu 16.04Установка vlc ubuntu 16.04
Після оновлення не працює додаток на андроїд (не запускаються, помилка)Після оновлення не працює додаток на андроїд (не запускаються, помилка)
Помилка 489 в play market (плей маркеті) на андроїд - не вдалося завантажити додатокПомилка 489 в play market (плей маркеті) на андроїд - не вдалося завантажити додаток
Function fetch_assoc () on a non-objectFunction fetch_assoc () on a non-object
Виправляємо виявлена ​​помилка в системній програмі ubuntuВиправляємо виявлена ​​помилка в системній програмі ubuntu
Помилка 629Помилка 629
Андроїд: в процесі установки невідома помилка: -24Андроїд: в процесі установки невідома помилка: -24
Помилка 403 forbidden nginx 1.4 6 ubuntuПомилка 403 forbidden nginx 1.4 6 ubuntu
Помилка apt-get command not foundПомилка apt-get command not found
» » Помилка сегментування ubuntu