Core dump (Русский)
Дамп памяти (core dump) — это файл, в который записывается адресное пространство (память) процесса при его нештатном завершении. Дампы ядра могут создаваться по требованию (например, отладчиком) или автоматически при завершении процесса. Дампы памяти создаются ядром при сбое программы и могут быть переданы вспомогательной программе (например, systemd-coredump) для дальнейшей обработки. Дамп памяти обычно не используется обычным пользователем, но может быть передан разработчикам по их запросу, которым будет очень полезно иметь снимок состояния программы на момент сбоя, особенно если сбой трудно воспроизвести.
Отключение автоматических дампов памяти
Пользователи могут захотеть отключить автоматические дампы памяти по нескольким причинам:
- Производительность: создание дампа для процессов, занимающих много памяти, может привести к трате системных ресурсов и задержке очистки памяти.
- Дисковое пространство: дампы процессов, занимающих много памяти, могут занимать место на диске, равное, а то и большее, чем объём памяти процесса, если их не сжимать.
- Безопасность: хотя дампы обычно может читать только 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/
файл[1][2]:
/etc/systemd/coredump.conf.d/custom.conf
[Coredump] Storage=none
[Coredump]
, иначе опция будет проигнорирована.Затем перезагрузите настройки systemd.
Одного этого метода обычно достаточно для отключения записи дампов, если в системе нет других программ, включающих автоматические дампы, но дамп памяти всё равно генерируется в памяти и systemd-coredump всё равно запускается.
Используя PAM limits
Максимальный размер дампа памяти для пользователей, вошедших в систему через PAM, задаётся в файле limits.conf. Установка нулевого значения полностью отключает дампы памяти. [3]
/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 о тестировании файловых систем на наличие ошибок