Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Обновление и конфигурирование ядра

Использование дампов ядра для диагностики сбойных программ

Оригинал: 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.

Команда strace

Системным администраторам и отладчикам программ неоценимую помощь окажет команда strace. Она полезна, когда исходного кода под рукой нет, причем не придется рекомпилировать программу. Примеры работы с этой программой найдете здесь.

Рекомендованные публикации