Запуск програми закінчується "Помилка сегментації"


40

У мене є програма командного рядка, яка під час запуску не робить те, що належить робити, і в певний момент залишає повідомлення:

Segmentation fault

Що це означає? Що я повинен зробити?


Відповіді:


63

Помилка сегментації є наслідком порушення доступу до пам'яті. Програма вказала адресу пам'яті поза тим, що їй було призначено, а ядро ​​ОС відповідає, вбиваючи програму за допомогою 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може працювати, або на вказівці на сторінці може бути вказано, як це отримати),

Хтось, сподіваємось, повернеться до вас не дуже довго. Подання помилок зазвичай цінується.


1
Помилка сегментації може виникнути і в мовах перекладачів (через те, що в основному через помилки в самому перекладачі),
Брайам

Це супер корисно! Чи є можливість зайти всередину? поставити знак зупинки і спробувати дізнатися більше?
Злой Сміртний

1
@ZloySmiertniy багато чогоgdb робить . Ви хочете, щоб перейти до розділу 5.1
goldilocks

11

Це означає, що у додатку є помилка.

  • Якщо ви є кінцевим користувачем, вам слід зв’язатися з продавцем програми.

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

    1. включити основні файли: $ ulimit -c unlimited
    2. відтворити збій: $ ./yourapp
    3. аварія налагодження з gdb: $ gdb ./yourapp core

Основні файли також будуть дуже корисні для розробників, окрім вас самих - вони містять повний стан програми в момент збою; якщо ви збираєтеся подати звіт про помилку, додайте їх, а в деяких випадках і ваш двійковий додаток. Майте на увазі, що є невеликі шанси, що ваші особисті дані, такі як номери рахунків, паролі та подібне, можуть залишитися в пам'яті програми на момент аварії. У багатьох випадках розробники знаходять проблему, якщо повідомити про зворотний обріс потоку, що перебився. Щоб отримати зворотний слід, ви можете завантажити основний файл налагоджувачем (як gdb executable corefile).


Відповідно до діалогового вікна Майкрософт, вам слід зв’язатися лише з продавцем, "якщо проблема не зникне", інакше не турбуйтеся. Рідкісні збої - це не справжні помилки, а лише відтворювані.
Каз

4
Моє зауваження полягає в тому, що якість програмного забезпечення Microsoft низька у багатьох випадках порівняно з програмним забезпеченням UNIX, і приємно, що в світі UNIX люди зазвичай не посилаються на їх вказівки.
gena2x
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.