В Ubuntu я неоднократно сталкивался с ошибкой сегментации. Что такое ошибка сегментации и когда она возникает?
В Ubuntu я неоднократно сталкивался с ошибкой сегментации. Что такое ошибка сегментации и когда она возникает?
Ответы:
Ошибка, связанная с ошибкой сегментации (или segfault , или SIGSEGV ) в Ubuntu и других Unix-подобных операционных системах, или из-за общей ошибки защиты в Windows, возникает, когда программа пытается получить доступ к части памяти, к которой нет доступа, или к которой она обращается. доступ запрещен. Ошибка сегментации - это своего рода сбой программы, то есть ненормальное завершение программы. Смотрите статьи Википедии на аварию , защита памяти , ошибка сегментации , общая ошибка защиты , и SIGSEGV для получения дополнительной информации (и более текстурированного понимание темы , чем представлены здесь).
Ошибка сегментации почти всегда происходит из-за ошибки в программе, в которой она возникает. Я предполагаю, что большинство или все ваши ошибки сегментации происходят из одного и того же приложения. Пожалуйста, предоставьте более подробную информацию об обстоятельствах, при которых на вашей машине происходят ошибки сегментации, и о том, какая программа дает сбой. Также предоставьте полный и точный текст сообщения об ошибке, которое вы получаете, и любых других сообщений, которые появляются перед ним. Это должно позволить нам предоставить подробный совет, относящийся к вашей проблеме (а не просто общую информацию о том, что такое ошибка сегментации).
Лучший способ предоставить эту информацию - отредактировать свой вопрос, чтобы включить ее . В качестве альтернативы, если вы хотите, чтобы этот вопрос касался только ошибок сегментации в целом, вы можете опубликовать новый вопрос, чтобы спросить о том, что конкретно вызывает ваши ошибки сегментации (если вы это сделаете, убедитесь, что предоставили все эти детали в своем новом вопросе) ,
Ошибка сегментации вызвана ошибкой в приложении. Технически это означает, что приложение пытается прочитать или записать часть памяти, которая ему не принадлежит (или не существует). Конечно, запрещено читать или записывать в чужую память, и когда система (ядро) обнаружит это, это заставит приложение завершить работу.
Прошли те времена, когда люди привыкли отслеживать ассемблерный код и устранять проблемы. Абендс, доктор Ватсон, Ошибка сегментации. Те зеленые дни прошли.
Одной из причин ошибки сегментации является сбой кода, который имеет прямой доступ к памяти. Когда часть кода пытается получить доступ к сегменту памяти другого приложения, возникает ошибка сегментации. Выделение памяти иногда перемещается, чтобы позволить выделять большие непрерывные блоки памяти. В то время как оно пытается восстановиться, ядро изо всех сил старается сохранить всю информацию о своей памяти в файл, текущее состояние всех приложений, запущенных на процессоре, и их состояние (последний запуск инструкции) в файл и просто умереть. Он также попытается сохранить как можно больше информации для восстановления и закрыть как можно больше файлов, чтобы на жестком диске не было битых ссылок.
Отладка и исправление, если вы можете воспроизвести его часто. Если вы не можете воспроизвести это, просто возьмите свои руки, встаньте на колени и молитесь, как черт, чтобы вы не видели это "регулярно".
SIGSEGV
обработчик на что-либо другое, чем SIG_DFL
(то есть дамп ядра и выход для a SIGSEGV
), поскольку, если вы обращаетесь к памяти, которой у вас не должно быть, то что-то пошло очень неправильно и восстановление возможно невозможно. (2) Ядро будет сброшено только после остановки процесса. (3) Дамп ядра включает только память и регистры процесса, который был выгружен. (4) Другие процессы, процессор и ядро не подвержены сбою другого процесса.