Файл дампа не создается
каждый раз, когда мое приложение аварийно завершает работу, файл дампа ядра не генерируется. Я помню, что несколько дней назад, на другом сервере он был создается. Я запускаю приложение, используя экран в bash, как это:
#!/bin/bash
ulimit -c unlimited
while true; do ./server; done
Как вы можете видеть, я использую ulimit -c unlimited
что важно, если я хочу создать дамп ядра, но он все еще не генерирует его, когда я получил ошибку сегментации.
Как я могу заставить это работать?
12 ответов
убедитесь, что ваш текущий каталог (на момент аварии -server
может изменять каталоги) доступен для записи. Если сервер вызывает setuid
каталог должен быть доступен для записи этого пользователя.
также проверить /proc/sys/kernel/core_pattern
. Это может перенаправить основные дампы в другой каталог и это каталог должен быть доступен для записи. Подробнее здесь.
этой ссылке содержит хороший контрольный список, почему основные дампы не генерируются:
- ядро было бы больше, чем нынешний лимит.
- у вас нет необходимых разрешений для дампа ядра (каталога и файла). Обратите внимание, что основные дампы помещаются в текущий каталог процесса сброса, который может отличаться от родительского процесса.
- убедитесь, что файловая система доступна для записи и иметь достаточно свободного пространство.
- если подкаталог с именем core существует в рабочем каталоге, ядро не будет сброшено.
- если файл с именем core уже существует, но имеет несколько жестких ссылок, ядро не будет сбрасывать ядро.
- Проверьте разрешения на исполняемый файл, если исполняемый файл имеет SUID или sgid бит включен дампы памяти по умолчанию будет отключена. То же самое произойдет, если у вас есть разрешения на выполнение, но нет разрешений на чтение файла.
- убедитесь, что процесс не изменил рабочий каталог, ограничение размера ядра или флаг dumpable.
- некоторые версии ядра не могут сбрасывать процессы с общим адресным пространством (aka threads). Более новые версии ядра могут сбрасывать такие процессы, но будут добавлять pid к имени файла.
- исполняемый файл может быть в нестандартном формате не поддерживает дампы. Каждый исполняемый формат должен реализовывать процедуру дампа ядра.
- ошибка сегментации на самом деле может быть ядром Oops, проверьте системные журналы для любых сообщений Oops.
- приложение
exit()
вместо использования обработчика дампа ядра.
проверка:
$ sysctl kernel.core_pattern
чтобы увидеть, как создаются ваши дампы (%e будет именем процесса, а %t-системным временем).
если у вас Ubuntu, ваши дампы создаются apport
на /var/crash
, но в другом формате (отредактируйте файл, чтобы увидеть его).
вы можете проверить это:
sleep 10 &
killall -SIGSEGV sleep
если сброс ядра успешен, вы увидите "(Сброс ядра)" после индикации ошибки сегментации.
подробнее:
как для создания файла дампа ядра в Ubuntu
Ubuntu
пожалуйста, прочитайте больше по адресу:
помните, если вы начинаете сервер из сервиса, он начнет другой сеанс bash, поэтому ulimit не будет эффективным. Попробуйте поместить это в скрипт:
ulimit -c unlimited
для записи, на Debian 9 Stretch (systemd
), Мне пришлось установить пакет systemd-coredump
. После этого в папке /var/lib/systemd/coredump
.
кроме того, эти coredumps сжимаются в . Для распаковки можно использовать пакет liblz4-tool
такой: lz4 -d FILE
.
чтобы иметь возможность отлаживать распакованный coredump с помощью gdb
, мне также пришлось переименовать совершенно длинное имя файла во что-то более короткое...
кроме того, убедитесь, что у вас достаточно места на /var/core
или там, где ваши основные дампы записываются. Если раздел заполнен почти полностью или при использовании диска 100%, это будет проблемой. Мои основные дампы в среднем несколько концертов, поэтому вы должны быть уверены, что на разделе доступно хотя бы 5-10.
ответы здесь крышка довольно хорошо, большинство сценариев для которых дамп не создается. Однако, в моем случае, ничего из этого не применялось. Я публикую этот ответ как дополнение к другим ответам.
Если ваш основной файл не создается по какой-либо причине, я рекомендую посмотреть на /var/log/messages. Там может быть подсказка, почему основной файл не создается. В моем случае была строка, указывающая первопричину:
Executable '/path/to/executable' doesn't belong to any package
чтобы обойти эта проблема edit /etc/abrt/abrt-action-save-package-data.conf и изменение ProcessUnpackaged от " Нет " До "да".
ProcessUnpackaged = yes
этот параметр указывает, следует ли создать ядро для программ, не установленных с помощью диспетчера пакетов.
если он находится в дистрибутиве Linux (например, CentOS, Debian), то, возможно, самый доступный способ узнать о основных файлах и связанных с ними условиях находится на странице man. Просто запустите следующую команду с терминала:
man 5 core
хотя это не будет проблемой для человека, который задал вопрос, потому что они запустили программу, которая должна была создать основной файл в скрипте с командой ulimit, я хотел бы документировать, что команда ulimit специфична для оболочки, в которой Вы ее запускаете (например, переменные среды). Я потратил слишком много времени на запуск ulimit и sysctl и прочее в одной оболочке, а также команду, которую я хотел сбросить core в другой оболочке, и задавался вопросом, почему файл core не был произведенный.
Я добавлю его в свой bashrc. Sysctl работает для всех процессов после его выпуска, но ulimit работает только для оболочки, в которой он выпущен (возможно, также и для потомков), но не для других оболочек, которые случайно работают.
Примечание: Если вы сами написали какой-либо обработчик сбоев, ядро может не сгенерироваться. Так что ищите код в строку:
signal(SIGSEGV, <handler> );
таким образом, SIGSEGV будет обрабатываться обработчиком, и вы не получите дамп ядра.
Если вы называете daemon () и затем демонизировать процесс, по умолчанию текущий рабочий каталог изменится на /
. Поэтому, если ваша программа является демоном, вы должны искать ядро в /
каталог, а не в каталоге бинарных.
на всякий случай, если кто-то еще наткнется на это. Я запускал чей - то код-убедитесь, что они не обрабатывают сигнал, чтобы они могли изящно выйти. Я прокомментировал обращение и получил сброс ядра.