Ошибка сегментирования Ubuntu | Losst

Ошибка сегментирования Ubuntu

Не всегда программы в 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-get update
$ sudo apt-get dist-upgrade

Если это не помогло, нужно обнулить настройки программы до значений по умолчанию, возможно, удалить кэш. Настройки программ в Linux обычно содержатся в домашней папке, скрытых подкаталогах с именем программы. Также, настройки и кэш могут содержаться в каталогах ~/.config и ~/.cache. Просто удалите папки программы и попробуйте снова ее запустить. Если и это не помогло, вы можете попробовать полностью удалить программу, а потом снова ее установить, возможно, какие-нибудь зависимости были повреждены:

$ sudo apt remove пакет_программы
$ sudo apt-get autoremove
$ sudo apt install пакет_программы

Если есть возможность, попробуйте установить программу из другого источника, например, не из PPA, а более старую версию, из официальных репозиториев.

Когда вы все это выполнили, скорее всего, проблема не в вашем дистрибутиве, а в самой программе. Нужно отправлять отчет разработчикам. В Ubuntu это можно сделать с помощью программы apport-bug. Обычно Ubuntu предлагает это сделать сразу, после того как программа завершилась с ошибкой сегментирования. Если же ошибка сегментирования Ubuntu встречается не в системной программе, то вам придется самим искать разработчиков и вручную описывать что произошло.

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

Рассмотрим, как его получить. Это не так уж сложно. Сначала запустите вашу программу, затем узнайте ее PID с помощью команды:

$ pgrep программа

Дальше запускаем отладчик gdb:

$ sudo gdb -q

Подключаемся к программе:

(gdb) attach ваш_pid

После подключения программа станет на паузу, продолжаем ее выполнение командой:

(gdb) continue

segfault

Затем вам осталось только вызвать ошибку:

segfault1

И набрать команду, которая выведет стек последних вызовов:

(gdb) backtrace

Вывод этой команды и нужно отправлять разработчикам. Чтобы отключиться от программы и выйти наберите:

(gdb) detach
(gdb) quit

Дальше остается отправить отчет и ждать исправления ошибки. Если вы не уверены, что ошибка в программе, можете поспрашивать на форумах. Когда у вас есть стек вызовов, уже можно попытаться, если не понять в чем проблема, то попытаться узнать, не сталкивался ли с подобной проблемой еще кто-то.

Выводы

Теперь у вас есть приблизительный план действий, что нужно делать, когда появляется ошибка сегментирования сделан дамп памяти ubuntu. Если вы знаете другие способы решить эту проблему, напишите в комментариях!

Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую OpenSUSE. Кроме Linux интересуюсь всем, что связано с информационными технологиями и современной наукой.

Ваше имя тоже может быть здесь. Как? Пишите для нас! Смотрите подробнее как стать автором Losst.

