Основной дамп в Linux - PullRequest
       26

Основной дамп в Linux

13 голосов
/ 12 февраля 2010

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

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

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

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

Итак, у меня два вопроса:

  1. Как создать дамп ядра в сборке программы "release"?
  2. Всегда. Без ручного выполнения "ulimit -c unlimited"

Ответы [ 5 ]

11 голосов
/ 12 февраля 2010
  • Что касается ограничения ядра, вы можете сделать это самостоятельно в C, позвонив setrlimit.
  • В системе GNU (glibc) или BSD вы можете получить обратную трассировку, вызвав backtrace и связанные системные вызовы. Затем вам нужно будет преобразовать адреса функций в имена функций, запустив addr2line (или дублируя его функциональность).
  • Только не используйте -g, вы все равно можете получить обратную трассировку (за исключением того, что встроенные функции не появятся).
7 голосов
/ 12 февраля 2010

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

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

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

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

3 голосов
/ 12 февраля 2010

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

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

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

2 голосов
/ 12 февраля 2010
  1. В Linux не существует такой версии, как «релиз» и «отладка». Вы просто создаете программу с отладочной информацией, когда используете "-g". Вы можете лишить эту информацию.

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

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

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

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

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

  4. How to create a core dump in the "release" build of a program? Это не ваша ответственность, это ответственность ОС.

0 голосов
/ 12 февраля 2010

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

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

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

...