[Linux] Метод анализа проблемы с ошибкой сегментации (сброс ядра)
[Linux] Метод анализа проблемы с ошибкой сегментации (сброс ядра)

😎 Введение автора: Я программист Чжоучжоу, неизвестный программист, который любит писать. Создатель полнофункционального высококачественного поля CSDN, эксперт сообщества блогов Huawei Cloud по обмену облаками, блоггер-эксперт сообщества блогов Alibaba Cloud.

Предисловие

В системах Linux программа может столкнуться с ошибкой сегментации (Segmentation Fault) во время ее работы. Это распространенная ошибка времени выполнения, которая обычно возникает, когда программа пытается получить доступ к нераспределенной (или запрещенной) части своего пространства памяти.

При возникновении ошибки сегментации система может создать дамп ядра, который представляет собой файл, содержащий образ памяти после завершения работы программы, который можно использовать для последующей отладки и анализа проблем. В этой статье мы рассмотрим, как анализировать сбои сегментов и использовать файлы дампа ядра для обнаружения проблемы.

1. Обзор сегмента Fault

Причины сбоя могут включать, помимо прочего:

  • Доступ к указателю на неверный адрес Память.
  • Переполнение стека, например слишком глубокий рекурсивный вызов.
  • Нарушение правил защиты Память.
  • Память за пределами (массив выходит за пределы, несовместимый тип переменной и т. д.) Получил доступ к области Память, которая вам не принадлежит.
  • Доступ к области данных системы,Особенно запись данных на защищенный системой адрес Память.,Наиболее распространенным является присвоение адреса указателя 0.
  • Многопоточная программа использует потокобезопасные функции.
  • Данные, читаемые и записываемые несколькими потоками, не защищены блокировками. Для глобальных данных, к которым одновременно будут обращаться несколько потоков, следует обратить внимание на защиту блокировок, иначе это легко приведет к дампу ядра.
  • Не стесняйтесь использовать преобразования указателей. указатель на сегмент Память,Если только не будет уверенности, что этот Память изначально был отнесен к определенной структуре или типу.,или массив этой структуры или типа,В противном случае не преобразуйте его в указатель этой структуры или типа.,Вместо этого это Память следует скопировать в структуру или тип такого типа.,Откройте эту структуру или введите еще раз. Это связано с тем, что если начальный адрес этого абзаца не выровнен в соответствии с этой структурой или типом,затем при доступе к нему Это легко из-за автобуса ошибка и ядро dump.
  • Переполнение буфера также может вызвать «ошибку сегментации». Пока(1) {do}, эта проблема, скорее всего, возникнет. Чрезмерное использование sprintf или strcat может привести к заполнению определенного баффа и переполнению, поэтому лучше выполнять memset перед каждым использованием, но. Если ошибка сегментации возникает в начале, а не появляется после некоторого времени работы, вероятность переполнения буфера относительно невелика.

Ошибка сегментации означает, что доступная память превышает объем памяти, предоставленный системой программе. Обычно это значение сохраняется в gd tr. Это 48-битный регистр, 32 бита которого сохраняют указанную в нем таблицу gdt. последние 13 бит хранят нижний индекс, соответствующий GDT, а последние 3 бита включают информацию о том, находится ли программа в памяти, и уровень выполнения программы в ЦП, указывая на GDT представляет собой таблицу с 64 битами в качестве единицы измерения. В этой таблице хранятся сегмент кода и сегмент данных программы.

Как только программа получает доступ за пределы границ, ЦП сгенерирует соответствующую защиту, поэтому возникает ошибка сегментации. Согласно приведенному выше объяснению, ошибка сегментации должна заключаться в доступе к недоступной памяти. Эта область памяти либо не существует, либо на нее влияет. Для защиты системы могут отсутствовать или быть повреждены файлы. # 2. Файл дампа ядра

Когда программа завершается из-за ошибки сегмента, если конфигурация системы позволяет создавать дампы ядра, будет создан файл ядра (или аналогичный шаблон именования), содержащий образ памяти программы на момент ее завершения.

Конфигурация дампа ядра

Фактически система запишет всю информацию о ядре в файл в момент сбоя программы (ls этот файл не увидит)

Убедитесь, что конфигурация /proc/sys/kernel/core_pattern позволяет создавать файлы дампа ядра.

Установите ulimit, чтобы разрешить создание основных файлов:

Язык кода:javascript
копировать
Добавьте следующую строку в /etc/profile,Это позволит создать файл дампа памяти.
ulimit-c безлимитный

Обязательно добавьте параметр -g при компиляции, иначе при отображении ошибки в конце будет отображаться только неправильный адрес, а конкретная информация об ошибке отображаться не будет.

/proc/sys/kernel/core_uses_pid может контролировать, добавляется ли pid в качестве расширения к имени файла ядра. Если содержимое файла равно 1, это означает добавление pid в качестве расширения, а сгенерированный формат файла ядра — core.xxxx. Если он равен 0, это означает, что сгенерированный файл ядра также называется core.

Этот файл можно изменить с помощью следующей команды:

Язык кода:javascript
копировать
echo "1" > /proc/sys/kernel/core_uses_pid

Как правило, основной путь и исполняемая программа совпадают.

Кроме того, вы также можете установить шаблон имени файла ядра в /proc/sys/kernel/core-pattern.

Язык кода:javascript
копировать
echo /data/coredump/core.%e.%p> /proc/sys/kernel/core_pattern

3. Шаги по анализу сегфолта

  1. Подтвердите существование файла дампа ядра. При сбое программы проверьте, создается ли файл дампа ядра в текущем каталоге или в местоположении, указанном core_pattern.
  2. Используйте отладчик для анализа дампов ядра Используйте GDB (GNU Отладчик) или другой отладчик загружает файл дампа ядра и соответствующий исполняемый файл программы и анализирует стек вызовов и состояние переменной на момент сбоя.
Язык кода:javascript
копировать
gdb /path/to/program /path/to/coredump
  1. Проверьте стек вызовов В gdb используйте команду backtrace (или сокращенно bt) для просмотра стека вызовов во время сбоя.
  2. Проверьте переменную и статус регистрации Используйте команду print (или сокращенно p), чтобы проверить значение определенной переменной и информационных регистров, чтобы увидеть состояние регистра.
  3. Проверьте исходный код построчно На основе информации о стеке вызовов найдите конкретный номер строки в исходном коде и проверьте соответствующую логику кода.
  4. Рассмотрим шаблон доступа Память Проанализируйте шаблон доступа Память программы и проверьте, нет ли доступа за пределами границ, неправильных операций с указателем и т. д.
  5. Проверка среды выполнения Убедитесь, что конфигурация и среда выполнения программы могут привести к сбою сегмента.
  6. Параметры компилятора и компоновщика Скомпилируйте программу с опцией -g, чтобы обеспечить целостность отладочной информации. Используйте такие инструменты, как valgrind, чтобы проверить наличие ошибок Память.

На что следует обратить внимание

  • Своевременные обновления системы и инструментов: убедитесь, что вы используете последнюю версию системы.、Компиляторы и инструменты отладки.
  • Подробное протоколирование ошибок: регистрируется полная трассировка стека и другая соответствующая информация при возникновении сбоя сегмента.
  • Многоаспектный анализ: анализируйте проблемы с разных точек зрения кода, данных и операционной среды.
boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.