Библиотека сайта rus-linux.net
Использование дампов ядра для диагностики сбойных программ
Оригинал: HowTo: Debug Crashed Linux Application Core Files Like A ProАвтор: Vivek Gite
Дата: 18 июня 2010
Свободный перевод: Алексей Дмитриев
Дата перевода: 6 июля 2010
Дампы ядра часто применяются для диагностики и поиска ошибок в Линуксовых и Юниксовых программах. Они помогут системному администратору выяснить, отчего рухнула та или иная программа, например, Lighttpd, Apache или PHP-CGI. Файл дампа ядра генерируется всякий раз, когда программа нештатно завершается из-за ошибки, нарушения политики безопасности операционной системы, попытки записывать данные вне отведенной ей области памяти и так далее. В этой статье рассказано, как подключить генерацию файлов дампов ядра и отслеживать с их помощью ошибки в программах.
Как подключить создание файлов дампа ядра
Генерация дампов ядра по умолчанию отключена в большинстве дистрибутивов Линукс (по крайней мере, это так для RHEL, CentOS, Fedora и Suse Linux). Нужно применить команду ulimit чтобы настроить генерацию.Как просмотреть текущие настройки файлов дампа ядра
Запустите команду ulimit как root:
# ulimit -c 0Нулевой вывод команды означает, что файлы дампов не создаются.
Как изменить настройки
Чтобы инициировать создание файлов дампов размером 75000 байт, запустите команду:
# ulimit -c 75000
Как подключить генерацию файлов дампа ядра для рухнувших программ и ошибок сегментации
Чтобы подключить создание файлов дампов ядра на постоянной основе нужно отредактировать файл /etc/profile.Найдите в /etc/profile строку
ulimit -S -c 0 > /dev/null 2>&1
И измените ее, чтобы получилось:
ulimit -c unlimited >/dev/null 2>&1
Также следует внести изменения в файл /etc/sysctl.conf. В этот файл следует дописать три строки:
kernel.core_uses_pid = 1 kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t fs.suid_dumpable = 2
Не забудьте сохранить отредактированные файлы.
Что означают последние три записи?
- kernel.core_uses_pid = 1 ≈ добавляет к имени файла дампа номер PID процесса.
- fs.suid_dumpable = 2 ≈ обеспечивает создание дампов ядра для программ с setuid битом.
- kernel.core_pattern = /tmp/core-%e-%s-%u-%g-%p-%t ≈ Когда программа нештатно завершается, файл дампа появляется в директории /tmp. Благодаря параметру kernel.core_pattern, программа sysctl определяет конкретное имя файла дампа ядра. При помощи символа процента (%) могут быть заданы следующие значения:
- %% ≈ одиночный символ %
- %p ≈ PID дампируемого процесса
- %u ≈ UID дампируемого процесса
- %g ≈ GID дампируемого процесса
- %s ≈ Номер сигнала, вызвавшего дампирование
- %t ≈ время создания дампа (в секундах, с момента 0:00часов, 1 января 1970, то есть с условного момента создания ОС Юникс)
- %h ≈ hostname (имя хоста), также как и 'nodename', возвращаемое командой uname(2)
- %e ≈ имя исполняемого файла программы
Совершив все вышеописанные действия, запустите дампирование при помощи команды (Redhat и подобные дистрибутивы):
# echo "DAEMON_COREFILE_LIMIT='unlimited'" >> /etc/sysconfig/init
И запишите настройки в /etc/sysctl.conf при помощи следующей команды:
# sysctl -p
Как инициировать создание дампов ядра для конкретного демона
Для того чтобы получать файлы дампов ядра для определенного демона, нужно дописать соответствующую строку в файл конфигурации нужного демона.Например, для демона lighttped, в файл /etc/init.d/lighttped нужно добавить строку:
DAEMON_COREFILE_LIMIT='unlimited'
Сохраните файл. Затем перезапустите демон:
# /etc/init.d/lighttpd restart # su - lighttpd $ ulimit -c
Правильный вывод последней команды:
unlimited
Имейте в виду, что эта вышеприведенная строка является специфичной только для Redhat. Для всех остальных дистрибутивов конфигурацию прописывают строками:
ulimit -c unlimited >/dev/null 2>&1 echo /tmp/core-%e-%s-%u-%g-%p-%t > /proc/sys/kernel/core_pattern
Все, теперь можно отправлять дамп ядра разработчикам или распространителям программы.
Как читать дампы ядра
Чтобы разобраться с дампом ядра нужна команда gdb:
$ gdb /path/to/application /path/to/corefile
Для ясности читайте ман gdb.