Coredump на флешке что это такое

Обновлено: 21.11.2024

ESP-IDF поддерживает создание дампов памяти при неисправимых ошибках программного обеспечения. Этот полезный метод позволяет проанализировать состояние программного обеспечения в момент сбоя. После сбоя система переходит в состояние паники, печатает некоторую информацию и останавливается или перезагружается в зависимости от конфигурации. Пользователь может выбрать создание дампа ядра, чтобы позже проанализировать причину сбоя на ПК. Дамп ядра содержит снимки всех задач в системе на момент сбоя. Снимки включают в себя блоки управления задачами (TCB) и стеки. Таким образом, можно узнать, какая задача, на какой инструкции (строке кода) и какой стек вызовов этой задачи приводит к сбою. Также возможен сброс содержимого переменных по запросу, если ранее они были соответствующим образом атрибутированы. ESP-IDF предоставляет специальный скрипт espcoredump.py, который помогает пользователям извлекать и анализировать дампы ядра. Этот инструмент предоставляет две команды для анализа дампов ядра:

info_corefile - выводит регистры сбойной задачи, стек вызовов, список доступных задач в системе, области памяти и содержимое памяти, сохраненное в дампе ядра (TCB и стеки)

dbg_corefile - создает ELF-файл дампа ядра и запускает сеанс отладки GDB с этим файлом. Пользователь может проверять состояние памяти, переменных и задач вручную. Обратите внимание, что, поскольку не вся память сохраняется в дампе памяти, только значения переменных, выделенных в стеке, будут иметь значение

Дополнительную информацию о внутреннем устройстве дампа ядра см. в разделе "Внутреннее устройство дампа ядра"

Конфигурации¶

Существует ряд параметров конфигурации, связанных с дампом ядра, которые пользователь может выбрать в меню конфигурации проекта ( idf.py menuconfig ).

Назначение данных основного дампа (Компоненты -> Основной дамп -> Назначение данных)

  • Сохранить дамп памяти во Flash (Flash)

  • Печать дампа ядра в UART (UART)

  • Отключить создание дампа памяти (нет)

Формат данных основного дампа (Компоненты -> Основной дамп -> Формат данных основного дампа)

  • Формат ELF (исполняемый и связываемый файл формата для дампа ядра)

  • Двоичный формат (базовый двоичный формат для дампа ядра)

Проверка целостности данных основного дампа (Компоненты -> Основной дамп -> Проверка целостности данных основного дампа)

  • Использовать CRC32 для проверки целостности дампа ядра

  • Использовать SHA256 для проверки целостности дампа ядра (работает только в формате ELF)

Максимальное количество снимков задач в дампе ядра (Компоненты -> Дамп ядра -> Максимальное количество задач)

Задержка перед печатью дампа ядра в UART (Компоненты -> Дамп ядра -> Задержка перед печатью в UART)

Значение в мс.

Обработка дампов ядра UART в мониторе IDF (Компоненты -> Дамп ядра -> Задержка перед печатью в UART)

  • Расшифровать и показать сводку (info_corefile)

  • Не декодировать

Сохранить дамп памяти во flash¶

Если выбран этот параметр, дампы ядра сохраняются в специальный раздел на флэш-памяти. При использовании файлов таблицы разделов по умолчанию, которые предоставляются с ESP-IDF, он автоматически выделяет необходимое пространство на флэш-памяти. Но если пользователь хочет использовать свой собственный файл макета вместе с функцией дампа ядра, он должен определить отдельный раздел для дампа ядра, как показано ниже:

Нет особых требований к имени раздела. Его можно выбрать в соответствии с потребностями пользовательского приложения, но тип раздела должен быть «data», а подтип — «coredump». Также при выборе размера раздела обратите внимание на то, что структура данных дампа ядра вводит постоянные служебные данные в размере 20 байт и служебные данные для каждой задачи в размере 12 байтов. Эти накладные расходы не включают размер TCB и стека для каждой задачи. Таким образом, размер раздела должен быть не менее 20 + максимальное число задач x (12 + размер TCB + максимальный размер стека задач) байт.

