Дамп ядра в Linux

Я хочу создать дамп ядра каждый раз, когда мой процесс отказывает. В настоящее время я следую за этим подходом:

  1. Создайте специальную версию "отладки" программы с помощью "-g" gcc/g ++.
  2. Выполнитесь "ulimit-c неограниченный"
  3. Теперь мы получаем дамп ядра каждый раз, когда программа отказывает.

Но я хочу минимизировать количество шагов так, чтобы:

  • Дамп ядра должен всегда создаваться. Даже если это - сборка "выпуска". Пользователя нельзя попросить выполнить команду"ulimit -c unlimited"вручную.
  • След того дампа ядра должен смочь дать файл, функцию, номер строки вызовов. Это - отслеживание стека в человекочитаемой форме.
  • Я не хочу создавать программу как отладочная сборка с "-g". Или по крайней мере это не должно содержать никакую другую отладочную информацию, которая не требуется, чтобы производить человекочитаемое отслеживание стека. Поскольку это было бы сборкой конечных версий программы.

Таким образом, у меня есть два вопроса:

  1. Как создать дамп ядра в сборке "выпуска" программы?
  2. Всегда. Вручную не выполняясь"ulimit -c unlimited"
13
задан Peter Mortensen 3 December 2010 в 20:24
поделиться

5 ответов

Обычным решением является сборка с помощью -g и удаление отладочной информации перед выпуском файла. Найдите команду "strip". Вы сохраняете файл с отладочной информацией и используете его для отладки дампов ядра, полученных от клиентов.

Если вы хотите распечатать удобочитаемую обратную трассировку на машине пользователя, вам необходимо распространить двоичные файлы с (некоторой) отладочной информацией. Ищите функцию 'backtrace ()' в glibc.

Обратите внимание, что дампы ядра будут созданы (если ulimit установлен соответствующим образом), даже если ваш двоичный файл не содержит отладочной информации.

Лучший способ обеспечить создание дампа ядра - это, вероятно, выполнить ваш двоичный файл из сценария, который устанавливает ulimit перед запуском двоичного файла.

7
ответ дан 1 December 2019 в 22:57
поделиться

Вы можете попробовать google-coredumper:

Аккуратный инструмент для создания читаемых GDB дампов ядра из многопоточных приложений - во время работы программы. Библиотека coredumper может быть скомпилирована в приложения для создания дампов ядра запущенной программы без ее завершения.

http://sourceforge.net/projects/goog-coredumper/

3
ответ дан 1 December 2019 в 22:57
поделиться
  1. В Linux не существует таких понятий, как «выпускная» версия и «отладочная» версия. Вы просто создаете программу с отладочной информацией, используя "-g". Вы можете удалить эту информацию.

Обновлено
На самом деле я думаю, что должен сказать об одном возможном различии между отладочной и выпускной версиями, о котором я не упомянул в своем сообщении. Версии выпуска могут быть построены с определением NDEBUG, чтобы избавиться от всех assert () в программе. Напротив, отладочные версии должны создаваться без определения NDEBUG, поскольку assert () помогает в поиске ошибок.

Однако, если вы не используете assert () разницы не будет.

  1. Пользователь может установить ulimit -c без ограничений в своем профиле.

  2. Трассировка программы, скомпилированной с некоторой оптимизацией, часто не дает полезного номера строки.

  3. Вы можете собрать версию с отладочной информацией и поместить в свой архив. Затем удалите его и доставьте удаленные двоичные файлы своим клиентам. Если клиент предоставляет вам основной файл, просто используйте версию с отладочной информацией и основной файл от клиента.

  4. Как создать дамп ядра в «выпускной» сборке программы? Это не ваша ответственность, это ответственность ОС.

2
ответ дан 1 December 2019 в 22:57
поделиться

Вы вряд ли получите приличный стек-трейс в человеческом виде, если код является релизным режимом/высоко оптимизированной версией. Используйте переключатель -g или вообще забудьте о стек-трейсе... вы не можете получить и то, и другое!!! Что возвращает нас к этому вопросу - звучит так, как будто вы ожидаете, что код будет падать даже в производственной среде?

Почему бы вам сначала не исправить код и убедиться, что он работает... код пахнет .... sniff sniff

Edit: Ok, возможно я показался немного резким в своем комментарии выше, я не собирался быть резким... для пользы читателей, я включил ссылку на другой вопрос, размещенный здесь, и в том ответе, который я дал, используются сигналы для создания стек-трейса и перенаправления в файл. Это будет полезно для вопроса ОП и поможет ему в устранении неполадок...

-3
ответ дан 1 December 2019 в 22:57
поделиться
  • Что касается ограничения ядра, вы можете сделать это самостоятельно на C, вызвав setrlimit .
  • В системе GNU (glibc) или BSD вы можете получить обратную трассировку, вызвав backtrace и связанные с ней системные вызовы. Затем вам нужно будет преобразовать адреса функций в имена функций, запустив addr2line (или дублируя его функциональность).
  • Просто не используйте -g , вы все равно можете получить обратную трассировку (за исключением того, что встроенные функции не появятся).
11
ответ дан 1 December 2019 в 22:57
поделиться