2009-04-22 5 views
9

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

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

+0

Когда вы говорите «запустите мой код», вы говорите, когда запускаете make? Или когда вы запускаете скомпилированный двоичный файл? – harto

ответ

17

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

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

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

+5

В Linux, Ctrl + \ вызывает дамп ядра, даже если программа не имеет ошибок и работает нормально во время завершения. – ely

5

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

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

+0

Hum ... В нем содержится только свалка памяти процесса, но все же это может быть довольно много памяти. – Ben

7

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

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

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

10

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

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

ulimit -c 0 

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

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

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

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

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

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

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

6

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

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

Для получения более подробной информации, пожалуйста, обратитесь к «сигналу человека 7» в вашей системе.

1

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

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

Смежные вопросы