Не всегда программы в Linux запускаются как положено. Иногда, в силу разных причин программа вместо нормальной работы выдает ошибку. Но нам не нужна ошибка, нам нужна программа, вернее, та функция, которую она должна выполнять. Сегодня мы поговорим об одной из самых серьезных и непонятных ошибок. Это ошибка сегментации Ubuntu. Если такая ошибка происходит только один раз, то на нее можно не обращать внимания, но если это регулярное явление нужно что-то делать.
Конечно, случается эта проблема не только в Ubuntu, а во всех Linux дистрибутивах, поэтому наша инструкция будет актуальна для них тоже. Но сосредоточимся мы в основном на Ubuntu. Рассмотрим что такое ошибка сегментирования linux, почему она возникает, а также как с этим бороться и что делать.
Что такое ошибка сегментации?
Ошибка сегментации, Segmentation fault, или Segfault, или SIGSEGV в Ubuntu и других Unix подобных дистрибутивах, означает ошибку работы с памятью. Когда вы получаете эту ошибку, это значит, что срабатывает системный механизм защиты памяти, потому что программа попыталась получить доступ или записать данные в ту часть памяти, к которой у нее нет прав обращаться.
Чтобы понять почему так происходит, давайте рассмотрим как устроена работа с памятью в Linux, я попытаюсь все упростить, но приблизительно так оно и работает.
Допустим, в вашей системе есть 6 Гигабайт оперативной памяти, каждой программе нужно выделить определенную область, куда будет записана она сама, ее данные и новые данные, которые она будет создавать. Чтобы дать возможность каждой из запущенных программ использовать все шесть гигабайт памяти был придуман механизм виртуального адресного пространства. Создается виртуальное пространство очень большого размера, а из него уже выделяется по 6 Гб для каждой программы. Если интересно, это адресное пространство можно найти в файле /proc/kcore, только не вздумайте никуда его копировать.
Выделенное адресное пространство для программы называется сегментом. Как только программа попытается записать или прочитать данные не из своего сегмента, ядро отправит ей сигнал SIGSEGV и программа завершится с нашей ошибкой. Более того, каждый сегмент поделен на секции, в некоторые из них запись невозможна, другие нельзя выполнять, если программа и тут попытается сделать что-то запрещенное, мы опять получим ошибку сегментации Ubuntu.
Почему возникает ошибка сегментации?
И зачем бы это порядочной программе лезть, куда ей не положено? Да в принципе, незачем. Это происходит из-за ошибки при написании программ или несовместимых версиях библиотек и ПО. Часто эта ошибка встречается в программах на Си или C++. В этом языке программисты могут вручную работать с памятью, а язык со своей стороны не контролирует, чтобы они это делали правильно, поэтому одно неверное обращение к памяти может обрушить программу.
Почему может возникать эта ошибка при несовместимости библиотек? По той же причине — неверному обращению к памяти. Представим, что у нас есть библиотека linux (набор функций), в которой есть функция, которая выполняет определенную задачу. Для работы нашей функции нужны данные, поэтому при вызове ей нужно передать строку. Наша старая версия библиотеки ожидает, что длина строки будет до 256 символов. Но программа была обновлена формат записи поменялся, и теперь она передает библиотеке строку размером 512 символов. Если обновить программу, но оставить старую версию библиотеки, то при передаче такой строки 256 символов запишутся нормально в подготовленное место, а вот вторые 256 перезапишут данные программы, и возможно, попытаются выйти за пределы сегмента, тогда и будет ошибка сегментирования linux.
Что делать если возникла ошибка сегментирования?
Если вы думаете, что это ошибка в программе, то вам остается только отправить отчет об ошибке разработчикам. Но вы все-таки еще можете попытаться что-то сделать.
Например, если падает с ошибкой сегментации неизвестная программа, то мы можем решить что это вина разработчиков, но если с такой ошибкой падает chrome или firefox при запуске возникает вопрос, может мы делаем что-то не так? Ведь это уже хорошо протестированные программы.
Первое, что нужно сделать — это обновить систему до самой последней версии, возможно, был баг и его уже исправили, а может у вас установлены старые версии библиотек и обновление решит проблему. В Ubuntu это делается так:
sudo apt update
sudo apt full-upgrade
Если это не помогло, нужно обнулить настройки программы до значений по умолчанию, возможно, удалить кэш. Настройки программ в Linux обычно содержатся в домашней папке, скрытых подкаталогах с именем программы. Также, настройки и кэш могут содержаться в каталогах ~/.config и ~/.cache. Просто удалите папки программы и попробуйте снова ее запустить. Если и это не помогло, вы можете попробовать полностью удалить программу, а потом снова ее установить, возможно, какие-нибудь зависимости были повреждены:
sudo apt remove пакет_программы
sudo apt autoremove
sudo apt install пакет_программы
Если есть возможность, попробуйте установить программу из другого источника, например, не из PPA, а более старую версию, из официальных репозиториев.
Когда вы все это выполнили, скорее всего, проблема не в вашем дистрибутиве, а в самой программе. Нужно отправлять отчет разработчикам. В Ubuntu это можно сделать с помощью программы apport-bug. Обычно Ubuntu предлагает это сделать сразу, после того как программа завершилась с ошибкой сегментирования. Если же ошибка сегментирования Ubuntu встречается не в системной программе, то вам придется самим искать разработчиков и вручную описывать что произошло.
Чтобы помочь разработчикам решить проблему, недостаточно отправить им только сообщение что вы поймали Segmentation Fault, нужно подробно описать проблему, действия, которые вы выполняли перед этим, так чтобы разработчик мог их воспроизвести. Также, желательно прикрепить к отчету последние функции, которые вызывала программа (стек вызовов функций), это может очень сильно помочь разработчикам.
Рассмотрим, как его получить. Это не так уж сложно. Сначала запустите вашу программу, затем узнайте ее PID с помощью команды:
pgrep программа
Дальше запускаем отладчик gdb:
sudo gdb -q
Подключаемся к программе:
(gdb) attach ваш_pid
После подключения программа станет на паузу, продолжаем ее выполнение командой:
(gdb) continue
Затем вам осталось только вызвать ошибку:
И набрать команду, которая выведет стек последних вызовов:
(gdb) backtrace
Вывод этой команды и нужно отправлять разработчикам. Чтобы отключиться от программы и выйти наберите:
(gdb) detach
(gdb) quit
Дальше остается отправить отчет и ждать исправления ошибки. Если вы не уверены, что ошибка в программе, можете поспрашивать на форумах. Когда у вас есть стек вызовов, уже можно попытаться, если не понять в чем проблема, то попытаться узнать, не сталкивался ли с подобной проблемой еще кто-то.
Выводы
Теперь у вас есть приблизительный план действий, что нужно делать, когда появляется ошибка сегментирования сделан дамп памяти ubuntu. Если вы знаете другие способы решить эту проблему, напишите в комментариях!
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .
Всем привет.
Не могу понять проблему.
Astra Linux SE Smolensk 1.5
Захожу под любым уровнем доступа (в данный момент — под 0).
Компилирую любую программу, но при попытке ее запустить, выскакивает «ошибка сегментирования», и внизу экрана появляется информационное сообщение: «Загрузка неподписанного файла заблокирована СЗ ОС (DIGSIG) …».
dmesg выдает сообщение: DIGSIG:[ERROR] NOT SIGNED: path=/home/pavel/Programs/test uid=1000 gid=1000
Собственно вопрос: как разрешить выполнение своих файлов?
Захожу под любым уровнем доступа (в данный момент — под 0).
Компилирую любую программу, но при попытке ее запустить, выскакивает «ошибка сегментирования», и внизу экрана появляется информационное сообщение: «Загрузка неподписанного файла заблокирована СЗ ОС (DIGSIG) …».
1. Разрабатывать программный код в защищённой системе — это, по моему (IMHO), дурное занятие … и об этом в том же духе уже высказывались здесь на форуме.
2. Ошибка «ошибка сегментирования» (сигнал SIGSEGV) — это слишком серьёзно для просто нарушения требований безопасности.
Не могли бы вы сказать:
— с какого языка (программирования) компилируете код?
— каким образом (командой)?
— привести фрагмент кода…
3. Не могу, к сожалению, ничего подсказать относительно «подписи» исполнимых файлов — мне дядя за большие деньги не покупал Astra SE
Но было бы очень интересно послушать знающих людей, а ещё лучше — ссылки, про то как это должно выглядеть.
мне дядя за большие деньги не покупал Astra SE
не для работы, а лишь для ознакомления можно и с торрента какого-нибудь скачать
не совсем легально, зато познавательно
Последнее редактирование: 07.08.2019
Смоленск 1.6: Режим замкнутой программной среды
Настройка режима функционирования механизма контроля целостности файлов при их открытии на основе ЭЦП в расширенных атрибутах файловой системы осуществляется с помощью графического инструмента fly-admin-smc (<<Панель управления — Безопасность — Политика безопасности — Замкнутая программная среда>>) или путем редактирования конфигурационного файла /etc/digsig/digsig_initramfs.conf.
После внесения изменений в конфигурационный файл /etc/digsig/digsig_initramfs.conf и для загрузки модулем digsig_verif ключей после их размещения его в каталогах /etc/digsig/keys/ и /etc/digsig/xattr_keys/
необходимо от имени учетной записи администратора через механизм verb|sudo| выполнить команду:
Код:
sudo update-initramfs -u -k all
Означает ли это, что изменения режима функционирования (1 из 3-х) через fly-admin-smc можно делать «на лету»? (без перегенерации initramfs, перезагрузки и т.д.)
не для работы, а лишь для ознакомления…
Измените формулировку от греха подальше.
Примерно так: Конечно, некоторые не для работы, а лишь для ознакомления, скачивают Смоленск 1.5 с торрент-трекеров. Но я это не одобряю.
А то какое-то подстрекательство к противоправным действия получается.
Означает ли это, что изменения режима функционирования (1 из 3-х) через fly-admin-smc можно делать «на лету»? (без перегенерации initramfs, перезагрузки и т.д.)
У меня тоже дяди нет. Проверить не могу, со Смоленском только теория
А то какое-то подстрекательство к противоправным действия получается.
то не призыв и не подстрекательство
то констатация факта всего лишь,
факта, для меня ненужного, так как
мне «от дяди» 5 дистрибутивов перепало
за полгода благодаря им разнообразил свой лексикон неприличных слов
…мне «от дяди» 5 дистрибутивов перепало за полгода благодаря им разнообразил свой лексикон неприличных слов
Есть возможность проверить вопрос из нижеприведенной цитаты?
Означает ли это, что изменения режима функционирования (1 из 3-х) через fly-admin-smc можно делать «на лету»? (без перегенерации initramfs, перезагрузки и т.д.)
не настолько знаком с линуксом, чтобы ответить
всего полгода изучения, да и то периодически (решаю только возникающие проблемы)
1. Разрабатывать программный код в защищённой системе — это, по моему (IMHO), дурное занятие … и об этом в том же духе уже высказывались здесь на форуме.
2. Ошибка «ошибка сегментирования» (сигнал SIGSEGV) — это слишком серьёзно для просто нарушения требований безопасности.
Не могли бы вы сказать:
— с какого языка (программирования) компилируете код?
— каким образом (командой)?
— привести фрагмент кода…
3. Не могу, к сожалению, ничего подсказать относительно «подписи» исполнимых файлов — мне дядя за большие деньги не покупал Astra SE
Но было бы очень интересно послушать знающих людей, а ещё лучше — ссылки, про то как это должно выглядеть.
Поясню, чтобы было понятнее.
1. Есть свой вычислительный код, с помощью которого собираемся проводить вычисления в защищенной системе. То есть, установить этот код на компьютере в защищенной среде НУЖНО.
Собираю и использую его от имени рядового пользователя, без админских прав.
2. Теперь непонятки: На реальном компьютере под Astra SE все собралось, запускается и работает без проблем. Теперь понадобилось этот код несколько изменить. Для этого на другом рабочем месте (Ubuntu mate) в виртуалке установил Astra SE, где хотел поработать над кодом. И вот тут-то появилась проблема.
Не запускается даже простой «hello_world».
Вот код, если нужно:
C++:
#include <iostream>
int main (int argc, char* argv[]){
std::cout << "Hello world!n";
return 0;
}
Язык C++,
компилирую: g++ hello.cc -o hello
запуск: ./hello
Про подписывание я почитал. Но (честно скажу, невнимательно еще читал) остался вопрос: при каждом новом изменении и компиляции программы нужно ее заново подписывать?
И почему на рабочей машине все сработало? Вроде виртуалку старался сделать такую же, как и рабочую машину.
при каждом новом изменении и компиляции программы нужно ее заново подписывать?
Да, по логике вещей — при каждом.
Но никто не компилирует программы командами gcc и т.п. — для этого используются сценарии сборки make (Makefile).
Запишите последним действием в Makefile команды подписания собранного — и будет вас счастье.
И почему на рабочей машине все сработало?
Потому что есть 3 режима жёсткости контроля подписи — Режим замкнутой программной среды
и может функционировать в одном из следующих режимов:
- исполняемым файлам и разделяемым библиотекам с неверной ЭЦП, а также без ЭЦП загрузка на исполнение запрещается (штатный режим функционирования);
- исполняемым файлам и разделяемым библиотекам с неверной ЭЦП, а также без ЭЦП загрузка на исполнение разрешается, при этом выдается сообщение об ошибке проверки ЭЦП (режим для проверки ЭЦП в СПО);
- ЭЦП при загрузке исполняемых файлов и разделяемых библиотек не проверяется (отладочный режим для тестирования СПО).
На реальном компьютере под Astra SE все собралось, запускается и работает без проблем.
И кто до вас конфигурировал этот реальный компьютер?
но при попытке ее запустить, выскакивает «ошибка сегментирования», и внизу экрана появляется информационное сообщение: «Загрузка неподписанного файла заблокирована СЗ ОС (DIGSIG) …».
Но если при нарушении условий безопасности действительно выскакивает ошибка SIGSEGV — то вот об этом нужно писать в техподдержку разработчика!
не настолько знаком с линуксом, чтобы ответить
А для этого с Linux и знакомым быть не надо…
1. копируете вот те 5 строчек от ТС в файл hello_world.cc — любым редактором (я для таких простых действий предпочитаю mc и его редактор mcedit — только установить стандартно mc нужно);
2. выполняете команду:
3. пробуете выполнить:
4. сообщаете нам сюда о своих успехах…
5. Заходите в системное меню: Панель управления — Безопасность — Политика безопасности — Замкнутая программная среда … и меняете одну из 3-х альтернатив (хорошо бы скриншот этого дела показать сюда)…
6. повторяете попытку запуска, п.3 …
P.S. Это не пустая трата времени для вас, поверьте — это вам ещё много раз пригодится!
Последнее редактирование: 07.08.2019
В 1.5 нашел только галочку «Запрет установки исполняемого бита». Но он не влияет на компиляцию и запуск (всё прошло успешно как под админской учеткой, так и под пользовательской).
А делать настройки безопасности по RedBook с wiki астры лень(
А делать настройки безопасности по RedBook с wiki астры лень..
Так а за шо тада деньги плочены!!!
А вопрос, может быть в курсе: насколько рекомендации из RedBook-а обязательны к исполнению. Ведомство (иной орган) как-то их регламентируют?
Так а за шо тада деньги плочены!!!
А вопрос, может быть в курсе: насколько рекомендации из RedBook-а обязательны к исполнению. Ведомство (иной орган) как-то их регламентируют?
Слышал, что там разрабатывают свои методички по настройке. Но насколько сильно они перекликаются или отличаются — не в курсе.
Спасибо, завтра попробую поиграть с этими настройками.
И кто до вас конфигурировал этот реальный компьютер?
Да я и конфигурировал. Я и админ, я и работник
Но как-то не встретился с такими проблемами при установке. Если я правильно сейчас вспоминаю, при установке был выбор «включить режим замкнутой программной среды». Видимо, я по-разному ответил на этот вопрос на реальном железе и в виртуалке.
Состояние перевода: На этой странице представлен перевод статьи Debugging. Дата последней синхронизации: 15 февраля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
Эта страница в основном посвящена тому, как собрать побольше информации для сообщений об ошибках. Несмотря на то, что используется слово «отладка», она не предназначена в качестве руководства по отладке программ в процессе их разработки.
Когда приложение не работает
Запустите его через командную строку
Если приложение внезапно падает, попробуйте запустить его через терминал. Введите в нём имя приложения (обычно строчными буквами). Если вы не знаете имя исполняемого файла, а знаете только имя пакета, следующая команда может найти имя исполняемого файла:
$ pacman -Ql имяпакета | grep ' /usr/bin/.'
Проверьте наличие дампа памяти
Дамп памяти (core dump) — это файл, в который записывается адресное пространство (память) процесса при его нештатном завершении. Если приложение скомпилировано с поддержкой отладки, этот дамп можно использовать для выяснения того, что и где пошло не так.
Расположение дампов памяти может отличаться в зависимости от настроек операционной системы. Как узнать, включена ли генерация дампов и куда они попадают, описано в статье Дамп памяти.
Ошибки сегментирования
Есть несколько методов, с помощью которых можно выяснить, что пошло не так. Наденьте шляпу детектива.
Gdb
gdb — проверенный временем инструмент отладки приложений. Подробные инструкции по использованию и получению трассировки описаны в статье Отладка/Трассировка#Получение трассировки. После запуска приложения через gdb
вам, вероятно, придётся подождать какое-то время, пока не случится ошибка сегментирования. После этого опубликуйте трассировку на pastebin-сервисе и добавьте полученный URL в сообщение об ошибке.
Если у вас есть дамп памяти, его можно использовать вместе с gdb для получения backtrace:
$ gdb имяприложения core bt full
Valgrind
Если у вас есть бинарный файл с отладочными символами и без inline-функций, то обычно хорошей идеей является запуск программы через valgrind. Это инструмент, который эмулирует процессор и обычно показывает, где что-то идёт не так, или предоставляет дополнительную информацию в дополнение к gdb.
$ valgrind имяприложения
Это позволит получить много полезной отладочной информации в случае сбоя. Попробуйте опции -v
и --leak-check=full
, чтобы собрать ещё больше информации.
Также можно использовать команду:
$ valgrind --tool=callgrind имяприложения
и запустить вывод через kcachegrind, чтобы графически исследовать функции, используемые программой. Если программа зависает, это облегчает определение места ошибки.
Отсутствующие файлы или библиотеки
Strace
strace подробно показывает, что на самом деле делает приложение. Если приложение пытается открыть файл, которого нет, strace это покажет.
Следующая команда покажет файлы, которые приложение пытается открыть:
$ strace -eopen имяприложения
Полученный вывод можно опубликовать на pastebin-сервисе.
Совет: Если вы хотите передать вывод strace в grep, попробуйте: strace -o /dev/stdout имяприложения | grep строка
.
LD_DEBUG
Установка LD_DEBUG=files
дает ещё один обзор того, какие файлы ищет приложение:
$ LD_DEBUG=files имяприложения > файл.log 2>&1
Вывод будет записан в файл.log
.
Подробнее: ld-linux(8).
Readelf
Эта статья или раздел нуждается в переводе
If you get no such file or directory
when running an application, try the following command:
$ readelf -a /usr/bin/appname | grep interp
(replace /usr/bin/appname
with the location of your executable)
Make sure the interpreter in question (like /lib/ld-linux-x86-64.so.2
) actually exists. Install ld-lsb if need be.
Если программа написана не на C или C++, а является скриптом
Используйте команду file, чтобы узнать информацию об исполняемом файле:
$ file /usr/bin/имяприложения
Если она выведет ELF
, то это бинарный исполняемый файл, который обычно компилируется из кода C или C++. Если она выведет Python script
, значит вы имеете дело с приложением, написанным на Python.
Если это шелл-скрипт, откройте его в текстовом редакторе и посмотрите (обычно в конце файла), есть ли в нём имя реальной программы (ELF-файла). Можно временно прописать «gdb» прямо в скрипт перед именем исполняемого файла в целях отладки. Используйте префикс gdb --args
, если программе нужно передать аргументы.
Для чистых шелл-скриптов можно использовать bash -x имя_скрипта
или bash -xv имя_скрипта
, что выведет подробную информацию о процессе выполнения скрипта.
Тексты ошибок в Python-приложениях часто содержат информацию о том, в каком файле и на какой строке произошел сбой. Если вы знаете Python, вы можете попытаться исправить это и вложить своё исправление в сообщение об ошибке.
Отправка собщения об ошибке
Сообщите об ошибке на https://bugs.archlinux.org или, возможно, отправьте сообщение непосредственно разработчикам приложения, а затем укажите ссылку на него в сообщении для Arch Linux. Это поможет всем нам.
Однако если вы считаете, что что-то не так с самим приложением, а не с тем, как оно собрано в Arch Linux, то сообщите об ошибке непосредственно разработчикам приложения (в upstream).
Смотрите также
- Gentoo:Project:Quality Assurance/Backtraces
A segmentation fault is when your program attempts to access memory it has either not been assigned by the operating system, or is otherwise not allowed to access.
«segmentation» is the concept of each process on your computer having its own distinct virtual address space. Thus, when Process A reads memory location 0x877, it reads information residing at a different physical location in RAM than when Process B reads its own 0x877.
All modern operating systems support and use segmentation, and so all can produce a segmentation fault.
To deal with a segmentation fault, fix the code causing it. It is generally indicative of poor programming, especially boundary-condition errors, incorrect pointer manipulation, or invalid assumptions about shared libraries. Sometimes segfaults, like any problem, may be caused by faulty hardware, but this is usually not the case.
- Печать
Страницы: [1] Вниз
Тема: Ошибка сегментирования (стек памяти сброшен на диск) [Решено] (Прочитано 10787 раз)
0 Пользователей и 1 Гость просматривают эту тему.

DANNNNN
Привет всем.
Есть программа. Она устанавливается из архива, который предварительно скачивается и после устанавливается.
Программа очень специфичная. Ты ей подсовываешь файл с командами, она его рассчитывает ( математического уклона программа) и выдаёт файл типа out.
И вот вчера при попытке запустить программу она выдаёт:
dan@dan-B450-AORUS-PRO:~/opt/2$ $GAUSS_EXEDIR/g16 NiFeSi2New33.inp
Естественно у меня всего один файл в папке из которой происходит запуск.
Unable to open input file "NiFeSi2New33.inp" or "NiFeSi2New33.inp".
Ошибка сегментирования (стек памяти сброшен на диск)
Что я делал. Я на создавал кучу входных файлов ( вот этот 3-ий был) и всё равно прога почему-то видит какой-то второй такой- же файл.
Я обновлял Ubuntu, я перестановил программу поверх старой. Ничего не помогает(.
Помогите кто чем может.
« Последнее редактирование: 18 Марта 2020, 11:41:50 от zg_nico »

bezbo
Ошибка сегментирования (стек памяти сброшен на диск)
Ошибка сегментации, Segmentation fault, или Segfault, или SIGSEGV в Ubuntu и других Unix подобных дистрибутивах, означает ошибку работы с памятью. Когда вы получаете эту ошибку, это значит, что срабатывает системный механизм защиты памяти, потому что программа попыталась получить доступ или записать данные в ту часть памяти, к которой у нее нет прав обращаться.
Помогите кто чем может
вам остается только отправить отчет об ошибке разработчикам
или запустите программу отладчиком sudo gdb -q

ReNzRv
И вот вчера
До этого система обновлялась?
Автоматическое обновление системы включено в настройках?

DANNNNN
Проблема решилась(
Очень странно. Но я взял файл, который до этого запускался и немного изменил в неём параметры на те которые нужны. И всё заработало.
До этого файлы были созданы как копии того файла, который был создан на другом ПК и перенесён на этот комп через флэшку. Все копии этого файла и выдавали ошибку, не смотря на то, что некоторые из них также я переносил и на другие диски, там редактриовали переносил обратно.
Что это было- не понятно.
Короче ошибка в файле О_о.
Системе обновлялась конечно же.
P.S. До написание сюда я просидел часов 5 над проблемой.
« Последнее редактирование: 16 Ноября 2019, 10:18:29 от DANNNNN »

andytux
«Разруха в головах, а не в клозетах.»
перенесён на этот комп через флэшку. …Короче ошибка в файле
Права на файл.
- Печать
Страницы: [1] Вверх