Що це означає?
Див. АС: Що таке сегментація? а також це, на якому є кілька прикладів, як його відтворювати, ТАК: У чому полягає вина сегментації? . найпростіший опис, з яким я можу зійти (може бути не ідеальним):
Програма намагалася отримати доступ до області пам'яті поза власною секцією. ОС блокує його.
Деякі випадки: значення читання з ініціалізованим вказівником, вихід з діапазону в масив, функціональний виклик (коли зворотна сумісність не підтримується), ...
Однак не завжди легко знайти причину з великими програмами або з тими, які передаються на інших проектах. І в більшості випадків описується звіт про помилки, як для цільової програми, так і для такої залежності, якщо її залежність (або проект, або пакет розповсюдження нижче).
Як я можу вирішити цю проблему?
Якщо ви не зробили жодної спеціальної конфігурації / налаштування та встановлено всі оновлення. Увімкніть звіт про помилку , див. Як повідомити про помилку?
Якщо з відкритим кодом, що підтримується Ubuntu, використовуйте ubuntu-bug( apport-bug). Для стороннього закритого джерела перегляньте їх довідкові сторінки, як повідомляти про помилки та збирати пов’язані дані.
Примітка. Якщо у вас є навіть невеликий досвід програмування, рекомендується постаратися вирішити це самостійно. Там багато повідомлень про помилки там неактивні роками. Або принаймні зібрати достатню кількість даних про налагодження, щоб вирішити проблему перед тим, як повідомити про неї.
Деякі корисні інструменти для налагодження
apport-bug журнали / основний дамп / зворотній шлях
Якщо у вас немає повідомлення про помилку перед помилкою сегментації. Запустіть його з --saveопцією та шукайте журнал зворотного сліду:
apport-bug program-cmd --save bug-report_output.txt
gdb зворотний / налагоджувальний вихідний код
Якщо це не спрацювало, використовуйте gdb:
$ gdb program-cmd
(gdb) run
(gdb) backtrace
Якщо ви отримаєте будь-яке повідомлення про помилку, перевірте веб-сторінку, панель запуску та трекер помилок у поточному проекті, чи є подібні випадки.
Для деяких просунутих користувачів або тих, хто слідує навчальному шляху ac / c ++, вони можуть завантажити відповідні -dbgпакети символів. Потім ви можете gdbвідстежувати потік програми через джерело і отримувати точну функцію / інструкцію, що підвищує помилку виконання.
strace відстеження системних викликів
Ще один інструмент, який може допомогти - це straceмені подобається. Це дійсно потужний інструмент.
Він представляє себе:
У найпростішому випадку straceвиконується вказана команда, поки вона не завершиться. Він перехоплює і записує системні виклики, які викликаються процесом, і сигнали, які отримує процес. Ім'я кожного системного виклику, його аргументи та його повернене значення друкуються на стандартній помилці або у файлі, визначеному параметром -o.
straceє корисним діагностичним, інструктивним та налагоджувальним інструментом. Системні адміністратори, діагностики та усунення несправностей вважають його безцінним для вирішення проблем із програмами, для яких джерело недоступне, оскільки їх не потрібно перекомпілювати для того, щоб простежити їх. Студенти, хакери та надмірно цікаві виявлять, що про систему та її системні дзвінки можна дізнатися багато, відстежуючи навіть звичайні програми. І програмісти виявлять, що оскільки системні виклики та сигнали - це події, що трапляються на інтерфейсі користувача / ядра, ретельне вивчення цієї межі є дуже корисним для ізоляції помилок, перевірки обґрунтованості та спроби захоплення умов перегонів.
Джерело: man strace
ltrace динамічне відстеження викликів бібліотеки
ltraceце програма, яка просто запускає вказану команду, поки вона не завершиться. Він перехоплює і записує динамічні виклики бібліотеки, які викликаються виконаним процесом, і сигнали, які приймаються цим процесом. Він також може перехоплювати та друкувати системні дзвінки, виконані програмою.
Його використання дуже схоже на strace(1).
Джерело: man ltrace