При возникновении ошибки сегментации в Linux сообщение об ошибке Segmentation fault (core dumped)
будет распечатано на терминал (если есть), и программа будет завершена. Как разработчик C / C ++, это случается со мной довольно часто, и я обычно игнорирую это и перехожу на него gdb
, воссоздавая свое предыдущее действие, чтобы снова вызвать недействительную ссылку на память. Вместо этого я подумал, что, возможно, смогу использовать вместо этого это «ядро», так как работа gdb
все время довольно утомительна, и я не всегда могу воссоздать ошибку сегментации.
У меня три вопроса:
- Куда сбрасывается это неуловимое «ядро»?
- Что это содержит?
- Что я могу с этим сделать?
gdb path-to-your-binary path-to-corefile
, аinfo stack
затемCtrl-d
. Единственное, что беспокоит, так это то, что дамп ядра - обычная вещь для вас.Ответы:
Если другие люди убираются ...
... ты обычно ничего не находишь. Но, к счастью, в Linux есть обработчик, который вы можете указать во время выполнения. В /usr/src/linux/Documentation/sysctl/kernel.txt вы найдете:
( спасибо )
Согласно источнику, это обрабатывается
abrt
программой (это инструмент автоматического сообщения об ошибках, а не прерывание), но в моем Arch Linux это обрабатывается systemd. Вы можете написать свой собственный обработчик или использовать текущий каталог.Но что там?
Теперь то, что он содержит, зависит от системы, но согласно всезнающей энциклопедии :
... так что он в основном содержит все, что
gdb
хотел, и даже больше.Да, но я бы хотел, чтобы я был счастлив вместо GDB
Вы можете как быть счастливым , поскольку
gdb
будет загружать любой дамп до тех пор , пока у вас есть точная копия исполняемого файла:gdb path/to/binary my/core.dump
. После этого вы сможете продолжать работать как обычно и испытывать раздражение, пытаясь и не исправляя ошибки, а не пытаясь воспроизвести ошибки.источник
Кроме того, если
ulimit -c
возвращается0
, то файл дампа памяти не будет записан.См. Где искать файл ядра, сгенерированный в результате сбоя приложения Linux?
Вы также можете запустить дамп ядра вручную с помощью CTRL-, \который завершает процесс и вызывает дамп ядра.
источник
Основной файл обычно
core
вызывается и находится в текущем рабочем каталоге процесса. Однако существует длинный список причин, по которым основной файл не будет сгенерирован, и он может быть расположен где-то еще целиком под другим именем. Смотрите man-страницу core.5 для деталей:источник
В Ubuntu любое происходящее падение записывается в / var / crash. Сгенерированный отчет о сбое может быть распакован с помощью инструмента apport
а затем дамп ядра в распакованном отчете можно прочитать, используя
источник