Во время работы программы на Си написано «(core dumped)», но я не вижу никаких файлов по текущему пути.
Я установил и проверил ulimit
:
ulimit -c unlimited
ulimit -a
Я также пытался найти файл с именем "core", но не получил файл дампа ядра?
Любая помощь, где мой основной файл?
/proc/sys/kernel/core_pattern
строку, начинающуюся с/tmp
тогда, то туда и пойдут дампы ядра.Ответы:
Прочитайте /usr/src/linux/Documentation/sysctl/kernel.txt .
Вместо того, чтобы записывать дамп ядра на диск, ваша система настроена на отправку его
abrt
программе. Automated Bug Reporting Tool , возможно, не так документально, как это должно быть ...В любом случае, быстрый ответ заключается в том, что вы должны быть в состоянии найти ваш основной файл в том месте
/var/cache/abrt
, гдеabrt
он хранится после вызова. Точно так же другие системы, использующие Apport, могут сжимать ядра/var/crash
и так далее.источник
/var/spool/abrt/
вместо/var/cache/abrt
/var/lib/systemd/coredump/
В недавнем Ubuntu (12.04 в моем случае) возможно распечатать «Ошибка сегментации (сброшено ядро)», но файл ядра не был создан там, где вы могли бы его ожидать (например, для локально скомпилированной программы).
Это может произойти, если у вас размер основного файла ulimit 0 (вы этого не сделали
ulimit -c unlimited
) - это значение по умолчанию в Ubuntu. Обычно это подавляет «(ядро сброшено)», что указывает на вашу ошибку, но в Ubuntu файлы ядра отправляются в 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 и почему он не может быть записан.)источник
sudo service apport stop
- после того, как я запустил его, он изменился/proc/sys/kernel/core_pattern
с канала apport на justcore
. Полагаю, Apport достаточно умен, чтобыcore_pattern
временно исправить ситуацию.С запуском systemd , есть и другой сценарий. По умолчанию systemd будет хранить дампы ядра в своем журнале, будучи доступным с помощью
systemd-coredumpctl
команды. Определено в файле core_pattern:Такое поведение можно отключить простым «взломом»:
Как всегда, размер дампов ядра должен быть равен или превышать размер дампов ядра, как, например, сделано
ulimit -c unlimited
.источник
ulimit -c unlimited
.50-coredump.conf
вместоcoredump.conf
. Это должно переопределить/lib/sysctl.d/50-coredump.conf
. По умолчанию можно восстановить с помощьюsysctl -w kernel.core_pattern=core
sudo service apport stop
Написание инструкций для получения дампа ядра под Ubuntu 16.04 LTS :
Как упомянул @jtn в своем ответе, Ubuntu делегирует отображение сбоев в apport , который, в свою очередь, отказывается записывать дамп, поскольку программа не является установленным пакетом.
Чтобы решить эту проблему, мы должны убедиться, что apport также записывает файлы дампа ядра для непакетных программ. Для этого создайте файл ~ / .config / apport / settings со следующим содержимым:
[main] unpackaged=true
[Необязательно] Чтобы сделать дамп доступным для чтения с помощью gdb, выполните следующую команду:
apport-unpack <location_of_report> <target_directory>
Ссылки: Core_dump - Oracle VM VirtualBox
источник
Я мог бы подумать о двух следующих возможностях:
Как уже отмечали другие, программа может
chdir()
. Разрешено ли пользователю, работающему с программой, записывать в каталог, в который онаchdir()
редактируется? Если нет, он не может создать дамп ядра.По какой-то странной причине дамп ядра не назван.
core.*
Вы можете проверить/proc/sys/kernel/core_pattern
это. Кроме того, команда find, которую вы назвали, не найдет типичный дамп ядра. Вы должны использоватьfind / -name "*core.*"
, так как типичное имя coredumpcore.$PID
источник
Если вам не хватает дампов ядра для двоичных файлов
RHEL
и при их использованииabrt
, убедитесь, что/etc/abrt/abrt-action-save-package-data.conf
содержит
Это позволяет создавать отчеты о сбоях (включая дампы ядра) для двоичных файлов, которые не являются частью установленных пакетов (например, локально собранных).
источник
Для fedora25, я мог бы найти основной файл в
где
ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %
согласно `/ proc / sys / kernel / core_pattern 'источник
Мои усилия в WSL были безуспешными.
Для тех, кто работает в подсистеме Windows для Linux (WSL), в настоящее время существует проблема с отсутствующими файлами дампа памяти.
Комментарии указывают на то, что
Выпуск Github
Обратная связь для разработчиков Windows
источник
В Ubuntu18.04 самый простой способ получить файл ядра - ввести команду ниже, чтобы остановить службу apport.
Затем перезапустите приложение, вы получите файл дампа в текущем каталоге.
источник
Я на Linux Mint 19 (на основе Ubuntu 18). Я хотел иметь
coredump
файлы в текущей папке. Я должен был сделать две вещи:/proc/sys/kernel/core_pattern
(по# echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_pattern
или# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
$ ulimit -c unlimited
Это было написано уже в ответах, но я написал, чтобы подвести итог кратко. Интересно, что изменение лимита не требовало привилегий суперпользователя (согласно /ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user non- root может только снизить лимит, так что это было неожиданно - комментарии по этому поводу приветствуются).
источник
ulimit -c unlimited
заставил файл ядра корректно появиться в текущем каталоге после "сброса ядра".источник