Оцените статью:

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (6 оценок, среднее: 5,00 из 5)
Загрузка...

  3 comments for “Ошибка сегментирования Ubuntu

  1. Октябрь 14, 2016 at 5:09 пп

    Спасибо, было очень интересно почитать про отладчик.

  2. Генадий
    Декабрь 25, 2016 at 5:21 пп

    На самом деле от этого избавится я не могу. Остаётся мне всё сваливать на свой старый компьютер с 1024 мегабайтами озу. Постоянные ошибки сегментирования когда комплимирую какую-либо программу. Чтобы скомплимировать ядро надо по миллиону раз вводить make!! Щас выкину комп и куплю новый и думаю проблема сама разрешится.

  3. Александр
    Март 20, 2017 at 7:28 дп

    Здравствуйте! Я скачал программу для видеонаблюдения, называется motion (https://ru.wikipedia.org/wiki/Motion_(программа_видеонаблюдения) . Минут 5 она работает нормально после чего возникает такая ошибка: Ошибка сегментирования (стек памяти сброшен на диск) и программа прекращает работать. Скажите, можно ли самому исправить эту ошибку? Полный вывод:

    [XakeP sasha]# motion -n
    [162326040:motion] [NTC] [ALL] conf_load: Processing thread 0 — config file /etc/motion/motion.conf
    [162326040:motion] [NTC] [ALL] motion_startup: Motion 4.0.1 Started
    [162326040:motion] [NTC] [ALL] motion_startup: Logging to syslog
    [162326040:motion] [NTC] [ALL] motion_startup: Using log type (ALL) log level (NTC)
    [162326040:motion] [NTC] [ENC] ffmpeg_init: ffmpeg libavcodec version 57.64.100 libavformat version 57.56.100
    [0:motion] [NTC] [ALL] main: Camera 0 is from /etc/motion/motion.conf
    [0:motion] [NTC] [ALL] main: Camera 0 is device: /dev/video0 input -1
    [0:motion] [NTC] [ALL] main: Stream port 8081
    [0:motion] [NTC] [ALL] main: Waiting for threads to finish, pid: 1198
    [1:ml1] [NTC] [ALL] motion_init: Camera 0 started: motion detection Enabled
    [1:ml1] [NTC] [VID] vid_v4lx_start: Using videodevice /dev/video0 and input -1
    [0:web_control] [NTC] [STR] http_bindsock: listening on 127.0.0.1 port 8080
    [0:web_control] [NTC] [STR] httpd_run: Started motion-httpd server on port 8080 (auth Disabled)
    [1:ml1] [NTC] [VID] v4l2_get_capability:
    ————————
    cap.driver: «uvcvideo»
    cap.card: «UVC Camera (046d:080a)»
    cap.bus_info: «usb-0000:00:1d.0-1.3»
    cap.capabilities=0x84200001
    ————————
    [1:ml1] [NTC] [VID] v4l2_get_capability: — VIDEO_CAPTURE
    [1:ml1] [NTC] [VID] v4l2_get_capability: — STREAMING
    [1:ml1] [NTC] [VID] v4l2_select_input: name = «Camera 1», type 0x00000002, status 00000000
    [1:ml1] [NTC] [VID] v4l2_select_input: — CAMERA
    [1:ml1] [WRN] [VID] v4l2_select_input: Device doesn’t support VIDIOC_G_STD
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: Config palette index 17 (YU12) doesn’t work.
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: Supported palettes:
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: (0) YUYV (YUYV 4:2:2)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: 0 — YUYV 4:2:2 (compressed : 0) (0x56595559)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: (1) MJPG (Motion-JPEG)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: 1 — Motion-JPEG (compressed : 1) (0x47504a4d)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format Selected palette YUYV
    [1:ml1] [NTC] [VID] v4l2_do_set_pix_format: Testing palette YUYV (1280×720)
    [1:ml1] [NTC] [VID] v4l2_do_set_pix_format: Using palette YUYV (1280×720) bytesperlines 2560 sizeimage 1843200 colorspace 00000008
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980900, «Brightness», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Brightness», default 128, current 128
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980901, «Contrast», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Contrast», default 32, current 32
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980902, «Saturation», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Saturation», default 28, current 28
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980918, «Power Line Frequency», range 0,2
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Power Line Frequency», default 2, current 2
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980913, «Gain», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Gain», default 0, current 0
    [1:ml1] [NTC] [VID] vid_v4lx_start: Using V4L2
    [1:ml1] [NTC] [ALL] image_ring_resize: Resizing pre_capture buffer to 1 items
    [1:ml1] [NTC] [VID] v4l2_set_control: setting control «Contrast» to 69 (ret -1 Input/output error)
    [1:ml1] [NTC] [VID] v4l2_set_control: setting control «Saturation» to 19 (ret -1 Input/output error)
    [1:ml1] [NTC] [STR] http_bindsock: listening on 127.0.0.1 port 8081
    [1:ml1] [NTC] [ALL] motion_init: Started motion-stream server on port 8081 (auth Disabled)
    [1:ml1] [NTC] [EVT] event_new_video Source FPS 5
    [1:ml1] [NTC] [ENC] ffmpeg_open Selected Output FPS 5
    [1:ml1] [NTC] [ENC] ffmpeg_avcodec_log: Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
    [1:ml1] [NTC] [EVT] event_newfile: File of type 8 saved to: ./01-20170320090548.avi
    [1:ml1] [NTC] [ALL] motion_detected: Motion detected — starting event 1
    [1:ml1] [NTC] [ALL] preview_save: different filename or picture only!
    [1:ml1] [NTC] [EVT] event_newfile: File of type 1 saved to: ./01-20170320090548-01.jpg
    [1:ml1] [NTC] [ALL] motion_loop: End of event 1
    [1:ml1] [NTC] [EVT] event_new_video Source FPS 5
    [1:ml1] [NTC] [ENC] ffmpeg_open Selected Output FPS 5
    [1:ml1] [NTC] [ENC] ffmpeg_avcodec_log: Using AVStream.codec to pass codec parameters to muxers is deprecated, use AVStream.codecpar instead.
    [1:ml1] [NTC] [EVT] event_newfile: File of type 8 saved to: ./02-20170320091023.avi
    [1:ml1] [NTC] [ALL] motion_detected: Motion detected — starting event 2
    [1:ml1] [ERR] [VID] v4l2_next: VIDIOC_QBUF: No such device
    [1:ml1] [ERR] [ALL] motion_loop: Video device fatal error — Closing video device
    [1:ml1] [NTC] [VID] vid_close: Closing video device /dev/video0
    [1:ml1] [WRN] [ALL] motion_loop: Retrying until successful connection with camera
    [1:ml1] [NTC] [VID] vid_v4lx_start: Using videodevice /dev/video0 and input -1
    [1:ml1] [NTC] [VID] v4l2_get_capability:
    ————————
    cap.driver: «uvcvideo»
    cap.card: «UVC Camera (046d:080a)»
    cap.bus_info: «usb-0000:00:1d.0-1.3»
    cap.capabilities=0x84200001
    ————————
    [1:ml1] [NTC] [VID] v4l2_get_capability: — VIDEO_CAPTURE
    [1:ml1] [NTC] [VID] v4l2_get_capability: — STREAMING
    [1:ml1] [NTC] [VID] v4l2_select_input: name = «Camera 1», type 0x00000002, status 00000000
    [1:ml1] [NTC] [VID] v4l2_select_input: — CAMERA
    [1:ml1] [WRN] [VID] v4l2_select_input: Device doesn’t support VIDIOC_G_STD
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: Config palette index 17 (YU12) doesn’t work.
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: Supported palettes:
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: (0) YUYV (YUYV 4:2:2)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: 0 — YUYV 4:2:2 (compressed : 0) (0x56595559)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: (1) MJPG (Motion-JPEG)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: 1 — Motion-JPEG (compressed : 1) (0x47504a4d)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format Selected palette YUYV
    [1:ml1] [NTC] [VID] v4l2_do_set_pix_format: Testing palette YUYV (1280×720)
    [1:ml1] [NTC] [VID] v4l2_do_set_pix_format: Using palette YUYV (1280×720) bytesperlines 2560 sizeimage 1843200 colorspace 00000008
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980900, «Brightness», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Brightness», default 128, current 128
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980901, «Contrast», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Contrast», default 32, current 32
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980902, «Saturation», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Saturation», default 28, current 28
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980918, «Power Line Frequency», range 0,2
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Power Line Frequency», default 2, current 2
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980913, «Gain», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Gain», default 0, current 32
    [1:ml1] [NTC] [VID] vid_v4lx_start: Using V4L2
    [1:ml1] [NTC] [VID] v4l2_set_control: setting control «Contrast» to 69 (ret -1 Input/output error)
    [1:ml1] [NTC] [VID] v4l2_set_control: setting control «Saturation» to 19 (ret -1 Input/output error)
    [1:ml1] [ERR] [VID] v4l2_next: VIDIOC_QBUF: No such device
    [1:ml1] [ERR] [ALL] motion_loop: Video device fatal error — Closing video device
    [1:ml1] [NTC] [VID] vid_close: Closing video device /dev/video0
    [1:ml1] [WRN] [ALL] motion_loop: Retrying until successful connection with camera
    [1:ml1] [NTC] [VID] vid_v4lx_start: Using videodevice /dev/video0 and input -1
    [1:ml1] [ALR] [VID] vid_v4lx_start: Failed to open video device /dev/video0: No such file or directory
    [1:ml1] [WRN] [ALL] motion_loop: Retrying until successful connection with camera
    [1:ml1] [NTC] [VID] vid_v4lx_start: Using videodevice /dev/video0 and input -1
    [1:ml1] [ALR] [VID] vid_v4lx_start: Failed to open video device /dev/video0: No such file or directory
    [1:ml1] [WRN] [ALL] motion_loop: Retrying until successful connection with camera
    [1:ml1] [NTC] [VID] vid_v4lx_start: Using videodevice /dev/video0 and input -1
    [1:ml1] [NTC] [VID] v4l2_get_capability:
    ————————
    cap.driver: «uvcvideo»
    cap.card: «UVC Camera (046d:080a)»
    cap.bus_info: «usb-0000:00:1d.0-1.3»
    cap.capabilities=0x84200001
    ————————
    [1:ml1] [NTC] [VID] v4l2_get_capability: — VIDEO_CAPTURE
    [1:ml1] [NTC] [VID] v4l2_get_capability: — STREAMING
    [1:ml1] [NTC] [VID] v4l2_select_input: name = «Camera 1», type 0x00000002, status 00000000
    [1:ml1] [NTC] [VID] v4l2_select_input: — CAMERA
    [1:ml1] [WRN] [VID] v4l2_select_input: Device doesn’t support VIDIOC_G_STD
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: Config palette index 17 (YU12) doesn’t work.
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: Supported palettes:
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: (0) YUYV (YUYV 4:2:2)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: 0 — YUYV 4:2:2 (compressed : 0) (0x56595559)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: (1) MJPG (Motion-JPEG)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format: 1 — Motion-JPEG (compressed : 1) (0x47504a4d)
    [1:ml1] [NTC] [VID] v4l2_set_pix_format Selected palette YUYV
    [1:ml1] [NTC] [VID] v4l2_do_set_pix_format: Testing palette YUYV (1280×720)
    [1:ml1] [NTC] [VID] v4l2_do_set_pix_format: Using palette YUYV (1280×720) bytesperlines 2560 sizeimage 1843200 colorspace 00000008
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980900, «Brightness», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Brightness», default 128, current 128
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980901, «Contrast», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Contrast», default 32, current 32
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980902, «Saturation», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Saturation», default 28, current 28
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980918, «Power Line Frequency», range 0,2
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Power Line Frequency», default 2, current 2
    [1:ml1] [NTC] [VID] v4l2_scan_controls: found control 0x00980913, «Gain», range 0,255
    [1:ml1] [NTC] [VID] v4l2_scan_controls: «Gain», default 0, current 32
    [1:ml1] [NTC] [VID] vid_v4lx_start: Using V4L2
    [1:ml1] [NTC] [VID] v4l2_set_control: setting control «Contrast» to 69 (ret 0 )
    [1:ml1] [NTC] [VID] v4l2_set_control: setting control «Saturation» to 19 (ret 0 )
    [1:ml1] [ERR] [ENC] ffmpeg_avcodec_log: Too large number of skipped frames 87374 > 60000
    [1:ml1] [ERR] [ENC] ffmpeg_put_frame: Error while writing video frame: Invalid argument
    [1:ml1] [NTC] [ALL] motion_loop: Thread exiting
    [1:ml1] [NTC] [STR] stream_stop: Closing motion-stream listen socket & active motion-stream sockets
    [1:ml1] [NTC] [STR] stream_stop: Closed motion-stream listen socket & active motion-stream sockets
    Ошибка сегментирования (стек памяти сброшен на диск)

Добавить комментарий

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: