Я хочу создать дамп ядра каждый раз, когда мой процесс отказывает. В настоящее время я следую за этим подходом:
Но я хочу минимизировать количество шагов так, чтобы:
ulimit -c unlimited
"вручную.Таким образом, у меня есть два вопроса:
ulimit -c unlimited
"Обычным решением является сборка с помощью -g и удаление отладочной информации перед выпуском файла. Найдите команду "strip". Вы сохраняете файл с отладочной информацией и используете его для отладки дампов ядра, полученных от клиентов.
Если вы хотите распечатать удобочитаемую обратную трассировку на машине пользователя, вам необходимо распространить двоичные файлы с (некоторой) отладочной информацией. Ищите функцию 'backtrace ()' в glibc.
Обратите внимание, что дампы ядра будут созданы (если ulimit установлен соответствующим образом), даже если ваш двоичный файл не содержит отладочной информации.
Лучший способ обеспечить создание дампа ядра - это, вероятно, выполнить ваш двоичный файл из сценария, который устанавливает ulimit перед запуском двоичного файла.
Вы можете попробовать google-coredumper:
Аккуратный инструмент для создания читаемых GDB дампов ядра из многопоточных приложений - во время работы программы. Библиотека coredumper может быть скомпилирована в приложения для создания дампов ядра запущенной программы без ее завершения.
Обновлено
На самом деле я думаю, что должен сказать об одном возможном различии между отладочной и выпускной версиями, о котором я не упомянул в своем сообщении. Версии выпуска могут быть построены с определением NDEBUG, чтобы избавиться от всех assert ()
в программе. Напротив, отладочные версии должны создаваться без определения NDEBUG, поскольку assert ()
помогает в поиске ошибок.
Однако, если вы не используете assert ()
разницы не будет.
Пользователь может установить ulimit -c без ограничений в своем профиле.
Трассировка программы, скомпилированной с некоторой оптимизацией, часто не дает полезного номера строки.
Вы можете собрать версию с отладочной информацией и поместить в свой архив. Затем удалите его и доставьте удаленные двоичные файлы своим клиентам. Если клиент предоставляет вам основной файл, просто используйте версию с отладочной информацией и основной файл от клиента.
Как создать дамп ядра в «выпускной» сборке программы?
Это не ваша ответственность, это ответственность ОС.
Вы вряд ли получите приличный стек-трейс в человеческом виде, если код является релизным режимом/высоко оптимизированной версией. Используйте переключатель -g или вообще забудьте о стек-трейсе... вы не можете получить и то, и другое!!! Что возвращает нас к этому вопросу - звучит так, как будто вы ожидаете, что код будет падать даже в производственной среде?
Почему бы вам сначала не исправить код и убедиться, что он работает... код пахнет .... sniff sniff
Edit: Ok, возможно я показался немного резким в своем комментарии выше, я не собирался быть резким... для пользы читателей, я включил ссылку на другой вопрос, размещенный здесь, и в том ответе, который я дал, используются сигналы для создания стек-трейса и перенаправления в файл. Это будет полезно для вопроса ОП и поможет ему в устранении неполадок...
setrlimit
. backtrace
и связанные с ней системные вызовы. Затем вам нужно будет преобразовать адреса функций в имена функций, запустив addr2line
(или дублируя его функциональность). -g
, вы все равно можете получить обратную трассировку (за исключением того, что встроенные функции не появятся).