Core dump (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
Core dump
. Дата последней синхронизации: 15 февраля 2022. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Дамп памяти
(core dump) — это файл, в который записывается адресное пространство (память) процесса при его нештатном завершении. Дампы ядра могут создаваться по требованию (например,
отладчиком
) или автоматически при завершении процесса. Дампы памяти создаются ядром при сбое программы и могут быть переданы вспомогательной программе (например,
systemd-coredump(8)
) для дальнейшей обработки. Дамп памяти обычно не используется обычным пользователем, но может быть передан разработчикам по их запросу, которым будет очень полезно иметь снимок состояния программы на момент сбоя, особенно если сбой трудно воспроизвести.
Отключение автоматических дампов памяти
Пользователи могут захотеть отключить автоматические дампы памяти по нескольким причинам:
Производительность: создание дампа для процессов, занимающих много памяти, может привести к трате системных ресурсов и задержке очистки памяти.
Дисковое пространство: дампы процессов, занимающих много памяти, могут занимать место на диске, равное, а то и большее, чем объём памяти процесса, если их не сжимать.
Безопасность: хотя дампы обычно может читать только root, они могут содержать конфиденциальные данные (например, пароли или криптографические ключи), которые записываются на диск после сбоя.
Используя sysctl
Можно использовать
sysctl
, чтобы изменить
kernel.core_pattern
для отключения дампов. Создайте файл:
/etc/sysctl.d/50-coredump.conf
kernel.core_pattern=/dev/null
Для немедленного применения изменений используйте команду
sysctl
:
# sysctl -p /etc/sysctl.d/50-coredump.conf
Используя 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/
файл (
coredump.conf(5) § DESCRIPTION
,,
[1]
):
/etc/systemd/coredump.conf.d/custom.conf
[Coredump]
Storage=none
Примечание
Не забудьте прописать имя секции
[Coredump]
, иначе опция будет проигнорирована.
Затем
перезагрузите
настройки systemd.
Одного этого метода обычно достаточно для отключения записи дампов, если в системе нет других программ, включающих автоматические дампы, но дамп памяти всё равно генерируется в памяти и systemd-coredump всё равно запускается.
Используя PAM limits
Максимальный размер дампа памяти для пользователей, вошедших в систему через
PAM
, задаётся в файле
limits.conf
. Установка нулевого значения полностью отключает дампы памяти.
[2]
/etc/security/limits.conf
* hard core 0
Используя ulimit
Командные оболочки
вроде
bash
и
zsh
имеют встроенную команду
ulimit
, которую можно использовать для просмотра или изменения ограничений на ресурсы оболочки и запускаемых ею процессов. Подробнее смотрите
bash(1) § SHELL BUILTIN COMMANDS
или
zshbuiltins(1)
.
Отключение дампов памяти в текущей командной оболочке:
$ ulimit -c 0
Создание дампа памяти
Чтобы сгенерировать дамп памяти произвольного процесса, сначала
установите
пакет
gdb
. Затем найдите PID запущенного процесса, например, с помощью
pgrep
:
$ pgrep -f
firefox
2071 firefox
Подключитесь отладчиком к этому процессу:
$ gdb -p 2071
И затем в отладчике выполните:
(gdb) generate-core-file
Saved corefile core.2071
(gdb) quit
Теперь у вас есть дамп памяти в файле
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
покажет список сохранённых дампов, среди которых можно найти нужный:
# coredumpctl list
Для поиска нужного дампа можно использовать PID, имя исполняемого файла, путь к исполняемому файлу или предикат
journalctl
(подробнее:
coredumpctl(1)
и
journalctl(1)
). Просмотр подробностей о дампах ядра:
# coredumpctl info
соответствие
Обратите внимание на строку "Signal", она поможет определить причину сбоя. Для более глубокого анализа вы можете изучить backtrace с помощью
gdb
:
# coredumpctl gdb
соответствие
После запуска
gdb
можно использовать команду
bt
для получения backtrace:
(gdb) bt
Если отладочные символы нужны, но не найдены, можно попробовать получить их, как описано в статье
Отладка/Трассировка
.
Удаление дампов памяти
Файлы дампов памяти, хранящиеся в
/var/lib/systemd/coredump/
, будут автоматически очищаться командой
systemd-tmpfiles --clean
, которая запускается ежедневно с помощью
systemd-tmpfiles-clean.timer
. Дампы памяти настроены на хранение не менее 3 дней, смотрите
systemd-tmpfiles --cat-config
.
Смотрите также
american fuzzy lop
- Инструмент для автоматизированного тестирования ядра и программ
Filesystem fuzzing
- Статья LWN о тестировании файловых систем на наличие ошибок