Как устранить "Ошибку сегментации (сброс ядра)"

Что это значит?

Видеть AU: Что такое ошибка сегментации? сообщение, а также этот пост, в котором есть несколько примеров того, как его воспроизвести, ИТАК: что такое ошибка сегментации?.

Самое простое описание, которое я могу предложить (может быть, не идеальное):

Программа попыталась получить доступ к области памяти за пределами своего собственного раздела. Операционная система блокирует его.

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

Однако не всегда легко найти причину с большими программами или теми, которые ретранслируются в других библиотеках проекта. И большинство случаев заканчиваются тем, что сообщение об ошибке, либо для целевой программы, либо для одной из ее зависимостей (либо восходящий проект, либо нисходящий дистрибутивный пакет).

Как я могу решить эту проблему?

  • Отправить сообщение об ошибке

    Если вы не производили никакой пользовательской настройки / настройки и у вас установлены все обновления. отправить сообщение об ошибке, видишь Как мне сообщить об ошибке?

    Если Ubuntu поддерживает открытый исходный код, используйте ubuntu-bug (apport-bug). Для сторонних разработчиков с закрытым исходным кодом проверьте их страницы справки о том, как сообщать об ошибках и собирать соответствующие данные.

  • Проявите инициативу для отладки

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

    Это означает, что вы нарушаете уровень абстракции пользователя и открываете черный ящик! (ЗУБНАЯ НИТЬ на самом деле имеет прозрачную коробку).

Некоторые полезные инструменты для отладки

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

  1. apport-bug журналы / дамп ядра / обратная трассировка

    Если у вас нет сообщения об ошибке перед ошибкой сегментации. Запустите его с помощью --save выберите опцию и найдите журнал обратной трассировки:

    apport-bug program-cmd --save bug-report_output.txt
  2. gdb обратная трассировка / отладка исходного кода

    Если это не сработало, используйте gdb:

    $ gdb program-cmd(gdb) run(gdb) backtrace

    Если вы получите какое-либо сообщение об ошибке, проверьте веб, панель запуска и в upstream project bug tracker, нет ли подобных случаев.

    Для некоторых продвинутых пользователей или тех, кто следует по пути изучения c / c++, они могут загрузить соответствующий -dbg пакеты символов. Затем вы можете использовать gdb чтобы проследить поток программы через исходный код и получить точную функцию / инструкцию, которые вызывают ошибку во время выполнения.

    Для дистрибутивов на базе Ubuntu (Debian) исходный код пакета можно загрузить с помощью:

    apt-get source <package-name>
  3. strace отслеживание системных вызовов

    Другим инструментом, который может помочь, является strace- Мне это нравится. Это действительно мощный инструмент.

    Он представляет себя:

    В простейшем случае strace выполняет указанную команду до тех пор, пока она не завершится. Он перехватывает и записывает системные вызовы, которые вызываются процессом, и сигналы, которые принимаются процессом. Имя каждого системного вызова, его аргументы и возвращаемое значение выводятся при стандартной ошибке или в файл, указанный с параметром -o.

    strace это полезный инструмент диагностики, обучения и отладки. Системные администраторы, диагносты и специалисты по устранению неполадок найдут его бесценным для решения проблем с программами, для которых исходный код недоступен, поскольку их не нужно перекомпилировать, чтобы отследить их. Студенты, хакеры и чрезмерно любопытные обнаружат, что многое можно узнать о системе и ее системных вызовах, отслеживая даже обычные программы. И программисты обнаружат, что, поскольку системные вызовы и сигналы - это события, происходящие на интерфейсе пользователя / ядра, тщательное изучение этой границы очень полезно для изоляции ошибок, проверки работоспособности и попыток зафиксировать условия гонки.

    Источник: man strace

  4. ltrace динамическая трассировка вызовов библиотеки

    ltrace это программа, которая просто выполняет указанную команду до тех пор, пока она не завершится. Он перехватывает и записывает вызовы динамической библиотеки, которые вызываются выполняемым процессом, и сигналы, которые принимаются этим процессом. Он также может перехватывать и печатать системные вызовы, выполняемые программой.

    Его использование очень похоже на strace(1).

    Источник: man ltrace