Настройка сбора дампов (Core dump) в AlterOS

Материал из Wiki AlterOS
Версия от 05:08, 9 февраля 2024; Dolgopolova.aa (обсуждение | вклад) (Новая страница: «==Введение== Дамп ядра реализуется в Linux на основе сигналов. Сигнал в Linux - это механизм аси…»)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Введение

Дамп ядра реализуется в Linux на основе сигналов. Сигнал в Linux - это механизм асинхронной обработки событий. Каждый сигнал соответствует операции обработки исключений по умолчанию. Операция по умолчанию включает игнорирование сигнала (Ignore), приостановку процесса (Stop), завершение процесса (Terminate), завершение и создание дампа памяти (Core) и так далее. Обычно дамп ядра запускается следующими сигналами: SIGABRT, SIGBUS, SIGEMPT, SIGFPE, SIGILL, SIGOT, SIGQUIT, SIGSEGV, SIGSYS, SIGTRAP, SIGXCPU, SIGXFSZ. В core dump сохраняется память сбойного процесса при его падении, а также некоторая служебная информация. При помощи функции ядра Linux, мы можем настроить генерацию и экспорт файла, формата .ELF(Executable and Linkable Format) используемый для дальнейшей диагностики и отладки ошибок в компьютерных программах.

Следующие ситуации приведут к аварийному завершению запущенного процесса и дампу ядра:

  • доступ к памяти вне диапазона (массив вне диапазона, строка без терминатора \ n, чтение и запись строки вне диапазона)
  • многопоточные программы используют поточно-небезопасные функции, такие как функции без повторного входа.
  • данные, считываемые и записываемые несколькими потоками, не защищены блокировками (ресурсы критического раздела требуют монопольного доступа)
  • недопустимый указатель (например, исключение нулевого указателя или доступ к недопустимому адресу)
  • переполнение стека)

Настройка генерации и сохранения файлов дампа ядра

В AlterOS создание файла ядра отключено по умолчанию. Чтобы включить и настроить его, выполните ряд команд:

1.Отредактируйте конфигурационный файл /etc/security/limits.conf, определяющий размеры дампа:

   sudo  nano  /etc/security/limits.conf

Найдите и раскомментируйте строку

   *soft core 0

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

   *soft core unlimited

2.Отредактируйте файл /etc/sysctl.conf, определяющий место сохранения и параметры дампа, добавив путь к дампу ядра и формат файла ядра(по умолчанию основной файл будет создан в рабочем каталоге запущенного процесса):

   sudo  nano  /etc/sysctl.conf 

добавьте строки:

   kernel.core_pattern = /var/crash/core.%e.%p.%h.%t
   fs.suid_dumpable = 1

Здесь: /var/crash — это путь, а core.%e.%p.%h.%t — формат файла, где: %e — имя исполняемого файла(имя файла программы). %p – PID (идентификатор выгруженного процесса). %t – время дампа (в секундах с 0:00 1 января 1970 г.). %h – имя хоста

setuid – это бит разрешения, который позволяет пользователю запускать исполняемый файл с правами владельца этого файла. Другими словами, использование этого бита позволяет нам поднять привилегии пользователя в случае, если это необходимо. Параметр fs.suid_dumpable для sysctl может принимать следующие значения:

  • 0 – отключено;
  • 1 – включено;
  • 2 – включено с ограничениями. Делает дампы ядра доступными для чтения только пользователю root.

3.Загрузите новые настройки при помощи команды:

   sudo sysctl -p

4.Чтобы собрать дампы ядра из неподписанных пакетов и неупакованного программного обеспечения, отредактируйте файл /etc/abrt/abrt-action-save-package-data.conf

   sudo nano /etc/abrt/abrt-action-save-package-data.conf 

установите соответствующие значения в строках:

   OpenGPGCheck = no
   ProcessUnpackaged = yes

5.перезапустите демон abrtd, чтобы новые настройки вступили в силу:

   sudo systemctl restart abrtd.service
   sudo systemctl restart abrt-ccpp.service

6.Включите создание дампа командой:

   ulimit -c unlimited

Теперь Alter OS готов генерировать файлы дампа ядра, когда процессы завершаются с соответствующими сигналами. Файлы, формата ELF и вида по типу core.[номер] будут генерироваться при падении процесса и сохраняться в текущем каталоге программы. Данные файлы можно использовать для анализа проблемы.

==Дополнительно: Проверка создания файла дампа ядра. Чтение файла дампа==.

1.Создайте сбойную программу для проверки сохранения дампа на языке С:

   mkdir test
   cd test
   touch main.c
   nano main.c
   int main(){
     int a = 1;
     int b = 0;
     double d = a / b;
     return 0;
   }

2.Скомпилируйте и запустите программу, которая запустит дамп ядра (Примечание: параметр -g должен быть добавлен при компиляции, что означает, что добавляется отладочная информация, чтобы отладчик gdb можно было использовать для отладки):

   gcc -g -o checkprog main.c
   sudo ./checkprog
    

при запуске сбойной программы терминал ответит выводом:

   Исключение в операции с плавающей точкой (core dumped)

где (core dumped) будет означать, что дамп создан при падении нашей сбойной программы.


3.Убедиться, что файл создался, можно командой:

   sudo ls

В ответе терминала увидим: checkprog core.4472 main.c

В текущем каталоге создается файл ядра, Убедитесь, что основным типом файла является формат ELF, вы можете запустить файл, используя readelf с параметром -h для просмотра информации заголовка файла ELF следующим образом:

   sudo readelf -h core.4472