Почему создаются файлы дампа ядра?

иногда, когда я запускаю свой код, файл дампа ядра генерируется при завершении программы Ctrl+. Имя файла имеет вид core.*. Программа не завершается резко, и нет ошибки сегментации. Я считаю, что это SIGQUIT, а не SIGABRT или SIGSEGV. Если я попытаюсь Ctrl+C или Ctrl+Z, то он не создается.

может ли кто-нибудь сказать, почему он генерируется только тогда, когда Ctrl+ нажата? Как избежать создания этого файла дампа ядра? Есть ли какая-либо польза для файла Core dumped?

7 ответов


процесс сбрасывает ядро, когда он завершается операционной системой из-за ошибки в программе. Наиболее типичной причиной этого является то, что программа обратилась к недопустимому значению указателя. Учитывая, что у вас есть спорадический дамп, вероятно, вы используете неинициализированный указатель.

можете ли вы опубликовать код, который вызывает ошибку? Помимо расплывчатых обобщений, трудно догадаться, что не так, не видя кода.

Что касается того, что core dump на самом деле, проверьте эту статью Википедии:


по словам других, прежде чем дамп ядра является результатом ошибки в программе.

Вы можете настроить, если дамп памяти создается с помощью тега ограничение. Входим

ulimit -c 0

отключает генерацию файлов ядра в активной оболочке.

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

gdb <pathto/executable> --core <corefilename>

дампы ядра генерируются, когда процесс получает определенные сигналы, такие как SIGSEGV, которые ядра отправляют ему, когда он обращается к памяти за пределами своего адресного пространства. Обычно это происходит из-за ошибок в использовании указателей. Это означает, что в программе есть ошибка.

дамп ядра полезен для поиска ошибки. Это изображение памяти процесса во время проблемы, поэтому отладчик, такой как gdb, можно использовать для просмотра того, что делала программа. Этот отладчик может даже получить доступ (иногда) к значениям переменных в программе.

вы можете предотвратить основные дампы с помощью команды ulimit.


Это инструмент для помощи в отладке приложения, которое ведет себя плохо. Он большой, потому что содержит содержимое физической памяти всех приложений на момент его смерти, а также состояния регистра и стеки всех его потоков.

они генерируются, когда ядро убивает приложение за что-то злое, например, за нарушение сегментации или ошибку шины.


сочетания клавиш Ctrl + \ отправляет сигнал SIGQUIT в процесс. Согласно POSIX.1 стандарт, действие по умолчанию для этого сигнала-генерировать ядро.

SIGILL, SIGABRT, SIGFPE, SIGSEGV-другие случаи, когда система будет генерировать ядро.

пожалуйста см. "сигнал человека 7" на вашей системе для больше деталей.


вы можете избежать создания файла дампа ядра, написав код, который не аварийно:)

серьезно, основные дампы полезны, потому что вы можете видеть состояние программы, когда она разбилась, для отладки "post mortem". Вы можете открыть их в gdb и проверить состояние вашей программы (особенно если она была построена с отладкой).

обычно дампы ядра создаются, если программа имеет SIGSEGV (обычно вызванный недопустимым разыменованием указателя), SIGABRT (что произойдет, если вы вызывается abort() или в C++ по умолчанию обработчиком terminate () для исключений в деструкторах и т. д.) или какой-либо другой ошибкой. Вы также можете вызвать их явно с помощью отладчика или программно.

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


точки Ctrl + \ для создания дампа ядра. Вот что!--0--> делает. Если вы не хотите, чтобы он был сгенерирован, используйте Ctrl + C (). Если программа не отвечает SIGINT но вам нужно убить его с терминала, либо вы, либо разработчик делаете что-то неправильно.

программы, предназначенные не быть убитым из терминала с Ctrl + C должен по-прежнему изящно реагировать на SIGTERM, который может быть запущен в другом терминале через kill -TERM .... Если все остальное не удастся,SIGKILL приведут к немедленному прекращению.