Пример универсальной команды для анализа дампа ядра из флэш-памяти:

Печать дампа ядра в UART¶

Если выбран этот параметр, дампы ядра в кодировке base64 печатаются на UART при системной панике. В этом случае пользователь должен вручную сохранить текстовое тело дампа ядра в какой-либо файл, а затем выполнить следующую команду:

Тело дампа ядра в кодировке Base64 будет находиться между следующими верхним и нижним колонтитулами:

Строки CORE DUMP START и CORE DUMP END не должны включаться в текстовый файл дампа памяти.

Функции ПЗУ в трассировках¶

Вывод переменных по запросу¶

Иногда вам нужно прочитать последнее значение переменной, чтобы понять основную причину сбоя. Дамп ядра поддерживает извлечение переменных данных через GDB путем присвоения объявленным переменным специальных обозначений.

Поддерживаемые обозначения и области оперативной памяти¶

COREDUMP_DRAM_ATTR помещает переменную в область DRAM, которая будет включена в дамп.

COREDUMP_RTC_ATTR помещает переменную в область RTC, которая будет включена в дамп.

COREDUMP_RTC_FAST_ATTR помещает переменную в область RTC_FAST, которая будет включена в дамп.

Пример¶

В вашем проекте создайте глобальную переменную в области DRAM, например:

В основном приложении установите для переменной любое значение и подтвердите (0), чтобы вызвать сбой.

Соберите, прошейте и запустите приложение на целевом устройстве и дождитесь информации о дампе.

Выполните приведенную ниже команду, чтобы начать создание дампа ядра в GDB, где PORT — это USB-порт устройства:

В оболочке GDB введите p global_var, чтобы получить содержимое переменной:

Запуск escoredump.py ¶

Общий синтаксис команды: espcoredump.py [параметры] команда [аргументы]

Параметры скрипта –chip

Тип целевого чипа. Значение по умолчанию — «авто»

--port ПОРТ , -p ПОРТ

Устройство с последовательным портом. Необходимо указать либо «чип», либо «порт», чтобы определить порт, когда у вас одновременно подключено несколько устройств.

--BAUD BAUD , -b BAUD

Скорость передачи данных последовательного порта, используемая при прошивке/чтении

Перезаписать внутреннюю задержку по умолчанию для ответов gdb

dbg_corefile Запускает сеанс отладки GDB с указанным файлом ядра

info_corefile Распечатать информацию о дампе ядра из файла

Аргументы команды --debug DEBUG , -d DEBUG

--core ОСНОВНОЙ , -c ОСНОВНОЙ

Путь к файлу дампа ядра (если пропущенный дамп ядра будет считан из флэш-памяти)

Файл, указанный с помощью «-c», представляет собой ELF («эльф»), необработанный (raw) или закодированный в base64 (b64) двоичный файл

Смещение раздела coredump во флэш-памяти (чтобы увидеть, введите «idf.py partition-table»).

--save-core SAVE_CORE , -s SAVE_CORE

Сохранить ядро ​​в файл. В противном случае временный основной файл будет удален. Не работает с «-c»

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

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

Содержание

Отключение автоматических дампов ядра

Пользователи могут захотеть отключить автоматическое создание дампа ядра по ряду причин:

  • Производительность: создание дампов ядра для процессов, интенсивно использующих память, может привести к трате системных ресурсов и задержке очистки памяти.
  • Дисковое пространство: дампы ядра процессов, интенсивно использующих память, могут занимать дисковое пространство, равное, если не больше, объему памяти, занимаемому процессом, если он не сжат.
  • Безопасность: дампы ядра, которые обычно доступны для чтения только привилегированным пользователям, могут содержать конфиденциальные данные (например, пароли или криптографические ключи), которые записываются на диск после сбоя.

Использование sysctl

