Как установить местоположение файла дампа ядра (и имя)?

17

Я нахожусь на CentOS 6, пытаюсь включить дамп ядра для приложения, которое я разрабатываю. Я положил:

ulimit -H -c unlimited >/dev/null
ulimit -S -c unlimited >/dev/null

в моем профиле bash, но дамп ядра все еще не генерировался (в новом терминале).

Я также изменил свой /etc/security/limits.conf, чтобы мягкие ограничения были равны нулю для всех пользователей.

Как установить расположение файлов ядра для вывода? Я хотел указать местоположение и добавить время создания дампа, как часть имени файла?

user997112
источник
1
Это может быть полезно: stackoverflow.com/a/16048288/2808351
дхаг
stackoverflow.com/questions/2065912/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

27

Чтобы установить расположение дампов ядра в CentOS 6, вы можете отредактировать /etc/sysctl.conf. Например, если вы хотите получить дамп памяти в /var/crash:

kernel.core_pattern = /var/crash/core-%e-%s-%u-%g-%p-%t

Где переменные:

% e - это имя файла.
% g - это идентификатор процесса, под которым запущен процесс.
% p - это идентификатор процесса.
% s - это сигнал, вызвавший создание дампа.
% t - это время, когда произошел сброс.
% u - это идентификатор пользователя, под которым выполнялся процесс.

Также вы должны добавить /etc/sysconfig/init

DAEMON_COREFILE_LIMIT='unlimited'

Теперь примените новые изменения:

$ sysctl -p

Но есть предостережение с этим способом. Если параметр ядра kernel.core_pattern всегда сбрасывается и перезаписывается при перезагрузке в следующую конфигурацию, даже если значение указано вручную /etc/sysctl.conf:

|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e

Короче говоря, при abrtd.serviceзапуске kernel.core_patternавтоматически перезаписывается установленной системой abrt-addon-ccpp. Есть два способа решить эту проблему:

  1. Настройка DumpLocationпараметра в /etc/abrt/abrt.confфайле конфигурации. Каталог назначения можно указать, установив DumpLocation = /var/crashв /etc/abrt/abrt.confфайле конфигурации, и sysctl kernel.core_patternотображаемое значение будет таким же, но фактически основной файл будет создан в каталоге под /var/crash.

    Также, если у вас включен SELinux, вы должны запустить:

    $ semanage fcontext -a -t public_content_rw_t "/var/crash(/.*)?"  
    $ setsebool -P abrt_anon_write 1
    

    И наконец перезапустите abrtd.service:

    $ service abrtd.service restart
    
  2. Остановить службу abrtd. kernel.core_patternне будет перезаписан. - (Я никогда не проверял).

taliezin
источник
1
Потрясающий ответ. Возможно, стоит отметить, что в системах EFI вы также получаете дамп системной флэш-памяти.
mikeserv
0

Чтобы сгенерировать дамп ядра на Busybox, мы можем добавить следующие параметры в скрипт инициализации, который запускает наш исполняемый файл. Таким образом, всякий раз, когда мы инициализируем программное обеспечение и экспортируем переменные окружения, мы можем также скопировать приведенные ниже строки в скрипт и выгрузить ядро ​​в случае, если мы увидим любой сбой.

Чтобы установить расположение дампов ядра в Busybox, вы можете установить путь к файлу ядра, используя файловую систему proc. Например, если вы хотите получить дамп памяти в /tmp/crash/corefiles:

mkdir -p /tmp/crash/corefiles
chmod 775 /tmp/crash/corefiles
echo "/tmp/crash/corefiles/%e.%s.core" > /proc/sys/kernel/core_pattern

Где переменные:

% e - это имя файла.
% g - это идентификатор процесса, под которым запущен процесс.
% p - это идентификатор процесса.
% s - это сигнал, вызвавший создание дампа.
% t - это время, когда произошел сброс.
% u - это идентификатор пользователя, под которым выполнялся процесс.

Кроме того, вы должны установить размер файла ядра, ниже команда устанавливает размер файла ядра неограниченным

ulimit -c unlimited

Теперь, чтобы проверить размер основного файла, установленного для каждого потока в процессе, мы можем проверить, используя

cat /proc/<PID>/limits

Вывод вышеуказанной команды:

Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        unlimited            unlimited            bytes     
Max open files            10000                10000                files     
Max address space         unlimited            unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             31868                31868                processes 
Max locked memory         65536                65536                bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       31868                31868                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us      

Как видно из приведенного выше вывода, максимальный размер файла ядра установлен на неограниченное количество.

Для получения дополнительной информации, пожалуйста, перейдите по этой ссылке. Методы отладки приложений Linux / Основные файлы

Анкит Радж
источник