Что такое ошибка сегментации?

27

В Ubuntu я неоднократно сталкивался с ошибкой сегментации. Что такое ошибка сегментации и когда она возникает?

Тахионы
источник
1
Просто чтобы скрыть это: у меня была похожая проблема, тогда как мои ошибки не были надежно воспроизведены, и они были получены из (почти) случайных приложений. Выяснил, что, скорее всего, у меня сломана память. Так что, если какая-либо программа вызывает segfaults, можно было бы ближе взглянуть на RAM.

Ответы:

25

Ошибка, связанная с ошибкой сегментации (или segfault , или SIGSEGV ) в Ubuntu и других Unix-подобных операционных системах, или из-за общей ошибки защиты в Windows, возникает, когда программа пытается получить доступ к части памяти, к которой нет доступа, или к которой она обращается. доступ запрещен. Ошибка сегментации - это своего рода сбой программы, то есть ненормальное завершение программы. Смотрите статьи Википедии на аварию , защита памяти , ошибка сегментации , общая ошибка защиты , и SIGSEGV для получения дополнительной информации (и более текстурированного понимание темы , чем представлены здесь).

Ошибка сегментации почти всегда происходит из-за ошибки в программе, в которой она возникает. Я предполагаю, что большинство или все ваши ошибки сегментации происходят из одного и того же приложения. Пожалуйста, предоставьте более подробную информацию об обстоятельствах, при которых на вашей машине происходят ошибки сегментации, и о том, какая программа дает сбой. Также предоставьте полный и точный текст сообщения об ошибке, которое вы получаете, и любых других сообщений, которые появляются перед ним. Это должно позволить нам предоставить подробный совет, относящийся к вашей проблеме (а не просто общую информацию о том, что такое ошибка сегментации).

Лучший способ предоставить эту информацию - отредактировать свой вопрос, чтобы включить ее . В качестве альтернативы, если вы хотите, чтобы этот вопрос касался только ошибок сегментации в целом, вы можете опубликовать новый вопрос, чтобы спросить о том, что конкретно вызывает ваши ошибки сегментации (если вы это сделаете, убедитесь, что предоставили все эти детали в своем новом вопросе) ,

Элия ​​Каган
источник
К счастью, все ошибки сегментации были исправлены путем обновления OS :). Мой вопрос о сбое сегментации в целом. Не для конкретного приложения.
Тахион
@ Я не тот человек, я соответственно отредактировал свой ответ. (Я сохраняю инструкции по предоставлению дополнительной информации для других пользователей, испытывающих ошибки сегментации, хотя я знаю, что вам сейчас не нужна конкретная помощь с ними.)
Элия ​​Каган
Ну, это о сбое сегментации в приложении. Я хотел спросить об этом, происходящем в программе на C ++, где одна и та же программа прекрасно работает в Windows или Turbo C ++ (в Wine) (я использую anjuta в Linux). И это всего лишь базовые программы, а не приложения (такие как TREES). , Графики и т. Д.)
Нирмик
Спасибо. Но я боюсь, что в большинстве случаев задавать вопрос о сбое сегментации в приложении здесь не по теме. :)
Тахионы
@Nirmik: вероятно, это тема для stackoverflow :)
Tachyons
4

Ошибка сегментации вызвана ошибкой в ​​приложении. Технически это означает, что приложение пытается прочитать или записать часть памяти, которая ему не принадлежит (или не существует). Конечно, запрещено читать или записывать в чужую память, и когда система (ядро) обнаружит это, это заставит приложение завершить работу.

Войтех Трефны
источник
0

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

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

Отладка и исправление, если вы можете воспроизвести его часто. Если вы не можете воспроизвести это, просто возьмите свои руки, встаньте на колени и молитесь, как черт, чтобы вы не видели это "регулярно".

Сиддхарт
источник
Segfaults может быть запущен в любой программе, написанной на языке, который обеспечивает прямой доступ к памяти. Как правило, они также не будут разрушать ядро.
Алекс Л.
@AlexL. это точно. Я отредактирую свой ответ.
Сиддхарт
Я надеюсь, что я правильно изложил свои мысли.
Сиддхарт
@AlexL. Можете ли вы рассмотреть его еще раз. Я удалю это, если это все еще не точно.
Сиддхарт
Это лучше. Тем не менее, (1) хотя и возможно, что программа очень редко устанавливает SIGSEGVобработчик на что-либо другое, чем SIG_DFL(то есть дамп ядра и выход для a SIGSEGV), поскольку, если вы обращаетесь к памяти, которой у вас не должно быть, то что-то пошло очень неправильно и восстановление возможно невозможно. (2) Ядро будет сброшено только после остановки процесса. (3) Дамп ядра включает только память и регистры процесса, который был выгружен. (4) Другие процессы, процессор и ядро ​​не подвержены сбою другого процесса.
Алекс Л.