С помощью sysctl можно установить значение null для kernel.core_pattern, чтобы отключить обработку дампа ядра. Создать этот файл

Чтобы немедленно применить настройку, используйте sysctl :

Использование systemd

Поведение systemd по умолчанию определяется в файле /usr/lib/sysctl.d/50-coredump.conf , который устанавливает kernel.core_pattern для вызова systemd-coredump . Он создает дампы ядра для всех процессов в /var/lib/systemd/coredump. Поведение systemd-coredump можно переопределить, создав фрагмент конфигурации в каталоге /etc/systemd/coredump.conf.d/ со следующим содержимым[1][2]:

Примечание. Не забудьте указать имя раздела [Coredump], иначе эта опция будет проигнорирована: systemd-coredump[1728]: [/etc/systemd/coredump.conf.d/custom.conf:1] вне раздела. Игнорирование.

Затем перезагрузите конфигурацию systemd.

Одного этого метода обычно достаточно, чтобы отключить создание дампа ядра в пользовательском пространстве, если никакие другие программы не включают автоматическое создание дампа ядра в системе, но дамп памяти все еще создается в памяти и выполняется systemd-coredump.

Использование лимитов PAM

Максимальный размер дампа памяти для пользователей, выполнивших вход через PAM, устанавливается в файле limit.conf. Установка нуля полностью отключает дампы ядра. [3]

Использование ulimit

Оболочки командной строки, такие как bash или zsh, предоставляют встроенную команду ulimit, которую можно использовать для сообщения или установки ограничений ресурсов shell и процессы, запускаемые оболочкой. Подробнее см. bash(1) § ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ или zshbuiltins(1).

Чтобы отключить дампы ядра в текущей оболочке:

Создание дампа ядра

Чтобы создать дамп ядра произвольного процесса, сначала установите пакет gdb.Затем найдите PID запущенного процесса, например, с помощью pgrep:

Прикрепить к процессу:

Затем в командной строке (gdb):

Теперь у вас есть файл дампа ядра с именем core.2071 .

Куда они идут?

Системный sysctl kernel.core_pattern определяет, куда следует направлять автоматические дампы ядра. По умолчанию дампы ядра отправляются в systemd-coredump, который можно настроить в /etc/systemd/coredump.conf. По умолчанию все дампы ядра хранятся в /var/lib/systemd/coredump (из-за Storage=external) и сжимаются с помощью zstd (из-за Compress=yes). Кроме того, можно настроить различные ограничения размера хранилища.

Примечание. Значение по умолчанию для kernel.core_pattern установлено в /usr/lib/sysctl.d/50-coredump.conf . Этот файл может быть замаскирован или переопределен для использования другого параметра в соответствии с обычными правилами sysctl.d(5).

Чтобы получить дамп ядра из журнала, см. coredumpctl(1) .

Изучение дампа ядра

Используйте coredumpctl, чтобы найти соответствующий дамп:

Необходимо однозначно идентифицировать соответствующий дамп. Это возможно, указав PID, имя исполняемого файла, путь к исполняемому файлу или предикат journalctl (подробности см. в coredumpctl(1) и journalctl(1)). Чтобы просмотреть подробную информацию о дампах ядра:

Обратите внимание на строку "Сигнал", которая помогает определить причину сбоя. Для более глубокого анализа вы можете изучить обратную трассировку с помощью gdb:

При запуске gdb используйте команду bt, чтобы распечатать обратную трассировку:

См. раздел Отладка/получение трассировки, если символы отладки запрошены, но не найдены.

Дамп ядра – это документированный файл памяти компьютера на момент сбоя программы или компьютера. Файл состоит из записанного состояния рабочей памяти в определенное время, обычно близкое к моменту сбоя системы или нетипичному завершению программы.

Помимо всей системной памяти или только части прерванной программы, файл дампа ядра может содержать дополнительную информацию, такую ​​как:

  • Состояние процессора
  • Содержимое регистра процессора
  • Информация об управлении памятью
  • Счетчик программы и указатель стека
  • Информация об операционной системе и процессоре, а также флаги

