У меня есть приложение командной строки, которое при запуске не делает то, что должно, и в определенный момент оставляет сообщение:
Segmentation fault
Что это значит? Что мне делать?
У меня есть приложение командной строки, которое при запуске не делает то, что должно, и в определенный момент оставляет сообщение:
Segmentation fault
Что это значит? Что мне делать?
Ответы:
Ошибка сегментации является результатом нарушения доступа к памяти. Программа сослалась на адрес памяти вне того, что было ему выделено, и ядро ОС отвечает, убивая программу с помощью SIGSEGV.
Это ошибка, поскольку нет смысла пытаться получить доступ к недоступной памяти (это невозможно сделать). Однако ошибки такого рода легко сделать, особенно в таких языках, как C и C ++ (на которые приходится много распространенных приложений). Это указывает на ошибку либо в самой программе, либо в библиотеке, на которую она ссылается. Если вы хотите сообщить об ошибке (сделайте - это помогает), будет хорошей идеей включить обратную трассировку событий, которые привели к ошибке сегмента.
Для этого вы можете запустить программу внутри gdb
(отладчик GNU), которая должна быть доступна из любого дистрибутива linux, если она еще не установлена (пакет будет называться просто «gdb»). Если сломанное приложение называется «сломанное приложение»:
gdb brokenapp
Появится параграф об авторском праве и лицензировании, а в конце появится подсказка с курсором:
(gdb) _
Введите run
и нажмите ввод. Если вам нужно предоставить аргументы (например -x --foo=bar whatever
), добавьте те ( run -x --foo=bar whatever
). Программа будет делать то, что она делает, вы увидите выходные данные, и если вам нужно взаимодействовать, вы можете (обратите внимание, что вы можете запустить любую программу, в том числе с графическим интерфейсом, внутри GDB). В том месте, где обычно происходит ошибка, вы увидите:
Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _
Вторая строка вывода здесь только пример. Теперь наберите bt
(для «backtrace») и нажмите ввод. Вы увидите что-то вроде этого, хотя это может быть намного дольше:
(gdb) bt
#0 0x00000000006031c9 in ?? ()
#1 0x000000000040157f in mishap::what() const ()
#2 0x0000000000401377 in main ()
Если это дольше, вы получите только скрининг за раз, и будет --More--
сообщение. Продолжайте нажимать ввод, пока не сделаете. Теперь вы можете quit
, вывод останется в вашем терминале. Скопируйте все и Program received signal SIGSEGV
далее в текстовый файл и отправьте отчет об ошибке с помощью трекера ошибок приложения; Вы можете найти их в Интернете, выполнив поиск, например, «отчет об ошибках сломанного приложения» - вам, вероятно, придется зарегистрироваться, чтобы получить ответ по электронной почте. Включите описание проблемы, любые аргументы, которые вы указали run
, и т. Д., А также копию обратной трассировки (если она очень длинная, может быть способ прикрепить текстовый файл в интерфейсе средства отслеживания ошибок). Также включите версию, если вы знаете, что это такое ( brokenapp --version
может работать, или страница справки может указать, как это получить),
Кто-то, надеюсь, вернется к вам в ближайшее время. Регистрация ошибок обычно ценится.
Это означает, что в приложении есть ошибка.
Если вы являетесь конечным пользователем, вам следует обратиться к поставщику приложения.
Если это ваше собственное приложение, вы можете:
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
Основные файлы также будут очень полезны для разработчиков, кроме вас самих - они содержат полное состояние программы в момент сбоя; если вы собираетесь подать отчет об ошибке, прикрепите их, а в некоторых случаях и двоичный файл вашего приложения. Имейте в виду, что существует небольшая вероятность того, что ваши личные данные, такие как номера счетов, пароли и тому подобное, могут остаться в памяти программы в момент сбоя. Во многих случаях сообщение о возврате всего сбойного потока помогает разработчикам найти проблему. Чтобы получить обратную трассировку, вы можете загрузить основной файл с помощью отладчика (например gdb executable corefile
).