Файл дампа ядра не генерируется - PullRequest
52 голосов
/ 12 октября 2011

Каждый раз при сбое моего приложения файл дампа ядра не генерируется.Я помню, что несколько дней назад на другом сервере он генерировал .Я запускаю приложение, используя экран в bash, вот так:

#!/bin/bash
ulimit -c unlimited
while true; do ./server; done

Как вы можете видеть, я использую ulimit -c unlimited, что важно, если я хочу сгенерировать дамп ядра, но он все еще не 'не генерировать его, когда я получил ошибку сегментации.Как я могу заставить это работать?

Ответы [ 13 ]

53 голосов
/ 05 мая 2013

Эта ссылка содержит хороший контрольный список, почему дампы ядра не генерируются:

  • Ядро было бы больше, чем текущий предел.
  • Вы надеваетене имеет необходимых разрешений для дампа ядра (каталог и файл).Обратите внимание, что дампы ядра помещаются в текущий каталог процесса дампирования, который может отличаться от родительского процесса.
  • Убедитесь, что файловая система доступна для записи и имеет достаточно свободного места.
  • Если подпрограммакаталог с именем core существует в рабочем каталоге, ядро ​​не будет выгружено.
  • Если файл с именем core уже существует, но имеет несколько жестких ссылок, ядро ​​не будет выгружать ядро.
  • Проверьте разрешения дляисполняемый файл, если в исполняемом файле разрешены дампы ядра suid или sgid, по умолчанию он будет отключен.То же самое будет в случае, если у вас есть разрешения на выполнение, но нет прав на чтение файла.
  • Убедитесь, что процесс не изменил рабочий каталог, ограничение размера ядра или флаг сброса.
  • НекоторыеВерсии ядра не могут создавать дампы с общим адресным пространством (потоки AKA).Более новые версии ядра могут создавать дамп таких процессов, но будут добавлять pid к имени файла.
  • Исполняемый файл может иметь нестандартный формат, не поддерживающий дампы ядра.Каждый исполняемый формат должен реализовывать подпрограмму дампа ядра.
  • Ошибка сегментации на самом деле может быть ядром. К сожалению, проверьте системные журналы на наличие сообщений Oops.
  • Приложение, которое называется exit() вместо использованияобработчик дампа памяти.
49 голосов
/ 12 октября 2011

Убедитесь, что ваш текущий каталог (во время сбоя - server может изменить каталоги) доступен для записи.Если сервер вызывает setuid, каталог должен быть доступен для записи этому пользователю.

Также отметьте /proc/sys/kernel/core_pattern.Это может перенаправить дампы ядра в другой каталог, и этот каталог должен быть доступен для записи.Подробнее здесь .

5 голосов
/ 25 августа 2013

Проверьте:

$ sysctl kernel.core_pattern

, чтобы увидеть, как создаются ваши дампы (% e будет именем процесса, а% t будет системным временем).

Если выUbuntu, ваши дампы создаются apport в /var/crash, но в другом формате (отредактируйте файл, чтобы увидеть его).

Вы можете проверить это:

sleep 10 &
killall -SIGSEGV sleep

Еслидамп ядра успешен, вы увидите «(дамп ядра)» после индикации ошибки сегментации.

Подробнее:

Как создать файл дампа ядра в Ubuntu


Ubuntu

Подробнее читайте по адресу:

https://wiki.ubuntu.com/Apport

4 голосов
/ 23 мая 2016

Помните, что если вы запускаете сервер из службы , он запустит другой сеанс bash, поэтому ulimit там не будет работать.Попробуйте поместить это в ваш скрипт :

ulimit -c unlimited
3 голосов
/ 14 сентября 2017

Для записи, на Debian 9 Stretch (systemd) мне пришлось установить пакет systemd-coredump.После этого дампы ядра были сгенерированы в папке /var/lib/systemd/coredump.

. Кроме того, эти coredumps сжимаются в формате lz4.Для распаковки вы можете использовать пакет liblz4-tool следующим образом: lz4 -d FILE.

Чтобы иметь возможность отлаживать распакованный coredump с помощью gdb, мне также пришлось переименовать очень длинное имя файла во что-то более короткое...

1 голос
/ 18 октября 2016

Если вы находитесь в дистрибутиве Linux (например, CentOS, Debian), то, пожалуй, самый доступный способ узнать об основных файлах и связанных с ними условиях - на странице руководства.Просто запустите следующую команду из терминала:

man 5 core
1 голос
/ 19 августа 2016

Если вы вызываете daemon () и затем демонизируете процесс, по умолчанию текущий рабочий каталог изменится на /. Так что, если ваша программа является демоном, вы должны искать ядро ​​в каталоге /, а не в каталоге бинарного.

1 голос
/ 30 июня 2016

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

Если ваш основной файл не создается по какой-либо причине, я рекомендую просмотреть / var / log / messages. Там может быть подсказка, почему основной файл не создается. В моем случае была строка с указанием первопричины:

Executable '/path/to/executable' doesn't belong to any package

Чтобы обойти эту проблему, отредактируйте /etc/abrt/abrt-action-save-package-data.conf и измените ProcessUnpackaged со значения «нет» на «да».

ProcessUnpackaged = yes

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

1 голос
/ 12 октября 2011

Кроме того, проверьте, достаточно ли места на диске на /var/core или там, где записываются дампы ядра.Если раздел заполнен почти полностью или используется диск на 100%, то это будет проблемой.Мои основные дампы в среднем занимают несколько гигабайт, поэтому вы должны быть уверены, что в разделе будет по крайней мере 5-10 гигабайт.

0 голосов
/ 01 ноября 2018

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

vim /etc/security/limits.conf

учетная запись мягкое ядро ​​без ограничений
счет жесткое ядро ​​без ограничений

затем, если вы входите в оболочку входа с помощью securecrt или другого:

выход , а затем повторный вход

...