Дамп памяти также может называться дампом памяти, дампом хранилища или дампом.

Techopedia объясняет основной дамп

Программисты часто используют дамп памяти для изучения проблемы с помощью отладчика. Дамп ядра может включать в себя всю системную память или часть программы, в которой произошел сбой. Существует несколько причин, по которым компьютер или программа могут выйти из строя:

  • Повреждены данные.
  • Серьезная ошибка пользователя
  • Файлы, зараженные вирусом
  • Проблемы с доступом к файлам данных
  • Устаревшая операционная система
  • Ошибка сегментации или ошибка шины.
  • Плохо вентилируемая или пыльная компьютерная башня
  • Системный сбой в программном или аппаратном обеспечении.
  • Перегрев компьютера из-за неисправного радиатора или вентилятора.

Как правило, файл дампа ядра включает в себя содержимое оперативной памяти (ОЗУ) определенного процесса или часть адресного пространства процесса и значения регистров процессора. Файлы дампа ядра можно использовать для анализа причин дампа, просматривать в виде текста или распечатывать.

Поскольку адресное пространство современного процесса ОС может иметь общие разрывы и страницы с другими файлами и процессами, используется более сложный образ. В Unix-подобных системах дампы ядра обычно используют стандартный формат исполняемого образа:

  • Mach-O в Mac OS X
  • a.out в старых версиях Unix
  • Исполняемый и подключаемый формат (ELF) в современных схемах распространения программного обеспечения Linux, Solaris, Unix System V и Berkeley (BSD)

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

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

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

Файл дампа ядра содержит данные, недоступные для просмотра, и его необходимо передать в службу поддержки клиентов ProCurve для анализа, диагностики и устранения неполадок.

Чтобы сохранить загружаемые дампы ядра:

Чтобы включить создание дампа ядра на коммутаторах серии 3500, установите флажок Включить создание дампа ядра.

Чтобы включить создание дампа ядра для главного устройства на коммутаторах серии 5400, установите флажок Включить создание дампа ядра на MM.

На некоторых коммутаторах дамп памяти может быть включен либо только на ведущем, либо на ведущем и ведомом(-ах), где ведущее устройство – это центральная функция обработки, управляющая одним или несколькими ведомыми элементами коммутатора. В коммутаторе шасси ProCurve (например, коммутаторе 8212zl) master относится к модулю управления, а slave — ко всем остальным модулям. В стекируемом коммутаторе ProCurve (например, коммутаторе 6200yl) главный относится к функции управления, а подчиненный — к различным модулям и/или группам портов на основе портов.

Чтобы включить создание дампа ядра на ведомых устройствах, установите флажок Включить создание дампа ядра на IM. Можно проверить как Master, так и Slave.

Чтобы загрузить дамп ядра:

Используйте раскрывающийся список дампа ядра, чтобы выбрать дамп ядра, который вы хотите загрузить.

Когда появится всплывающее окно, нажмите «Сохранить на диск», а затем нажмите «ОК».

Выберите место загрузки и введите имя файла, который нужно сохранить, затем нажмите "Сохранить" .

Рекомендуется добавить префикс даты в формате ГГГГММДД, а остальную часть имени и расширения файла оставить без изменений (например, 20081022-cfa0-dumpM1.cor).

После загрузки файла его можно отправить в службу поддержки клиентов HP ProCurve для диагностики и анализа информации о сбое системы в файле

Примечания по эксплуатации

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

Когда ведущий отключен, это автоматически отключает дамп ядра на всех подчиненных устройствах.

Отключение дампа ядра на ведомом устройстве не отключит дамп ядра на ведущем устройстве.

Чтобы проверить текущий статус дампа ядра (включен или отключен) или загрузить файл дампа ядра, используйте веб-интерфейс (см. «Интернет: включение/отключение дампа ядра» на странице C-3).

Читайте также: