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

Не всегда программы в 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

segfault

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

segfault1

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

(gdb) backtrace

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

(gdb) detach
(gdb) quit

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

Выводы

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

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

~/.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

(08.11.19 00:56:34 MSK)

  • Показать ответы
  • Ссылка

Не всегда программы в 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

segfault

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

segfault1

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

(gdb) backtrace

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

(gdb) detach
(gdb) quit

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

Выводы

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

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

Содержание:

  • Handling
  • Overview
  • Causes
  • Что такое ошибка сегментации?
  • Additional Information
  • Examples
    • Writing to read-only memory
    • Null pointer dereference
    • Stack overflow

Handling

The default action for a segmentation fault or bus error is abnormal termination of the process that triggered it. A core file may be generated to aid debugging, and other platform-dependent actions may also be performed. For example, Linux systems using the grsecurity patch may log SIGSEGV signals in order to monitor for possible intrusion attempts using buffer overflows.

On some systems, like Linux and Windows, it is possible for the program itself to handle a segmentation fault.. Depending on the architecture and operating system, the running program can not only handle the event but may extract some information about its state like getting a stack trace, processor register values, the line of the source code when it was triggered, memory address that was invalidly accessed and whether the action was a read or a write.

Although a segmentation fault generally means that the program has a bug that needs fixing, it is also possible to intentionally cause such failure for the purposes of testing, debugging and also to emulate platforms were direct access to memory is needed. On the latter case, the system must be able to allow the program to run even after the fault occurs. In this case, when the system allows, it is possible to handle the event and increment the processor program counter to «jump» over the failing instruction to continue the execution.

Overview

Example of human generated signal

A null pointer dereference on Windows 8

A segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (for example, attempting to write to a read-only location, or to overwrite part of the operating system).

The term «segmentation» has various uses in computing; in the context of «segmentation fault», a term used since the 1950s, it refers to the address space of a program.[citation needed] With memory protection, only the program’s own address space is readable, and of this, only the stack and the read/write portion of the data segment of a program are writable, while read-only data and the code segment are not writable. Thus attempting to read outside of the program’s address space, or writing to a read-only segment of the address space, results in a segmentation fault, hence the name.

On systems using hardware memory segmentation to provide virtual memory, a segmentation fault occurs when the hardware detects an attempt to refer to a non-existent segment, or to refer to a location outside the bounds of a segment, or to refer to a location in a fashion not allowed by the permissions granted for that segment. On systems using only paging, an invalid page fault generally leads to a segmentation fault, and segmentation faults and page faults are both faults raised by the virtual memory management system. Segmentation faults can also occur independently of page faults: illegal access to a valid page is a segmentation fault, but not an invalid page fault, and segmentation faults can occur in the middle of a page (hence no page fault), for example in a buffer overflow that stays within a page but illegally overwrites memory.

At the hardware level, the fault is initially raised by the memory management unit (MMU) on illegal access (if the referenced memory exists), as part of its memory protection feature, or an invalid page fault (if the referenced memory does not exist). If the problem is not an invalid logical address but instead an invalid physical address, a bus error is raised instead, though these are not always distinguished.

At the operating system level, this fault is caught and a signal is passed on to the offending process, activating the process’s handler for that signal. Different operating systems have different signal names to indicate that a segmentation fault has occurred. On Unix-like operating systems, a signal called SIGSEGV (abbreviated from segmentation violation) is sent to the offending process. On Microsoft Windows, the offending process receives a STATUS_ACCESS_VIOLATION exception.

Causes

The conditions under which segmentation violations occur and how they manifest themselves are specific to hardware and the operating system: different hardware raises different faults for given conditions, and different operating systems convert these to different signals that are passed on to processes. The proximate cause is a memory access violation, while the underlying cause is generally a software bug of some sort. Determining the root cause – debugging the bug – can be simple in some cases, where the program will consistently cause a segmentation fault (e.g., dereferencing a null pointer), while in other cases the bug can be difficult to reproduce and depend on memory allocation on each run (e.g., dereferencing a dangling pointer).

The following are some typical causes of a segmentation fault:

  • Attempting to access a nonexistent memory address (outside process’s address space)
  • Attempting to access memory the program does not have rights to (such as kernel structures in process context)
  • Attempting to write read-only memory (such as code segment)

