coredumpctl: найти падение бинаря
Что такое coredumpctl и как он работает
Когда бинарь падает с SEGV, ядро может сохранить core dump — снимок памяти процесса в момент креша. В systemd-based дистрибутивах за сбор, хранение и поиск этих дампов отвечёт coredumpctl, обёртка над systemd-coredump. Он хранит дампы в /var/lib/systemd/coredump/ и индексирует метаданные через journald.
Для работы нужен systemd-coredump и включённый journald. В минимальных контейнерах без systemd этот инструмент недоступен.
Установка тривиальна для большинства дистрибутивов:
После установки убедись, что kernel.core_pattern указывает на pipe в systemd-coredump:
Если стоит core.%e.%p — дампы пишутся в файлы, и coredumpctl их не видит.
Просмотр списка дампов: coredumpctl list
Базовая команда выводит все сохранённые падения:
Вывод содержит столбцы: MESSAGE ID, TIMESTAMP, PID, UID, GID, COMM, EXE, COREFILE.
Флаги фильтрации: --no-pager для скриптов, --json=short для парсинга, -n — только последняя запись.
Ключевые флаги list:
| Флаг | Назначение |
|---|---|
-n N | Последние N записей |
-1 | Только одна последняя |
--since TIMESTAMP | Начиная с даты |
--until TIMESTAMP | До даты |
-u USER | По UID |
--exe PATTERN | По пути к бинарю |
--debug | Показать служебные дампы |
Детали падения: coredumpctl info
Для одного дампа info выдаёт всё, что нужно перед тем как тянуть файл:
Где 1234 — PID процесса или номер из list. Вывод включает:
- сигнал, вызвавший падение (SIGSEGV, SIGABRT и т.д.)
- время и дату
- путь к исполняемому файлу
- размер core-файла
MESSAGE ID— корреляция с journald
Извлечение core-файла: coredumpctl dump
Извлекаемый файл можно отправить прямо в gdb или сохранить на диск:
Флаг --output=- выводит в stdout. Если core-файл большой (гигабайты), pipe может заблокироваться — лучше писать на диск.
Фильтрация и поиск по бинару, PID, времени
В реальной эксплуатации дампов накапливается десятки, и искать по PID неудобно. coredumpctl поддерживает несколько фильтров одновременно:
Для скриптов и автоматизации удобно использовать JSON:
Практические примеры отладки падений
Типичный цикл отладки выглядит так:
Если дамп не появляется — проверь coredumpctl list и journalctl -u systemd-coredump. Частая причина: LimitCORE в systemd-unit выставлен в 0, или kernel.core_pattern не настроен на pipe.
Для постоянного мониторинга добавь в unit-файл:
и перезапусти сервис. После этого coredumpctl начнёт видеть все падения.