[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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose