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


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) Другие процессы, процессор и ядро ​​не подвержены сбою другого процесса.
Алекс Л.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.