В Ubuntu я не раз стикався з помилкою помилки сегментації. Що таке помилка сегментації та коли вона виникає?
В Ubuntu я не раз стикався з помилкою помилки сегментації. Що таке помилка сегментації та коли вона виникає?
Відповіді:
Помилка, що говорить про помилку сегментації (або segfault або SIGSEGV ) в Ubuntu та інших операційних системах, схожих на Unix, або про загальну помилку захисту в Windows, це коли програма намагається отримати доступ до частини пам'яті, до якої не можна отримати доступ, або до якої програма заборонено отримувати доступ. Помилка сегментації - це певний збій програми, тобто ненормальне припинення програми. Дивіться статті Вікіпедії на аварію , захист пам'яті , помилка сегментації , загальна помилка захисту , і SIGSEGV для отримання додаткової інформації (і більш текстурованого розуміння теми , ніж представлені тут).
Помилка сегментації майже завжди пов'язана з помилкою в програмі, де вона виникає. Я здогадуюсь, що більшість або всі ваші дефекти сегментації відбуваються з однієї програми. Будь ласка, надайте детальнішу інформацію про обставини, за яких на вашому пристрої трапляються помилки сегментації та яка програма виходить з ладу. Будь ласка, надайте повний та точний текст повідомлення про помилку, яке ви отримуєте, та будь-які інші повідомлення, що з’являються перед ним. Це повинно давати нам можливість надавати детальну пораду, специфічну для вашої проблеми (а не просто загальну інформацію про те, що є дефектом сегментації).
Найкращий спосіб надати цю інформацію - це ви відредагували своє запитання, щоб включити його . Крім того, якщо ви хочете, щоб це питання стосувалося лише помилок сегментації, ви можете опублікувати нове запитання, щоб запитати про те, що конкретно викликає ваші сегментаційні помилки (якщо ви це зробите, обов'язково вкажіть усі ці деталі у своєму новому запитанні) .
Помилка сегментації викликається помилкою в додатку. Технічно це означає, що програма намагається читати чи записувати на частину пам'яті, яка їй не належить (або не існує). Звичайно, заборонено читати чи записувати в чужу пам’ять, і коли система (ядро) виявить це, це змусить програму вийти з програми.
Пройшли дні, коли люди звикли відстежувати код складання та налагоджувати проблему. Упирається, доктор Ватсон, Сегментаційний розлом. Ті зелені дні минули.
Однією з причин помилки сегментації є те, що код, який має прямий доступ до пам'яті, не вдається. Коли фрагмент коду намагається отримати доступ до сегмента пам'яті іншої програми, відбувається помилка сегментації. Виділення пам’яті кілька разів переміщуються, щоб дозволити більші суміжні блоки пам'яті. Поки воно намагається відновити, ядро намагається зберегти всю інформацію про свою пам'ять у файл, поточний стан усіх додатків, що працюють на процесорі, і їх стан (остання запущена інструкція) у файл, і просто померти. Він також намагатиметься зберегти якомога більше інформації про відновлення та закрити якомога більше файлів, щоб hdd не перервав посилання.
Налагодьте його та виправте, якщо ви можете часто відтворювати його. Якщо ви не можете відтворити це, просто приєднайтеся до рук, станьте на коліна і моліться, як пекло, щоб ви цього не бачили "регулярно".
SIGSEGV
обробник на що-небудь інше, ніж SIG_DFL
(що скидає ядро і виходить для a SIGSEGV
), оскільки якщо ви отримуєте доступ до пам'яті, ви не повинні бути, то щось пішло дуже неправильно і відновлення, ймовірно, неможливо. (2) Ядро буде скинуто лише після того, як процес буде зупинений. (3) Основний дамп включає лише пам'ять і регістри процесу, який було скинуто. (4) Інші процеси, процесор і ядро не впливають на сегмент іншого процесу.