Почему создаются файлы дампа памяти? - PullRequest
15 голосов
/ 22 апреля 2009

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

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

Ответы [ 7 ]

23 голосов
/ 22 апреля 2009

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

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

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

12 голосов
/ 22 апреля 2009

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

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

ulimit -c 0

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

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

gdb <pathto/executable> --core <corefilename>
8 голосов
/ 22 апреля 2009

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

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

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

7 голосов
/ 04 октября 2010

ctrl + \ отправляет сигнал SIGQUIT процессу. В соответствии со стандартом POSIX.1 действие по умолчанию для этого сигнала заключается в создании ядра.

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

Пожалуйста, обратитесь к "man 7 signal" в вашей системе для более подробной информации.

6 голосов
/ 22 апреля 2009

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

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

2 голосов
/ 22 апреля 2009

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

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

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

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

1 голос
/ 10 мая 2014

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

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

...