Что это означает?
См. AU: Что такое ошибка сегментации? а также это, которые имеют несколько примеров, как воспроизвести это, SO: Что такое ошибка сегментации? , самое простое описание, которое я могу привести (может быть, не идеальное):
Программа пыталась получить доступ к области памяти вне своего собственного раздела. ОС блокирует это.
В некоторых случаях: чтение значения с инициализированным указателем, выход за пределы диапазона в массиве, вызов функции (если обратная совместимость не поддерживается), ...
Однако не всегда легко найти причину с помощью больших программ или программ, которые работают с другими библиотеками проекта. И в большинстве случаев выдается отчет об ошибке либо для целевой программы, либо в случае ее зависимостей (либо в исходном проекте, либо в последующем дистрибутивном пакете).
Как я могу решить эту проблему?
Если вы не сделали никакой пользовательской конфигурации / настройки и все обновления установлены. Запустить отчет об ошибке , см. Как мне сообщить об ошибке?
Если открытый исходный код поддерживается Ubuntu, используйте ubuntu-bug( apport-bug). Для сторонних закрытых источников, проверьте их справочные страницы, как сообщать об ошибках и собирать связанные данные.
Примечание. Если у вас есть небольшой опыт программирования, рекомендуется постараться решить его самостоятельно. Там много сообщений об ошибках там неактивных в течение многих лет. Или, по крайней мере, соберите достаточно отладочных данных, чтобы решить проблему, прежде чем сообщать об этом.
Некоторые полезные инструменты для отладки
apport-bug logs / core dump / backtrace
Если у вас нет сообщения об ошибке до ошибки сегментации. Запустите его с --saveопцией и найдите журнал обратной трассировки:
apport-bug program-cmd --save bug-report_output.txt
gdb возврат / отладка исходного кода
Если это не сработало, используйте gdb:
$ gdb program-cmd
(gdb) run
(gdb) backtrace
Если вы получили какое-либо сообщение об ошибке, проверьте веб-страницу, панель запуска и трекер ошибок в исходном проекте, если есть подобные случаи.
Для некоторых опытных пользователей или тех, кто идет по пути обучения ac / c ++, они могут загрузить соответствующие -dbgпакеты символов. Затем вы можете использовать gdbдля отслеживания потока программы через источник и получить точную функцию / инструкцию, которая вызывает ошибку во время выполнения.
strace отслеживание системных вызовов
Еще один инструмент, который может помочь strace, мне это нравится. Это действительно мощный инструмент.
Он представляет себя:
В простейшем случае straceзапускает указанную команду до ее выхода. Он перехватывает и записывает системные вызовы, вызываемые процессом, и сигналы, принимаемые процессом. Имя каждого системного вызова, его аргументы и возвращаемое значение выводятся при стандартной ошибке или в файл, указанный с помощью опции -o.
straceявляется полезным диагностическим, учебным и отладочным инструментом. Системные администраторы, диагносты и специалисты по устранению неисправностей найдут его незаменимым для решения проблем с программами, для которых источник недоступен, поскольку их не нужно перекомпилировать для отслеживания. Студенты, хакеры и чрезмерно любопытные обнаружат, что многое можно узнать о системе и ее системных вызовах, отслеживая даже обычные программы. И программисты обнаружат, что, поскольку системные вызовы и сигналы являются событиями, которые происходят в интерфейсе пользователя / ядра, тщательное изучение этой границы очень полезно для изоляции ошибок, проверки работоспособности и попыток захвата условий гонки.
Источник: man strace
ltrace динамическое отслеживание вызовов библиотеки
ltraceэто программа, которая просто запускает указанную команду до ее выхода. Он перехватывает и записывает динамические библиотечные вызовы, которые вызываются исполняемым процессом, и сигналы, полученные этим процессом. Он также может перехватывать и распечатывать системные вызовы, выполняемые программой.
Его использование очень похоже на strace(1).
Источник: man ltrace