Вопрос или проблема
Генерация дампов памяти раньше работала нормально, но после перехода на systemd я вижу только сообщение
Прервано (дамп памяти)
но файл core
не создается. Это связано с systemd?
(Контекст: Мой оригинальный вопрос можно найти здесь. Спасибо schaiba за нахождение решения. Я предоставляю этот вопрос и ответ, чтобы другие могли легче найти решение, если они уже знают, что это проблема systemd.)
По умолчанию, systemd записывает дампы памяти в журнал. coredumpctl list
показывает отсутствующие дампы памяти.
Файлы хранятся в /var/lib/systemd/coredump
. Используйте coredumpctl dump
, чтобы получить доступ к файлам ядра.
Например, если PID был 10666, вы можете использовать
coredumpctl dump 10666 --output /tmp/core.10666
Не связано с systemd, но если это все еще не работает, убедитесь, что лимит на дамп памяти отключен:
# ulimit -c unlimited
Также проверьте, что вы можете записывать в рабочий каталог.
Настройки ядра /proc/sys/
управляются с помощью sysctl(8)
, системные настройки находятся в /usr/lib/sysctl.d/
, переопределены в /etc/sysctl.conf
или /etc/sysctl.d/
. Они определяют имя файлов core
и тому подобное. Не их запись (если только ядро не настроено на разрешение дампов памяти от SUID бинарников). Запись контролируется с помощью ulimit(1)
, т.е. ulimit -c unlimited
не накладывает ограничений. Под systemd(1)
файлы ядра, созданные под его контролем, записываются в журнал, могут быть извлечены с помощью coredumpctl(1)
. Обычные пользовательские процессы остаются без изменений.
systemd
‘s systemd-sysctl.service
просто запускает sysctl
в нужный момент загрузки и обрабатывает повторный запуск при изменениях.
Ответ или решение
Проблема отсутствия файлов дампов ядра после перехода на systemd
При переходе на systemd пользователи могут столкнуться с ситуацией, когда после аварийного завершения работы приложения не создаются файлы дампов ядра (core dumps). Вместо этого отображается сообщение: Aborted (core dumped)
. В этом ответе мы рассмотрим причины этой проблемы и возможные решения.
Причины отсутствия дампов ядра
По умолчанию, systemd изменяет способ обработки дампов ядра, что может вызвать путаницу для пользователей, привычных к традиционным методам сохранения дампов.
-
Журналирования дампов: Systemd по умолчанию записывает дампы ядра в журнал. Вместо создания файлов в рабочем каталоге приложения, попробуйте использовать команду
coredumpctl
. Эта команда позволяет просмотреть и извлечь дампы, сохранив их в формате файлов:coredumpctl list
Чтобы получить доступ к конкретному дампу по PID, используйте следующую команду:
coredumpctl dump <PID> --output /tmp/core.<PID>
Например, для процесса с идентификатором 10666 команда будет выглядеть так:
coredumpctl dump 10666 --output /tmp/core.10666
-
Ограничения на дампы: Следует убедиться, что ограничения на создание дампов ядра не установлены. Используйте команду
ulimit
, чтобы проверить это:ulimit -c
Для снятия любых ограничений выполните:
ulimit -c unlimited
-
Параметры ядра: Конфигурации, связанные с заполнением дампов, могут быть настроены через
sysctl
. Проверьте файлы конфигурации, расположенные в каталогах/usr/lib/sysctl.d/
,/etc/sysctl.conf
, или/etc/sysctl.d/
, чтобы убедиться, что параметры, определяющие имена файлов и другие аспекты, настроены корректно. -
Проверка прав доступа: Кроме того, необходимо убедиться в том, что процесс имеет достаточно прав для записи в рабочий каталог, где предполагается создание дампов.
Заключение
Если после выполнения вышеописанных шагов проблема не решена, рекомендуется проверить совместимость версий вашего программного обеспечения с systemd и ознакомиться с документацией, касающейся конфигурации systemd
и его взаимодействия с дампами ядра.
При переходе на systemd, включение и использование coredumpctl
является наиболее простым и эффективным способом работы с дампами, что позволяет упрощенно обрабатывать их и сохранять необходимую информацию для отладки.