Не всегда программы в 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.
~/.mozilla/firefox/ID.default/places.sqlite поместить в новый профиль.
Вот же блин, прочитал то же самое на сайте мозиллы. Включил поиск Ctrl + F в Dolphin и ничего не нашло. Нафиг нужен такой поиск, если он в скрытых папках не ищет. Спасибо за путь, на сайте мозиллы он как раз не указан… Скопировал файлик places.sqlite.
Еще старые копии ~/.mozilla/firefox/ID.default/bookmarkbackups
Я так понял с places.sqlite проще? Его просто копируешь и все само работает, а файлы «*.jsonlz4» не только копировать надо, но и восстанавливать через браузер, больше действий. Т.е. главное хранилище это именно places.sqlite — туда все запишется?
А вот эти бэкапы в виде jsonlz4-файлов — их кто создает? Автоматически? Я чето просто логики не уловил. Сам не экспортировал (через браузер) никогда, а судя по датам jsonlz4-файлов, то как-то хаотично бэкапится. Может по дате последних изменений/добавлений в меню закладок создает очередной jsonlz4-файл?
Но лучше сохранить всю папку ~/.mozilla.
Так и сделал, это еще проще. Спасибо за советы!
Теперь видимо буду переустанавливать браузер. Надеюсь запустится…
Жаль нельзя как в стиме, нажал кнопочку «Fix» и файлы программ сверились с эталоном на сервере, и если битый где или нехватает, то докачался. Было бы прикольно! Интересно, почему такой штуки еще не сделали в линуксе.
anonymous
()
- Показать ответы
- Ссылка
View previous topic :: View next topic | |||||||||||
Author | Message | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Laitr Keiows Bodhisattva Joined: 04 Jul 2005 |
|
||||||||||
Back to top |
|
||||||||||
046 Apprentice Joined: 21 Jul 2004 |
|
||||||||||
Back to top |
|
||||||||||
Laitr Keiows Bodhisattva Joined: 04 Jul 2005 |
|
||||||||||
Back to top |
|
||||||||||
SergDL n00b Joined: 04 Apr 2005 |
|
||||||||||
Back to top |
|
||||||||||
Laitr Keiows Bodhisattva Joined: 04 Jul 2005 |
|
||||||||||
Back to top |
|
||||||||||
SergDL n00b Joined: 04 Apr 2005 |
|
||||||||||
Back to top |
|
||||||||||
dmiceman Tux’s lil’ helper Joined: 06 Jun 2005 |
|
||||||||||
Back to top |
|
||||||||||
Laitr Keiows Bodhisattva Joined: 04 Jul 2005 |
|
||||||||||
Back to top |
|
||||||||||
dmiceman Tux’s lil’ helper Joined: 06 Jun 2005 |
|
||||||||||
Back to top |
|
||||||||||
fank l33t Joined: 16 Oct 2004 |
|
||||||||||
Back to top |
|
||||||||||
dmiceman Tux’s lil’ helper Joined: 06 Jun 2005 |
|
||||||||||
Back to top |
|
||||||||||
Laitr Keiows Bodhisattva Joined: 04 Jul 2005 |
|
||||||||||
Back to top |
|
||||||||||
|
You cannot post new topics in this forum |
My setup:windows 7 ,ruby 1.9.3
I have tried this on four PCs(windows 7),only one is normal
I have tried ruby 2.1.6,it also appears
I have tried the 0.7.0 version of watir-driver,no use!
* LOCAL GEMS *
bigdecimal (1.1.0)
childprocess (0.5.6)
ffi (1.9.9 x86-mingw32)
io-console (0.3)
json (1.5.5)
minitest (2.5.1)
multi_json (1.11.1)
rake (0.9.2.2)
rdoc (3.9.5)
rubyzip (1.1.7)
selenium-webdriver (2.46.2)
watir-webdriver (0.8.0)
websocket (1.2.2)
the code:
1 require 'watir-webdriver'
2 browser = Watir::Browser.new
3 browser.go_to "https://www.baidu.com"
4 browser.close
Error info:there is part of the error info
C:\Ruby193\bin\ruby.exe -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) E:/Automation/Automation/watir_test/web_test1.rb
C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.5.6/lib/childprocess/windows/lib.rb:311: [BUG] Segmentation fault
ruby 1.9.3p551 (2014-11-13) [i386-mingw32]
-- Control frame information -----------------------------------------------
c:0022 p:---- s:0087 b:0087 l:000086 d:000086 CFUNC :get_osfhandle
c:0021 p:0122 s:0083 b:0083 l:000082 d:000082 METHOD C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.5.6/lib/childprocess/windows/lib.rb:311
c:0020 p:0066 s:0077 b:0076 l:000075 d:000075 METHOD C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.5.6/lib/childprocess/windows/lib.rb:270
c:0019 p:0213 s:0072 b:0072 l:000071 d:000071 METHOD C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.5.6/lib/childprocess.rb:153
c:0018 p:0054 s:0067 b:0067 l:000066 d:000066 METHOD C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/common/socket_lock.rb:64
c:0017 p:0051 s:0063 b:0063 l:000062 d:000062 METHOD C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/common/socket_lock.rb:49
c:0016 p:0011 s:0059 b:0059 l:000058 d:000058 METHOD C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/common/socket_lock.rb:35
c:0015 p:0017 s:0055 b:0055 l:001c9c d:001c9c METHOD C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/firefox/launcher.rb:51
c:0014 p:0175 s:0052 b:0052 l:000051 d:000051 METHOD C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/firefox/bridge.rb:41
c:0013 p:---- s:0042 b:0042 l:000041 d:000041 FINISH
c:0012 p:---- s:0040 b:0040 l:000039 d:000039 CFUNC :new
c:0011 p:0200 s:0036 b:0036 l:000035 d:000035 METHOD C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/common/driver.rb:50
c:0010 p:0021 s:0029 b:0029 l:000028 d:000028 METHOD C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver.rb:84
c:0009 p:0129 s:0025 b:0025 l:000024 d:000024 METHOD C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.8.0/lib/watir-webdriver/browser.rb:45
c:0008 p:---- s:0020 b:0020 l:000019 d:000019 FINISH
c:0007 p:---- s:0018 b:0018 l:000017 d:000017 CFUNC :new
c:0006 p:0029 s:0015 b:0015 l:000014 d:000014 TOP E:/Automation/Automation/watir_test/web_test1.rb:4
c:0005 p:---- s:0012 b:0012 l:000011 d:000011 FINISH
c:0004 p:---- s:0010 b:0010 l:000009 d:000009 CFUNC :load
c:0003 p:0051 s:0006 b:0006 l:000abc d:001d64 EVAL -e:1
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:000abc d:000abc TOP
-- Ruby level backtrace information ----------------------------------------
-e:1:in `<main>'
-e:1:in `load'
E:/Automation/Automation/watir_test/web_test1.rb:4:in `<top (required)>'
E:/Automation/Automation/watir_test/web_test1.rb:4:in `new'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/watir-webdriver-0.8.0/lib/watir-webdriver/browser.rb:45:in `initialize'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver.rb:84:in `for'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/common/driver.rb:50:in `for'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/common/driver.rb:50:in `new'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/firefox/bridge.rb:41:in `initialize'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/firefox/launcher.rb:51:in `launch'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/common/socket_lock.rb:35:in `locked'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/common/socket_lock.rb:49:in `lock'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.46.2/lib/selenium/webdriver/common/socket_lock.rb:64:in `can_lock?'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.5.6/lib/childprocess.rb:153:in `close_on_exec'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.5.6/lib/childprocess/windows/lib.rb:270:in `dont_inherit'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.5.6/lib/childprocess/windows/lib.rb:311:in `handle_for'
C:/Ruby193/lib/ruby/gems/1.9.1/gems/childprocess-0.5.6/lib/childprocess/windows/lib.rb:311:in `get_osfhandle'
-- C level backtrace information -------------------------------------------
.
.
.
.
[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
# |
|
Темы: 10 Сообщения: 79 Участник с: 18 января 2010 |
Вчера днём это произошло первый раз. После чего — не могу даже предположить. Но факт остаётся фактом — при попытке вызвать меню браузера или контекстное меню на страничке, даже нажатие на Application(кнопочка такая) вылетает. жалуется на ошибку сегментирования. в гугле нашел только про тормоза при открытии меню. кто может помочь отремонтировать браузер? |
mango |
# |
Темы: 43 Сообщения: 1521 Участник с: 18 декабря 2008 |
1. какие аддоны ставил последний раз? 2 . попробуй переименовать ~/.mozilla в, скажем ~/.mozilla.back и запусти фирефокс. Получишь девственный конфиг. 3. Какую тему gtk последний раз применял? пробуй и найдёшь ошибку. |
kest |
# |
Темы: 10 Сообщения: 79 Участник с: 18 января 2010 |
Не помогло. Удалял настройки, ставил стандартную тему GTK, отключал компиз, рестартовал иксы, переустанавливал сам ФФ, без толку. |
mango |
# |
Темы: 43 Сообщения: 1521 Участник с: 18 декабря 2008 |
попробуй в Х-сах в терминале запустить firefox. При вылете — какую ошибку пишет? |
kest |
# |
Темы: 10 Сообщения: 79 Участник с: 18 января 2010 |
$ firefox Ошибка сегментирования $ вот это и больше ничего |
kest |
# |
Темы: 10 Сообщения: 79 Участник с: 18 января 2010 |
починил я браузер… только не совсем это правильно. пришлось удалить все настройки гнома. на это натолкнул факт работы менюшки под рутом. |
amigo |
# |
Темы: 35 Сообщения: 2126 Участник с: 05 февраля 2007 |
Если файлами в ~/ завладел root, то, как правило, sudo chmod -R amigo:amigo ~/ помогает.
Разберемся, голубчик! |
kest |
# |
Темы: 10 Сообщения: 79 Участник с: 18 января 2010 |
не, дело было не в этом. я даже не знаю в чём. а провермл — запустил иксы и залогинился под рутом, там работало. подумал-подумаи и потёр все конфиги, щас работает.. |