Что это значит?
Видеть AU: Что такое ошибка сегментации? сообщение, а также этот пост, в котором есть несколько примеров того, как его воспроизвести, ИТАК: что такое ошибка сегментации?.
Самое простое описание, которое я могу предложить (может быть, не идеальное):
Программа попыталась получить доступ к области памяти за пределами своего собственного раздела. Операционная система блокирует его.
Некоторые случаи: Считывание значения с неинициализированным указателем, Выход за пределы диапазона в массиве, вызов функции (когда обратная совместимость не поддерживается), ...
Однако не всегда легко найти причину с большими программами или теми, которые ретранслируются в других библиотеках проекта. И большинство случаев заканчиваются тем, что сообщение об ошибке, либо для целевой программы, либо для одной из ее зависимостей (либо восходящий проект, либо нисходящий дистрибутивный пакет).
Как я могу решить эту проблему?
Отправить сообщение об ошибке
Если вы не производили никакой пользовательской настройки / настройки и у вас установлены все обновления. отправить сообщение об ошибке, видишь Как мне сообщить об ошибке?
Если Ubuntu поддерживает открытый исходный код, используйте
ubuntu-bug
(apport-bug
). Для сторонних разработчиков с закрытым исходным кодом проверьте их страницы справки о том, как сообщать об ошибках и собирать соответствующие данные.Проявите инициативу для отладки
Если у вас есть хотя бы небольшой опыт программирования, рекомендуется сделать все возможное, чтобы решить эту проблему самостоятельно. Существует множество сообщений об ошибках, которые неактивны в течение многих лет. По крайней мере, вы можете собрать достаточно отладочных данных, которые помогут устранить проблему при сообщении о ней.
Это означает, что вы нарушаете уровень абстракции пользователя и открываете черный ящик! (ЗУБНАЯ НИТЬ на самом деле имеет прозрачную коробку).
Некоторые полезные инструменты для отладки
Некоторые... Я имею в виду, что есть много других полезных инструментов, которые вы найдете, когда будете копать глубже.
apport-bug
журналы / дамп ядра / обратная трассировкаЕсли у вас нет сообщения об ошибке перед ошибкой сегментации. Запустите его с помощью
--save
выберите опцию и найдите журнал обратной трассировки:apport-bug program-cmd --save bug-report_output.txt
gdb
обратная трассировка / отладка исходного кодаЕсли это не сработало, используйте
gdb
:$ gdb program-cmd(gdb) run(gdb) backtrace
Если вы получите какое-либо сообщение об ошибке, проверьте веб, панель запуска и в upstream project bug tracker, нет ли подобных случаев.
Для некоторых продвинутых пользователей или тех, кто следует по пути изучения c / c++, они могут загрузить соответствующий
-dbg
пакеты символов. Затем вы можете использоватьgdb
чтобы проследить поток программы через исходный код и получить точную функцию / инструкцию, которые вызывают ошибку во время выполнения.Для дистрибутивов на базе Ubuntu (Debian) исходный код пакета можно загрузить с помощью:
apt-get source <package-name>
strace
отслеживание системных вызововДругим инструментом, который может помочь, является
strace
- Мне это нравится. Это действительно мощный инструмент.Он представляет себя:
В простейшем случае
strace
выполняет указанную команду до тех пор, пока она не завершится. Он перехватывает и записывает системные вызовы, которые вызываются процессом, и сигналы, которые принимаются процессом. Имя каждого системного вызова, его аргументы и возвращаемое значение выводятся при стандартной ошибке или в файл, указанный с параметром -o.strace
это полезный инструмент диагностики, обучения и отладки. Системные администраторы, диагносты и специалисты по устранению неполадок найдут его бесценным для решения проблем с программами, для которых исходный код недоступен, поскольку их не нужно перекомпилировать, чтобы отследить их. Студенты, хакеры и чрезмерно любопытные обнаружат, что многое можно узнать о системе и ее системных вызовах, отслеживая даже обычные программы. И программисты обнаружат, что, поскольку системные вызовы и сигналы - это события, происходящие на интерфейсе пользователя / ядра, тщательное изучение этой границы очень полезно для изоляции ошибок, проверки работоспособности и попыток зафиксировать условия гонки.Источник:
man strace
ltrace
динамическая трассировка вызовов библиотекиltrace
это программа, которая просто выполняет указанную команду до тех пор, пока она не завершится. Он перехватывает и записывает вызовы динамической библиотеки, которые вызываются выполняемым процессом, и сигналы, которые принимаются этим процессом. Он также может перехватывать и печатать системные вызовы, выполняемые программой.Его использование очень похоже на
strace
(1).Источник:
man ltrace