These in turn are often caused by programming errors that result in invalid memory access:

  • Dereferencing a null pointer, which usually points to an address that’s not part of the process’s address space
  • Dereferencing or assigning to an uninitialized pointer (wild pointer, which points to a random memory address)
  • Dereferencing or assigning to a freed pointer (dangling pointer, which points to memory that has been freed/deallocated/deleted)
  • A buffer overflow
  • A stack overflow
  • Attempting to execute a program that does not compile correctly. (Some compilers will output an executable file despite the presence of compile-time errors.)

In C code, segmentation faults most often occur because of errors in pointer use, particularly in C dynamic memory allocation. Dereferencing a null pointer will always result in a segmentation fault, but wild pointers and dangling pointers point to memory that may or may not exist, and may or may not be readable or writable, and thus can result in transient bugs. For example:

char *p1 = NULL;           // Null pointer
char *p2;                  // Wild pointer: not initialized at all.
char *p3  = malloc(10 * sizeof(char));  // Initialized pointer to allocated memory
                                        // (assuming malloc did not fail)
free(p3);                  // p3 is now a dangling pointer, as memory has been freed

Now, dereferencing any of these variables could cause a segmentation fault: dereferencing the null pointer generally will cause a segfault, while reading from the wild pointer may instead result in random data but no segfault, and reading from the dangling pointer may result in valid data for a while, and then random data as it is overwritten.

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

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

Чтобы понять почему так происходит, давайте рассмотрим как устроена работа с памятью в Linux, я попытаюсь все упростить, но приблизительно так оно и работает.

Допустим, в вашей системе есть 6 Гигабайт оперативной памяти, каждой программе нужно выделить определенную область, куда будет записана она сама, ее данные и новые данные, которые она будет создавать. Чтобы дать возможность каждой из запущенных программ использовать все шесть гигабайт памяти был придуман механизм виртуального адресного пространства. Создается виртуальное пространство очень большого размера, а из него уже выделяется по 6 Гб для каждой программы. Если интересно, это адресное пространство можно найти в файле /proc/kcore, только не вздумайте никуда его копировать.

Выделенное адресное пространство для программы называется сегментом. Как только программа попытается записать или прочитать данные не из своего сегмента, ядро отправит ей сигнал SIGSEGV и программа завершится с нашей ошибкой. Более того, каждый сегмент поделен на секции, в некоторые из них запись невозможна, другие нельзя выполнять, если программа и тут попытается сделать что-то запрещенное, мы опять получим ошибку сегментации Ubuntu.

Additional Information

BackgroundModern general purpose hardware includes a «memory management unit» (or MMU). This hardware feature is used by operating systems like Linux to implement memory protection, i.e. to prevent different processes from accessing or modifying each other’s memory (except in a strictly controlled fashion through specific APIs). This simplifies troubleshooting and increases resilience as processes are carefully contained and separated from one another.A «segmentation violation» signal is sent to a process of which the memory management unit detected an attempt to use a memory address that does not belong to it.Common cause: programming errorIf a process tries to access memory through a pointer which has not been properly initialised, or which is pointing to memory that has previously been deallocated, this will likely result in a segfault. In this case, the segfault is occurring with a specific process or binary, possibly under a specific set of circumstances.To deal with this type of segfault, begin by applying all relevant service packs and maintenance updates. Next, if the problem is still reproducible with current code, try to capture an application core dump for analysis. Details for this are found in TID 3054866 — How to obtain application core dumps.If the problematic binary is shipped by Novell as part of the product, open a service request with Novell Technical services, supplying

  • a description of the circumstances under which the core dump was generated,
  • a supportconfig -v report for the affected system (supportconfig home page), and
  • the core dump file itself, if smaller than 50 MB. If it is larger, wait for the service request to be assigned to an engineer and then work with the engineer to transfer it.

