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


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


25
2018-05-17 13:59


происхождения


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


ответы:


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

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

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


22
2018-05-17 14:11



к счастью, вся ошибка сегментации фиксируется обновлением ОС. Мой вопрос касается разлома сегментации вообще. Не для конкретного приложения. - Tachyons
@ I'mnotthisperson Я отредактировал свой ответ соответственно. (Я сохраняю указания для предоставления дополнительной информации в интересах других пользователей, испытывающих проблемы с сегментацией, хотя я знаю, что вам сейчас не нужна конкретная помощь). - Eliah Kagan
Ну, это касается ошибки сегментации в приложении. Я хотел спросить об этом в программе на C ++, где одна и та же программа отлично работает в Windows или Turbo C ++ (в вине) (я использую anjuta в Linux). И хорошо это всего лишь базовые программы, а не приложения (такие программы, как TREES , гРАФЫ и т.д.) - Nirmik
Спасибо. Но я боюсь, что в большинстве случаев вопрос о проблеме сегментации в приложении здесь оффтоп. :) - Tachyons
@Nirmik: возможно, это тема для stackoverflow :) - Tachyons


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


4
2018-05-17 14:09





Прошли те времена, когда люди отслеживали код сборки и отлаживали проблему. Abends, Dr Watson, Ошибка сегментации. Те зеленые дни ушли.

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

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


0
2018-01-18 05:34



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