Ядро сброшено, но файл ядра не находится в текущем каталоге?

228

Во время работы программы на Си написано "(core dumped)", но я не вижу никаких файлов по текущему пути.

Я установил и проверил ulimit:

ulimit -c unlimited 
ulimit -a 

Я также пытался найти файл с именем "core", но не получил файл дампа ядра?
Любая помощь, где мой основной файл?

  • 1
    Программа вызывает chdir в какой-то момент? Если так, посмотрите там.
  • 2
    Программа меняет свой рабочий каталог? Посмотрите там.
Показать ещё 5 комментариев
Теги:
coredump

8 ответов

209
Лучший ответ

Прочитайте /usr/src/linux/Документация/sysctl/kernel.txt.

[/proc/sys/kernel/] core_pattern используется для указания имени шаблона ядра dumpfile.

  • Если первым символом шаблона является '|', ядро ​​будет обрабатывать остальную часть шаблона в качестве команды для запуска. Основная свалка будет записанный на стандартный ввод этой программы, а не в файл.

Вместо того, чтобы записывать основной дамп на диск, ваша система настроена на отправку его в программу abrt. Автоматический отчет об ошибках, возможно, не так документирован как должен быть...

В любом случае, быстрый ответ заключается в том, что вы должны найти свой основной файл в /var/cache/abrt, где abrt сохраняет его после вызова. Аналогично, другие системы, использующие Apport, могут выкидывать ядра в /var/crash и т.д.

  • 27
    да, я отредактировал core_pattern со следующим содержимым echo "core.% e.% p"> / proc / sys / kernel / core_pattern .. теперь он создает файл дампа ядра в самом текущем каталоге. с именем "core.giis.12344" и т. д. Спасибо всем за ваши ответы / комментарии / советы.
  • 18
    Отметим, что программа aborat fedora 18 хранит дампы ядра в /var/spool/abrt/ вместо /var/cache/abrt
Показать ещё 4 комментария
204

В недавнем Ubuntu (12.04 в моем случае) можно было напечатать "Ошибка сегментации (core dumped)", но основной файл не появился там, где вы могли бы ожидать его (например, для локально скомпилированной программы).

Это может произойти, если у вас есть размер основного файла ulimit 0 (вы еще не сделали ulimit -c unlimited) - это значение по умолчанию для Ubuntu. Обычно это подавляло бы "(сбрасывание ядра)", ввязав вас в вашу ошибку, но на Ubuntu файлы corefiles отправляются на Apport (Система отчетности о сбоях Ubuntu) через /proc/sys/kernel/core_pattern, и это, похоже, вызывает вводящее в заблуждение сообщение.

Если Apport обнаруживает, что данная программа не является одной, ей следует сообщать о сбоях (что вы можете увидеть в /var/log/apport.log), оно возвращается к моделированию поведения ядра по умолчанию для размещения основного файла в cwd ( это делается в script /usr/share/apport/apport). Это включает в себя почитание ulimit, и в этом случае он ничего не делает. Но (я предполагаю), насколько это касается ядра, генерируется файл corefile (и передается по каналу apport), следовательно, появляется сообщение "Ошибка сегментации (ядро сбрасывается)".

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

(Кроме того, в общем случае основная страница руководства (5) - man 5 core - является хорошей ссылкой для того, где заканчивается ваш основной файл, и причины, по которым он не может быть записан.)

  • 4
    Большое спасибо - я столкнулся с той же проблемой. Кстати, Ubuntu 14.04 демонстрирует точно такое же поведение, как и описанное вами.
  • 4
    В моей установке Ubuntu (измененной 14.04) есть простой временный обходной путь для этого, запустив sudo service apport stop - после того, как я запустил это, он изменил /proc/sys/kernel/core_pattern из канала приложения в только core . Полагаю, Apport достаточно умен, чтобы временно исправить core_pattern .
Показать ещё 7 комментариев
69

С запуском systemd появился еще один сценарий. По умолчанию systemd будет хранить основные дампы в своем журнале, будучи доступными с помощью команды systemd-coredumpctl. Определено в файле core_pattern:

$ cat /proc/sys/kernel/core_pattern 
|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e

Такое поведение можно отключить с помощью простого "взлома":

$ ln -s /dev/null /etc/sysctl.d/50-coredump.conf
$ sysctl -w kernel.core_pattern=core      # or just reboot

Как всегда, размер дампов ядра должен быть равен или больше, чем размер сбрасываемого ядра, как это сделано, например, ulimit -c unlimited.

  • 0
    Этот «взлом» не работал для меня (даже после перезагрузки). Я использую Arch Linux и уже использую ulimit -c unlimited .
  • 0
    @ gsingh2011 Это может быть устаревшим. Я больше не управляю Arch, поэтому не могу сказать, сработает ли это в наши дни. Если вы поймете это, не стесняйтесь обновить меня / нас с новым комментарием.
Показать ещё 2 комментария
27

Написание инструкций для получения дампа ядра под Ubuntu 16.04 LTS:

  1. Как упомянул @jtn в своем ответе, Ubuntu делегирует отображение сбоев в apport, который в свою очередь отказывается записывать дамп, потому что программа не является установленным пакетом. Изображение 4803

  2. Чтобы решить эту проблему, мы должны убедиться, что apport также записывает файлы дампа ядра для непакетных программ. Для этого создайте файл ~/.config/apport/settings со следующим содержимым:
    [main] unpackaged=true

  3. Теперь снова закройте вашу программу и увидите, что ваши файлы сбоя генерируются в папке: /var/crash с такими именами, как *.1000.crash. Обратите внимание, что эти файлы не могут быть прочитаны GDB напрямую. Изображение 4804
  4. [Необязательно] Чтобы сделать дамп доступным для чтения с помощью gdb, выполните следующую команду:

    apport-unpack <location_of_report> <target_directory>

Ссылки: Core_dump - Oracle VM VirtualBox

  • 0
    Это единственное решение, которое работало для меня в Ubuntu 18.04
10

Я мог бы подумать о двух следующих возможностях:

  • Как уже отмечалось, программа может chdir(). Является ли пользователь, запускающий программу, разрешенным для записи в каталог, на который он chdir() 'ed? Если нет, он не может создать дамп ядра.

  • По какой-то странной причине дамп ядра не называется core.* Для этого вы можете проверить /proc/sys/kernel/core_pattern. Кроме того, команда find, которую вы назвали, не сможет найти типичный дамп ядра. Вы должны использовать find / -name "*core.*", поскольку типичным именем coredump является core.$PID

  • 0
    вот мой шаблон - означает ли это, что файл ядра называется как «PID.signal.userid» вместо core.pid ??? $ cat / proc / sys / kernel / core_pattern / usr / lib / hookCCpp / var / char / abrt% p% s% u
6

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

содержит

ProcessUnpackaged = yes

Это позволяет создавать отчеты о сбоях (включая дампы ядра) для двоичных файлов, которые не являются частью установленных пакетов (например, локально построены).

3

Мои усилия в WSL были неудачными.

Для тех, кто работает в подсистеме Windows для Linux (WSL), в настоящее время существует проблема с отсутствующими файлами дампа памяти.

Комментарии указывают на то, что

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

Выпуск Github

Обратная связь для разработчиков Windows

3

Для fedora25 я мог найти файл ядра в

/var/spool/abrt/ccpp-2017-02-16-16:36:51-2974/coredump

где ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P % в соответствии с `/proc/sys/kernel/core_pattern '

Ещё вопросы

Сообщество Overcoder
Наверх
Меню