Відповіді:
Помилка сегментації є наслідком порушення доступу до пам'яті. Програма вказала адресу пам'яті поза тим, що їй було призначено, а ядро ОС відповідає, вбиваючи програму за допомогою SIGSEGV.
Це помилка, оскільки немає сенсу намагатися отримати доступ до недоступної пам’яті (це зробити не можна). Помилки подібного роду легко зробити, особливо в таких мовах, як C і C ++ (на які припадає багато загальних програм). Він вказує на помилку або в самій програмі, або в бібліотеці, до якої посилається. Якщо ви хочете повідомити про помилку (зробіть - це допомагає), непогано буде включити зворотній бік подій, що призвели до помилки сегмента.
Для цього можна запустити програму всередині gdb
(налагоджувач GNU), яка повинна бути доступна з будь-якого дистрибутива Linux, якщо вона вже не встановлена (пакет буде називатися "gdb"). Якщо зламана програма називається "Bronapp":
gdb brokenapp
З'явиться абзац про авторське право та ліцензування, а в кінці підказка з курсором:
(gdb) _
Введіть run
і натисніть Enter. Якщо вам потрібно навести аргументи (наприклад -x --foo=bar whatever
), додайте їх ( run -x --foo=bar whatever
). Програма зробить все, що вона робить, ви побачите вихід, і якщо вам потрібно буде взаємодія, ви можете (зауважте, ви можете запускати будь-яку програму, включаючи GUI одну, всередині gdb). У точці, де вона зазвичай переходить у різні сегменти, ви побачите:
Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _
Другий рядок виходу тут - лише приклад. Тепер введіть bt
(для "backtrace") і натисніть клавішу Enter. Ви побачите щось подібне, хоча це може бути набагато довше:
(gdb) bt
#0 0x00000000006031c9 in ?? ()
#1 0x000000000040157f in mishap::what() const ()
#2 0x0000000000401377 in main ()
Якщо вона довша, ви отримаєте лише скріншот, і з’явиться --More--
повідомлення. Продовжуйте натискання, поки не буде зроблено. Тепер ви можете quit
залишитися у вашому терміналі. Скопіюйте все Program received signal SIGSEGV
вперед у текстовий файл та подайте звіт про помилки за допомогою програми відстеження помилок програми; Ви можете знайти їх в Інтернеті, виконавши пошук, наприклад, "звіт про помилку при переході" - вам, ймовірно, доведеться зареєструватися, щоб відповідь була надіслана вам електронною поштою Включіть свій опис проблеми, будь-які аргументи, які ви надіслали run
тощо, та копію зворотного моменту (якщо він дуже довгий, може бути засіб для приєднання текстового файлу в інтерфейсі відстежувача помилок). Також додайте версію, якщо ви знаєте, що це таке ( brokenapp --version
може працювати, або на вказівці на сторінці може бути вказано, як це отримати),
Хтось, сподіваємось, повернеться до вас не дуже довго. Подання помилок зазвичай цінується.
Це означає, що у додатку є помилка.
Якщо ви є кінцевим користувачем, вам слід зв’язатися з продавцем програми.
Якщо це ваша власна програма, ви можете:
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
Основні файли також будуть дуже корисні для розробників, окрім вас самих - вони містять повний стан програми в момент збою; якщо ви збираєтеся подати звіт про помилку, додайте їх, а в деяких випадках і ваш двійковий додаток. Майте на увазі, що є невеликі шанси, що ваші особисті дані, такі як номери рахунків, паролі та подібне, можуть залишитися в пам'яті програми на момент аварії. У багатьох випадках розробники знаходять проблему, якщо повідомити про зворотний обріс потоку, що перебився. Щоб отримати зворотний слід, ви можете завантажити основний файл налагоджувачем (як gdb executable corefile
).