If the problematic binary was supplied by a third party, contact that party’s support department for assistance.Common cause: mismatched binary and librariesSegfaults can occur with processes that combine binaries and shared libraries which aren’t (fully) compatible. This can occur, for instance, when a library is updated in a way that changes the library’s ABI (application binary interface), but the library’s internal version number is not updated to reflect this. A binary that was built against an older version of the library may start to segfault when loaded against the newer version.This case may be difficult to recognise, and there is no step list for dealing with it. When this case is suspected, some things to consider are:

  • Checking the system for file corruption (e.g. using the rpm-verify.txt file in a supportconfig -v report)
  • Checking the system’s settings that relate to shared libraries, like the /etc/ld.so.conf and /etc/ld.so.conf.d/* configuration files and the LD_LIBRARY_PATH and LD_PRELOAD environment variables.
  • Using the objdump tool to check the binary for a built-in library search path override (RPATH).

Common cause: hardware or hardware configuration issueWhen segfaults are occurring frequently, or with different processes or without a clear pattern to them, this can indicate that a system’s hardware (memory subsystem) is problematic, or that low-level system configuration settings are inappropriate. Please refer to TID 3301593 — Linux system hangs or is unstable for more information on how to handle this situation.

+ Upgrading to Open Enterprise Server 2 SP1 Linux

+ Open Enterprise Server 2 SP1 Migration Strategies

Examples

Segmentation fault on an EMV keypad

Writing to read-only memory

Writing to read-only memory raises a segmentation fault. At the level of code errors, this occurs when the program writes to part of its own code segment or the read-only portion of the data segment, as these are loaded by the OS into read-only memory.

Here is an example of ANSI C code that will generally cause a segmentation fault on platforms with memory protection. It attempts to modify a string literal, which is undefined behavior according to the ANSI C standard. Most compilers will not catch this at compile time, and instead compile this to executable code that will crash:

int main(void)
{
    char *s = "hello world";
    *s = 'H';
}

When the program containing this code is compiled, the string «hello world» is placed in the rodata section of the program executable file: the read-only section of the data segment. When loaded, the operating system places it with other strings and constant data in a read-only segment of memory. When executed, a variable, s, is set to point to the string’s location, and an attempt is made to write an H character through the variable into the memory, causing a segmentation fault. Compiling such a program with a compiler that does not check for the assignment of read-only locations at compile time, and running it on a Unix-like operating system produces the following runtime error:

$ gcc segfault.c -g -o segfault
$ ./segfault
Segmentation fault

Backtrace of the core file from GDB:

Program received signal SIGSEGV, Segmentation fault.
0x1c0005c2 in main () at segfault.c6
6               *s = 'H';

This code can be corrected by using an array instead of a character pointer, as this allocates memory on stack and initializes it to the value of the string literal:

char s[] = "hello world";
s = 'H';  // equivalently, *s = 'H';

Even though string literals should not be modified (this has undefined behavior in the C standard), in C they are of type, so there is no implicit conversion in the original code (which points a at that array), while in C++ they are of type, and thus there is an implicit conversion, so compilers will generally catch this particular error.

Null pointer dereference

In C and C-like languages, null pointers are used to mean «pointer to no object» and as an error indicator, and dereferencing a null pointer (a read or write through a null pointer) is a very common program error. The C standard does not say that the null pointer is the same as the pointer to memory address 0, though that may be the case in practice. Most operating systems map the null pointer’s address such that accessing it causes a segmentation fault. This behavior is not guaranteed by the C standard. Dereferencing a null pointer is undefined behavior in C, and a conforming implementation is allowed to assume that any pointer that is dereferenced is not null.

int *ptr = NULL;
printf("%d", *ptr);

This sample code creates a null pointer, and then tries to access its value (read the value). Doing so causes a segmentation fault at runtime on many operating systems.

Dereferencing a null pointer and then assigning to it (writing a value to a non-existent target) also usually causes a segmentation fault:

int *ptr = NULL;
*ptr = 1;

The following code includes a null pointer dereference, but when compiled will often not result in a segmentation fault, as the value is unused and thus the dereference will often be optimized away by dead code elimination:

int *ptr = NULL;
*ptr;

Stack overflow

Another example is recursion without a base case:

int main(void)
{
    main();
    return ;
}

which causes the stack to overflow which results in a segmentation fault. Infinite recursion may not necessarily result in a stack overflow depending on the language, optimizations performed by the compiler and the exact structure of a code. In this case, the behavior of unreachable code (the return statement) is undefined, so the compiler can eliminate it and use a tail call optimization that might result in no stack usage. Other optimizations could include translating the recursion into iteration, which given the structure of the example function would result in the program running forever, while probably not overflowing its stack.

View previous topic :: View next topic  
Author Message
Laitr Keiows
Bodhisattva
Bodhisattva

Joined: 04 Jul 2005
Posts: 891
Location: Kobe, Japan

PostPosted: Thu Oct 26, 2006 5:18 am    Post subject: [SOLVED] Firefox: Ошибка сегментировани Reply with quote

Падает огнелис с пустым профилем:

Code:
user@localhost ~ $ firefox

No running windows found

/usr/libexec/mozilla-launcher: line 117:  8452 Ошибка сегментирования

«$mozbin» «$@»

firefox-bin exited with non-zero status (139)

От чего бы это могло быть?

Делал revdep-rebuild. Пересобирал его самого. Как бы отследить от чего он падает?

Last edited by Laitr Keiows on Fri Oct 27, 2006 6:50 pm; edited 1 time in total

Back to top

View user's profile Send private message

046
Apprentice
Apprentice

Joined: 21 Jul 2004
Posts: 231
Location: Yaroslavl, Russia

PostPosted: Thu Oct 26, 2006 5:59 am    Post subject: Re: Firefox: Ошибка сегментирования Reply with quote

Laitr Keiows wrote:
Как бы отследить от чего он падает?



Из-за плагина запросто :)

strace помогает найти проблему.

В особо тяжёлых случаях помогает сборка с отладочной информацией, и запуск в отладчике :)

Back to top

View user's profile Send private message

Laitr Keiows
Bodhisattva
Bodhisattva

Joined: 04 Jul 2005
Posts: 891
Location: Kobe, Japan

PostPosted: Thu Oct 26, 2006 6:04 am    Post subject: Re: Firefox: Ошибка сегментирования Reply with quote

046 wrote:
Laitr Keiows wrote:
Как бы отследить от чего он падает?



Из-за плагина запросто :)



Плагинов никаких нет, т.к. пустой профиль.

Спасибо за совет, попробую вечером со strace.

Back to top

View user's profile Send private message

SergDL
n00b
n00b

Joined: 04 Apr 2005
Posts: 12

PostPosted: Thu Oct 26, 2006 7:13 am    Post subject: Reply with quote

У меня такая проблема решилась пересборкой zlib с безопасными флагами в /etc/make.conf
Back to top

View user's profile Send private message

Laitr Keiows
Bodhisattva
Bodhisattva

Joined: 04 Jul 2005
Posts: 891
Location: Kobe, Japan

PostPosted: Fri Oct 27, 2006 5:16 am    Post subject: Reply with quote

SergDL wrote:
У меня такая проблема решилась пересборкой zlib с безопасными флагами в /etc/make.conf



У меня -O2 -march=… -pipe -fomit-frame-pointer с первой установки. Так что пересборка не помогла :(

Back to top

View user's profile Send private message

SergDL
n00b
n00b

Joined: 04 Apr 2005
Posts: 12

PostPosted: Fri Oct 27, 2006 6:58 am    Post subject: Reply with quote

Ну тогда firefox -g, потом run и что gdb покажет…
Back to top

View user's profile Send private message

dmiceman
Tux’s lil’ helper
Tux's lil' helper

Joined: 06 Jun 2005
Posts: 115

PostPosted: Fri Oct 27, 2006 7:49 am    Post subject: Reply with quote

strace наше все! только пускать его с ключиком -f -o log.txt и изучать результаты очень внимательно. у меня он падал на libfam.so что уж там ему не нравилось — не знаю, но пересборка fam-а помогла.
Back to top

View user's profile Send private message

Laitr Keiows
Bodhisattva
Bodhisattva

Joined: 04 Jul 2005
Posts: 891
Location: Kobe, Japan

PostPosted: Fri Oct 27, 2006 11:19 am    Post subject: Reply with quote

Code:
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,

0) = 0xb7cc3000

open(«/usr/share/locale/ru_RU.UTF-8@iso/LC_MESSAGES/libc.mo», O_RDONLY)

= -1 ENOENT (No such file or directory)

……..

open(«/usr/share/locale/ru/LC_MESSAGES/libc.mo», O_RDONLY) = 3

fstat64(3, {st_mode=S_IFREG|0644, st_size=107445, …}) = 0

mmap2(NULL, 107445, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7ca8000

close(3)                                = 0

open(«/usr/lib/gconv/KOI8-R.so», O_RDONLY) = 3

read(3, «177ELF1113312404″…,

512) = 512

fstat64(3, {st_mode=S_IFREG|0755, st_size=9588, …}) = 0

mmap2(NULL, 12316, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0)

= 0xb7ca4000

mmap2(0xb7ca6000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|

MAP_DENYWRITE, 3, 0x1) = 0xb7ca6000

close(3)                                = 0

write(2, «/usr/libexec/mozilla-launcher: l»…,

124/usr/libexec/mozilla-launcher: line 117: 25552 Ошибка сегментирования

«$mozbin» «$@»

) = 124

Похоже падает на кривой локали… 8O

Попробуем поправить.

Back to top

View user's profile Send private message

dmiceman
Tux’s lil’ helper
Tux's lil' helper

Joined: 06 Jun 2005
Posts: 115

PostPosted: Fri Oct 27, 2006 11:39 am    Post subject: Reply with quote

Laitr Keiows wrote:
Похоже падает на кривой локали… 8O

Попробуем поправить.

неа. вернее — необязательно. скорее всего это он ищет строчку «Ошибка сегментирования». смотри выше.

Back to top

View user's profile Send private message

fank
l33t
l33t

Joined: 16 Oct 2004
Posts: 794
Location: Minsk, Belarus

PostPosted: Fri Oct 27, 2006 3:11 pm    Post subject: Reply with quote

Quote:
неа. вернее — необязательно. скорее всего это он ищет строчку «Ошибка сегментирования». смотри выше.



:D

нет, скорее всего это он сообщает, что в строке 117 враппера mozilla-launcher был вызван процесс с pid=25552 , который и вызвал сегфолт

и это mozbin судя по всему

надо просто посмотреть, что там вызывается в этой строке

а лучше вызвать strace -ff -o logfile.log

и потом в файлике 25552_logfile.log будет то, что надо

а если неохота раскиданные по разным файлам логи, то просто strace -f -o logfile.log

f — follow forks, то бишь отслеживать все дочерние и родительские вызовы

Back to top

View user's profile Send private message

dmiceman
Tux’s lil’ helper
Tux's lil' helper

Joined: 06 Jun 2005
Posts: 115

PostPosted: Fri Oct 27, 2006 3:34 pm    Post subject: Reply with quote

fank wrote:
Quote:
неа. вернее — необязательно. скорее всего это он ищет строчку «Ошибка сегментирования». смотри выше.



:D

нет, скорее всего это он сообщает, что в строке 117 враппера mozilla-launcher был вызван процесс с pid=25552 , который и вызвал сегфолт

и это mozbin судя по всему

надо просто посмотреть, что там вызывается в этой строке

firefox-bin :-)

fank wrote:

а лучше вызвать strace -ff -o logfile.log

и потом в файлике 25552_logfile.log будет то, что надо

а если неохота раскиданные по разным файлам логи, то просто strace -f -o logfile.log

f — follow forks, то бишь отслеживать все дочерние и родительские вызовы

:-) (см. выше)

Back to top

View user's profile Send private message

Laitr Keiows
Bodhisattva
Bodhisattva

Joined: 04 Jul 2005
Posts: 891
Location: Kobe, Japan

PostPosted: Fri Oct 27, 2006 6:50 pm    Post subject: Reply with quote

fank wrote:
а лучше вызвать strace -ff -o logfile.log

и потом в файлике 25552_logfile.log будет то, что надо

а если неохота раскиданные по разным файлам логи, то просто strace -f -o logfile.log

f — follow forks, то бишь отслеживать все дочерние и родительские вызовы



Друзья, большое спасибо за советы.

Сегодня на день оставлял пересобираться world, к приходу собралось что-то около половины… И огнелис больше не падает! :D

Back to top

View user's profile Send private message

Display posts from previous:   

You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls 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:Ruby193binruby.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.

Понравилась статья? Поделить с друзьями:
  • Firefox ошибка xcom
  • Firefox ошибка couldn t load xpcom
  • Firefox ошибка 403
  • Firefox отключить консоль ошибок
  • Firefox лог ошибок