нет дампа ядра в /var/crash

Я пытаюсь немного понять, как работает дамп ядра.

Я использую файл test.c для создания дампа ядра:

#include <stdio.h>                                                              

void foo()                                                                      
{                                                                               
        int *ptr = 0;                                                           
        *ptr = 7;                                                               
}                                                                               

int main()                                                                      
{                                                                               
        foo();                                                                  
        return 0;                                                               
}

я компилирую с

gcc test.c -o test

Что дает мне следующее сообщение, когда я запускаю ./test

Segmentation fault (core dumped)

Мой файл

/proc/sys/kernel/core_pattern 

содержит :

|/usr/share/apport/apport %p %s %c %d %P

Я проверил, что у меня есть права на запись в каталог

/var/crash/

но после дампа ядра в этой папке (/var/crash/) ничего нет. Я использую Linux версии 17.04. Знаете, что здесь может пойти не так?

изменить

Я забыл упомянуть, что я установил ограничения с помощью:

ulimit -c unlimited

поэтому вывод

ulimit -c

читает:

unlimited

Я даже пытался сделать то, что они говорят здесь в разделе Как включить аппорт , поэтому я добавил знак решетки перед

'problem_types': ['Bug', 'Package']

Но при всем при этом дамп ядра невозможно найти в /var/cash


person roi_saumon    schedule 10.01.2018    source источник
comment
Я не понимаю, как вы переходите от канала к apport к разрешениям на несвязанный каталог /var/crash/   -  person tripleee    schedule 10.01.2018
comment
Я читал в Интернете, что аппорт помещает дамп ядра в каталог /var/crash.   -  person roi_saumon    schedule 10.01.2018


Ответы (3)


Эта ссылка содержит контрольный список, почему дамп памяти не создается. Добавление списка ниже на случай, если ссылка станет недоступной в будущем.

  • Ядро было бы больше, чем текущий предел.
  • У вас нет необходимых прав для создания дампа ядра (каталога и файла). Обратите внимание, что дампы ядра помещаются в текущий каталог процесса создания дампа, который может отличаться от родительского процесса.
  • Убедитесь, что файловая система доступна для записи и имеет достаточно свободного места.
  • Если в рабочем каталоге существует подкаталог с именем core, дамп ядра выполняться не будет.
  • Если файл с именем core уже существует, но имеет несколько жестких ссылок, ядро ​​не создаст дамп ядра.
  • Проверьте разрешения на исполняемый файл, если исполняемый файл имеет биты suid или sgid, дампы ядра будут по умолчанию отключены. То же самое будет в случае, если у вас есть права на выполнение, но нет прав на чтение файла.
  • Убедитесь, что процесс не изменил рабочий каталог, ограничение размера ядра или флаг дампа.
  • Некоторые версии ядра не могут создавать дамп процессов с общим адресным пространством (потоки AKA). Более новые версии ядра могут создавать дамп таких процессов, но добавляют pid к имени файла.
  • Исполняемый файл может быть в нестандартном формате, не поддерживающем дампы ядра. Каждый исполняемый формат должен реализовывать процедуру дампа ядра.
  • Ошибка сегментации на самом деле может быть ошибкой ядра. К сожалению, проверьте системные журналы на наличие сообщений об ошибках.
  • Приложение вызвало exit() вместо использования обработчика дампа ядра.
person Mayank Jain    schedule 10.01.2018

Какое ограничение на размер файла вы установили для дампов памяти на вашем компьютере? Вы можете проверить это с помощью

$ ulimit -c

Если установлено значение 0, дампы памяти создаваться не будут — это значение по умолчанию в большинстве дистрибутивов.

Вы можете включить дампы ядра, установив для него значение «неограниченно» или используя определенный предел размера файла.

$ ulimit -c unlimited
person Niranjan Nagaraju    schedule 10.01.2018
comment
Вы также должны помнить, что ulimit -c зависит от сеанса. Поэтому, если вы измените его один раз и завершите сеанс, вам нужно будет снова запустить команду. Кроме того, решение не будет работать во всех оболочках. - person Mayank Jain; 10.01.2018
comment
Спасибо, Ниранджан, я уже пробовал это. Я добавил это в редактировании. - person roi_saumon; 10.01.2018

Я также изо всех сил пытался получить дампы ядра, и у меня была такая же проблема с ulimit. Специальная настройка сеанса, предложенная Ниранджаном, также не сработала для меня.

Наконец, я нашел решение по адресу https://serverfault.com/questions/216656/how-to-set-systemwide-ulimit-on-ubuntu

в /etc/security/limits.conf добавьте:

root - core unlimited
*    - core unlimited

И выйти/войти.

Затем

ulimit -c

на терминале должно возвращаться неограниченное количество и генерируются дампы ядра.

person Patrick Roocks    schedule 11.09.2020