Segmentation fault (core dumped) - куда? что это? и почему?

Если вы используете дистрибутив systemd, вы можете использовать системный таймер для получения такого уровня разрешения синхронизации. В зависимости от вашего случая использования, вы можете использовать его как дельта-t (например, каждые x секунд с момента загрузки) или настроить его с помощью времени стены (например, в 00:00:10, 00:02:10 и т. Д.).

Короче говоря, вы создадите 2 файла.

  1. Первый — это файл .timer, , описанный здесь. Это настроит время событий таймера и настроит то, что произойдет при возникновении события синхронизации. Есть ряд критериев, которые нужно определить - например, хотите ли вы, чтобы он запускался сразу при загрузке, а затем каждые 130 секунд? Вы хотите, чтобы он запускался, если он находится на более низком уровне пробега? Вы хотите, чтобы он продолжал работать, если он столкнулся с ошибками? Systemd становится, возможно, сложным гораздо быстрее, чем старые подходы с файлами init и заданиями cron. Однако его использование вместо cron решит вашу проблему со временем.

  2. Второй файл обычно представляет собой service-файл, который вызывается службой таймера. В этом файле вы определите, что делает задание cron - либо простую команду, либо вызов другого скрипта, чтобы разрешить более сложные задачи. Этот служебный файл обычно настраивается как «oneshot». Смотрите здесь для получения более подробной информации.

Файлы должны быть скопированы в /etc/systemd/system/, и вы запустите следующее, чтобы включить / запустить службу таймера:

 systemctl enable mycronjob.timer
 systemctl start mycronjob.timer

Вы можете использовать journalctl для просмотра / отладки вашей реализации. Для получения дополнительной информации см. обсуждение archwiki.

16
18.04.2016, 20:42
3 ответа

Если другие убирают ...

... обычно вы ничего не находите. Но, к счастью, в Linux есть обработчик для этого, который вы можете указать во время выполнения. В /usr/src/linux/Documentation/sysctl/kernel.txt вы найдете:

[ / proc / sys / kernel /] core_pattern используется для указания имени шаблона файла дампа ядра.

  • Если первым символом шаблона является '|', ядро ​​будет рассматривать остальную часть шаблона как команду для выполнения. Дамп ядра будет записан на стандартный ввод этой программы, а не в файл.

( спасибо )

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

Но что там?

То, что он содержит, зависит от системы, но согласно всезнающей энциклопедии :

{ {1}}

[Дамп ядра] состоит из записанного состояния рабочей памяти компьютерной программы в определенное время [...]. На практике другие ключевые части состояния программы обычно сбрасываются одновременно, включая регистры процессора , которые могут включать в себя счетчик программ и указатель стека , информацию об управлении памятью. , а также другие флаги и информацию о процессоре и операционной системе.

... так что он в основном содержит все, что gdb когда-либо хотел, и многое другое.

Да, но я бы хотел, чтобы я был счастлив вместо gdb

Вы оба можете быть счастливы, поскольку gdb загрузит любой дамп ядра, если у вас есть точная копия вашего исполняемого файла: gdb путь / к / binary my / core.dump . После этого вы сможете продолжить работу в обычном режиме, и вас будут раздражать попытки и неудачи в исправлении ошибок вместо попыток и неудач в их воспроизведении.

24
27.01.2020, 19:48

Основной файл обычно называется core и находится в текущем рабочем каталоге процесса. Тем не менее, существует длинный список причин, по которым основной файл не будет сгенерирован, и он может быть расположен где-то еще, под другим именем. Подробности см. на странице core.5:

ОПИСАНИЕ

По умолчанию определенные сигналы действуют так: процесс Завершите и создайте файл дампа ядра , файл диска, содержащий файл изображение памяти процесса на момент его завершения. Это изображение может использоваться в отладчике (например, gdb(1)) для проверки состояния на момент ее завершения. Список сигналов, которые Причину процесса сброса ядра можно найти в signal(7).

...

