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

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

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

ulimit -c unlimited 
ulimit -a 

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

Ответы [ 9 ]

224 голосов
/ 14 января 2010

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

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

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

Вместо записи дампа памяти на диск, ваша система настроена для отправки его в программу abrt. Automated Bug Reporting Tool возможно не так задокументировано, как должно быть ...

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

204 голосов
/ 22 августа 2013

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

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

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

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

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

75 голосов
/ 29 декабря 2012

С запуском 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.

35 голосов
/ 25 ноября 2017

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

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

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

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

    apport-unpack <location_of_report> <target_directory>

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

10 голосов
/ 14 января 2010

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

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

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

6 голосов
/ 08 декабря 2016

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

содержит

ProcessUnpackaged = yes

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

3 голосов
/ 04 мая 2018

Мои усилия в WSL были безуспешными.

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

В комментариях указывается, что

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

Выпуск Github

Отзывы разработчиков Windows

3 голосов
/ 16 февраля 2017

Для 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 '

0 голосов
/ 28 июня 2019

ulimit -c unlimited заставил файл ядра корректно появиться в текущем каталоге после "сброса ядра".

...