Jump to content
From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи 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 о тестировании файловых систем на наличие ошибок

Categories:

- Development (Русский)
- Security (Русский)