Существуют различные обстоятельства, при которых файл дампа ядра не создается:

 * Процесс не имеет разрешения на запись основного файла. (По
 По умолчанию основной файл называется core или core.pid, где pid —
 Идентификатор процесса, который сбросил ядро, и создается в
 текущий рабочий каталог. Подробности об именовании см. ниже.) 
 Запись основного файла завершится ошибкой, если каталог, в котором он находится
 Быть созданным нельзя записывать или если существует файл с таким именем
 и не является записываемым или не является обычным файлом (например, это
 каталог или символическая ссылка).
 * Файл (записываемый, обычный) с тем же именем, которое используется для
 Дамп ядра уже существует, но существует более одной жесткой ссылки
 в этот файл.
 * Файловая система, в которой будет создан основной файл дампа, заполнена;
 или закончились иподы; или монтируется только для чтения; или пользователь имеет
 достигли своей квоты для файловой системы.
 * Каталог, в котором должен быть создан основной файл дампа
 не существует.
 * RLIMIT_CORE (размер основного файла) или RLIMIT_FSIZE (размер файла)
 ограничения ресурсов для процесса равны нулю; см. getrlimit(2)
 и документация команды ulimit оболочки (предел в
 csh(1)).
 * Двоичный файл, выполняемый процессом, не имеет чтения
 разрешение включено.
 * Процесс выполняет программу set-user-ID (set-group-ID), которая
 принадлежит пользователю (группе), не принадлежащему реальному идентификатору пользователя (группы)
 Процесс или процесс выполняет программу, которая имеет файл
 возможности (см. возможности(7)). (Однако см. описание
 операции PR_SET_DUMPABLE prctl(2) и описание
 файл /proc/sys/fs/suid_dumpable в proc(5).)
 * (Начиная с Linux 3.7) Ядро было настроено без
 CONFIG_COREDUMP вариант.

В дополнение Дамп ядра может исключать часть адресного пространства процесс, если был использован флаг madvise(2) MADV_DONTDUMP.

Именование файлов дампа ядра

По умолчанию файл дампа ядра называется core, но /proc/sys/kernel/core_pattern файл (начиная с Linux 2.6 и 2.4.21) может быть настроенным для определения шаблона, который используется для имен основных файлов дампа. Шаблон может содержать спецификаторы % , которые заменяются Следующие значения при создании основного файла:

 %% один символ %
 %c Размер основного файла мягкий ресурс Ограничение процесса сбоя (начиная с
 Linux 2.6.24)
 Режим дампа %d — то же значение, возвращаемое prctl(2) PR_GET_DUMPABLE
 (начиная с Linux 3.7)
 %e имя исполняемого файла (без префикса пути)
 %E путь к исполняемой файлу, с косыми чертами ('/'), замененными на
 восклицательные знаки ('!') (начиная с Linux 3.0).
 %g (числовой) реальный GID демпингового процесса
 %h имя хоста (то же, что и имя узла, возвращаемого uname(2))
 %i TID потока, который вызвал дамп ядра, как показано в PID
 пространство имен, в котором находится поток (начиная с Linux 3.18)
 %I TID потока, который вызвал дамп ядра, как показано в
 начальное пространство имен PID (начиная с Linux 3.18)
 %p PID дампа процесса, как показано в пространстве имен PID, в котором
 Процесс находится в резиденту
 %P PID дампингового процесса, как показано в исходном пространстве имен PID
 (начиная с Linux 3.12)
 %s количество сигналов, вызывающих дамп
 % t времени дампа, выраженного в секундах с эпохи,
 1970-01-01 00:00:00 +0000 (UTC)
 %u (числовой) реальный UID демпингового процесса
4
27.01.2020, 19:48

En Ubuntu, cualquier falla que ocurra se registra en /var/crash. El informe de bloqueo generado se puede desempaquetar usando una herramienta

apport-unpack /var/crash/_crash_file.crash 'path to unpack'

y luego el volcado del núcleo en el informe desempaquetado se puede leer usando

gdb 'cat ExecutablePath' CoreDump

4
27.01.2020, 19:48

Теги

Похожие вопросы