У чому полягає помилка сегментації?


27

В Ubuntu я не раз стикався з помилкою помилки сегментації. Що таке помилка сегментації та коли вона виникає?


1
Просто, щоб приховати це: у мене була подібна проблема, тоді як мої сегменти не були надійно відтворені, і вони походили від (майже) випадкових програм. З'ясував, що, швидше за все, моя пам'ять порушена. Отже, якщо будь-яка програма спричиняє segfault, можна ближче ознайомитися з ОЗУ.

Відповіді:


25

Помилка, що говорить про помилку сегментації (або segfault або SIGSEGV ) в Ubuntu та інших операційних системах, схожих на Unix, або про загальну помилку захисту в Windows, це коли програма намагається отримати доступ до частини пам'яті, до якої не можна отримати доступ, або до якої програма заборонено отримувати доступ. Помилка сегментації - це певний збій програми, тобто ненормальне припинення програми. Дивіться статті Вікіпедії на аварію , захист пам'яті , помилка сегментації , загальна помилка захисту , і SIGSEGV для отримання додаткової інформації (і більш текстурованого розуміння теми , ніж представлені тут).

Помилка сегментації майже завжди пов'язана з помилкою в програмі, де вона виникає. Я здогадуюсь, що більшість або всі ваші дефекти сегментації відбуваються з однієї програми. Будь ласка, надайте детальнішу інформацію про обставини, за яких на вашому пристрої трапляються помилки сегментації та яка програма виходить з ладу. Будь ласка, надайте повний та точний текст повідомлення про помилку, яке ви отримуєте, та будь-які інші повідомлення, що з’являються перед ним. Це повинно давати нам можливість надавати детальну пораду, специфічну для вашої проблеми (а не просто загальну інформацію про те, що є дефектом сегментації).

Найкращий спосіб надати цю інформацію - це ви відредагували своє запитання, щоб включити його . Крім того, якщо ви хочете, щоб це питання стосувалося лише помилок сегментації, ви можете опублікувати нове запитання, щоб запитати про те, що конкретно викликає ваші сегментаційні помилки (якщо ви це зробите, обов'язково вкажіть усі ці деталі у своєму новому запитанні) .


на щастя, всі помилки сегментації виправлені оновленням os :). Моє запитання стосується помилки сегментації взагалі. Не для конкретного додатка.
Тахіони

@ I'mnotthisperson Я відповідно відредагував свою відповідь. (Я зберігаю вказівки щодо надання додаткової інформації для вигоди інших користувачів, які відчувають помилки сегментації, хоча я знаю, що вам зараз не потрібна конкретна допомога.)
Елія Каган

Ну, це про помилку сегментації в додатку. Мені хотілося запитати про те, що відбувається в програмі C ++, де ця ж програма ідеально працює в Windows або Turbo C ++ (у вині) (я використовую anjuta в Linux). І це просто основні програми, а не програми (такі програми, як TREES , GRAPHS тощо)
Нірмік

Дякую. Але я боюся, що в більшості випадків запитання про помилки сегментації в додатку тут є офтопіком. :)
Тахіони

@Nirmik: напевно, це тема для
stackoverflow

4

Помилка сегментації викликається помилкою в додатку. Технічно це означає, що програма намагається читати чи записувати на частину пам'яті, яка їй не належить (або не існує). Звичайно, заборонено читати чи записувати в чужу пам’ять, і коли система (ядро) виявить це, це змусить програму вийти з програми.


0

Пройшли дні, коли люди звикли відстежувати код складання та налагоджувати проблему. Упирається, доктор Ватсон, Сегментаційний розлом. Ті зелені дні минули.

Однією з причин помилки сегментації є те, що код, який має прямий доступ до пам'яті, не вдається. Коли фрагмент коду намагається отримати доступ до сегмента пам'яті іншої програми, відбувається помилка сегментації. Виділення пам’яті кілька разів переміщуються, щоб дозволити більші суміжні блоки пам'яті. Поки воно намагається відновити, ядро ​​намагається зберегти всю інформацію про свою пам'ять у файл, поточний стан усіх додатків, що працюють на процесорі, і їх стан (остання запущена інструкція) у файл, і просто померти. Він також намагатиметься зберегти якомога більше інформації про відновлення та закрити якомога більше файлів, щоб hdd не перервав посилання.

Налагодьте його та виправте, якщо ви можете часто відтворювати його. Якщо ви не можете відтворити це, просто приєднайтеся до рук, станьте на коліна і моліться, як пекло, щоб ви цього не бачили "регулярно".


Segfaults може спрацьовувати в будь-якій програмі, написаній мовою, що дозволяє отримати прямий доступ до пам'яті. Вони, як правило, і не зламають ядро.
Алекс Л.

@AlexL. це точно. Я відредагую свою відповідь.
Сіддхарт

Я сподіваюся, що я правильно представив свої думки.
Сіддхарт

@AlexL. Чи можете ви, будь ласка, переглянути його ще раз. Я видалю його, якщо його все ще не точно.
Сіддхарт

Це краще. Тим не менш, (1), хоча можливо, вкрай рідко програма може встановити SIGSEGVобробник на що-небудь інше, ніж SIG_DFL(що скидає ядро ​​і виходить для a SIGSEGV), оскільки якщо ви отримуєте доступ до пам'яті, ви не повинні бути, то щось пішло дуже неправильно і відновлення, ймовірно, неможливо. (2) Ядро буде скинуто лише після того, як процес буде зупинений. (3) Основний дамп включає лише пам'ять і регістри процесу, який було скинуто. (4) Інші процеси, процесор і ядро ​​не впливають на сегмент іншого процесу.
Алекс Л.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.