Запуск приложения заканчивается «Ошибка сегментации»

40

У меня есть приложение командной строки, которое при запуске не делает то, что должно, и в определенный момент оставляет сообщение:

Segmentation fault

Что это значит? Что мне делать?

лютик золотистый
источник
связанные: stackoverflow.com/questions/2876357/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

63

Ошибка сегментации является результатом нарушения доступа к памяти. Программа сослалась на адрес памяти вне того, что было ему выделено, и ядро ​​ОС отвечает, убивая программу с помощью 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может работать, или страница справки может указать, как это получить),

Кто-то, надеюсь, вернется к вам в ближайшее время. Регистрация ошибок обычно ценится.

лютик золотистый
источник
1
Ошибка сегментации может возникать и в языках интерпретаторов (в основном из-за ошибок в самом интерпретаторе),
Брайам
Это супер полезно! Есть ли возможность зайти внутрь? ставить отметку стоп и пытаться узнать больше?
Злой Смиртний
1
@ZloySmiertniy много чего gdbделает . Вы хотите перейти к разделу 5.1
Златовласка
11

Это означает, что в приложении есть ошибка.

  • Если вы являетесь конечным пользователем, вам следует обратиться к поставщику приложения.

    • Если он поставляется с дистрибутивом Linux, вы должны создать отчет об ошибке для этого дистрибутива.
    • Для сторонних некоммерческих приложений вы должны сообщить об ошибке автору или данному трекеру ошибок приложения. Обычно вы можете найти место, просматривая сайт приложения или скачав бинарный / исходный пакет.
    • Для коммерческих приложений вы должны связаться со службой поддержки.
  • Если это ваше собственное приложение, вы можете:

    1. включить основные файлы: $ ulimit -c unlimited
    2. воспроизвести аварию: $ ./yourapp
    3. Отладочный сбой с GDB: $ gdb ./yourapp core

Основные файлы также будут очень полезны для разработчиков, кроме вас самих - они содержат полное состояние программы в момент сбоя; если вы собираетесь подать отчет об ошибке, прикрепите их, а в некоторых случаях и двоичный файл вашего приложения. Имейте в виду, что существует небольшая вероятность того, что ваши личные данные, такие как номера счетов, пароли и тому подобное, могут остаться в памяти программы в момент сбоя. Во многих случаях сообщение о возврате всего сбойного потока помогает разработчикам найти проблему. Чтобы получить обратную трассировку, вы можете загрузить основной файл с помощью отладчика (например gdb executable corefile).

gena2x
источник
Согласно диалоговому окну Microsoft, вам следует обращаться к поставщику только в том случае, если проблема не устраняется, в противном случае не беспокойтесь. Редкие сбои - это не настоящие ошибки, а только воспроизводимые.
Каз
4
По моим наблюдениям, качество программного обеспечения Microsoft во многих случаях низкое по сравнению с программным обеспечением UNIX, и приятно, что в мире UNIX люди обычно не обращаются к своим рекомендациям.
gena2x