Failed with result core-dump — Расшифровка дампов памяти в systemd
Архитектура ошибки и симптомы сбоя
Сообщение «systemd: Failed with result 'core-dump'» генерируется менеджером systemd. Ошибка означает, что процесс сервиса завершился по одному из критических фатальных сигналов ядра Linux (SIGSEGV — ошибка адресации памяти, SIGABRT — аварийный аборт процесса функцией abort() или assert(), SIGFPE — деление на ноль, SIGILL — нелегальная инструкция процессора). При падении ядро сформировало полный снимок адресного пространства процесса и сохранило его на диск.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| Fatal Signals | SIGSEGV / SIGABRT / SIGILL | Сигналы операционной системы, приводящие к генерации аварийного дампа. |
| systemd-coredump | Core Dump Handler | Служба перехвата дампов ядра через интерфейс /proc/sys/kernel/core_pattern. |
| Storage | /var/lib/systemd/coredump | Каталог долговременного хранения сжатых дампов (формат zstd/lz4). |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Проверка и анализ последнего сгенерированного дампа
# Просмотр метаданных последнего сбоя:
sudo coredumpctl info
# Пример важной информации из вывода:
# Signal: 6 (ABRT)
# Coredump: /var/lib/systemd/coredump/core.service_name.1000...zstСценарий 2: Быстрое извлечение Backtrace без установки тяжелого GDB
Утилита coredumpctl умеет автоматически выводить стек вызовов:
# Печать стектрейса функций последнего упавшего процесса:
sudo coredumpctl info | grep -A 20 "Stack trace of thread"Сценарий 3: Проверка несовместимости инструкций CPU (SIGILL / Illegal Instruction)
Если приложение скомпилировано под новые наборы инструкций (AVX-512, AVX2, SSE4.2), а CPU хоста их не поддерживает:
# Проверка поддерживаемых флагов текущего CPU:
cat /proc/cpuinfo | grep -m 1 -E "(avx|avx2|avx512|sse4_2)"
# Если флагов нет, обновите модель CPU в гипервизоре (KVM cpu mode='host-passthrough')!Сценарий 4: Настройка размера хранилища дампов в coredump.conf
Предотвратите переполнение системного диска дампами памяти:
# Отредактируйте /etc/systemd/coredump.conf:
[Coredump]
Storage=external
Compress=yes
MaxUse=2G
KeepFree=5G
# Примените настройки:
sudo systemctl restart systemd-coredumpITSTM выполнит профилирование аварийных дампов памяти, поиск утечек в коде C++/Rust/Go и настройку автоматической отправки баг-репортов в Sentry.
Частые вопросы (FAQ)
Почему функция abort() вызывает сигнал SIGABRT (Signal 6)?
Разработчики вызывают функцию abort() или стандартные макросы assert(), когда программа сталкивается с заведомо некорректным логическим состоянием (например, нарушение инварианта структуры данных), чтобы немедленно сохранить дамп памяти для анализа.
Как полностью отключить генерацию core-dump файлов в системе?
В файле /etc/systemd/coredump.conf установите Storage=none и выполните: sudo systemctl restart systemd-coredump. Либо задайте limit ulimit -c 0.
Как открыть дамп памяти в IDE CLion / VS Code?
Выгрузите бинарный файл и дамп памяти командой: coredumpctl dump <PID> --output /tmp/core.dump. Откройте файл /tmp/core.dump в отладчике вашей IDE с указанием бинарного файла приложения.
Почему дамп памяти не генерируется при падении некоторых служб?
Если в unit-файле службы задана директива LimitCORE=0 или процесс менял UID через setuid без флага PR_SET_DUMPABLE, ядро блокирует создание дампа из соображений безопасности.