Дамп ядра в Linux
Я хочу создать дамп ядра, когда процесс завершает работу. В настоящее время я следую этому подходу:
- создайте специальную "отладочную" версию программы, используя "- g " gcc/g++.
- выполнить "ulimit-c unlimited"
- теперь мы получаем дамп памяти, когда программа падает.
но я хочу свести к минимуму количество шагов, чтобы:
- дамп ядра всегда должен создаваться. Даже если это сборка" release". Пользователя не следует просить выполнить команду"
ulimit -c unlimited
" вручную. - backtrace этого дампа ядра должен быть в состоянии дать файл, функцию, номер строки вызовов. Это трассировка стека в удобочитаемой форме.
- Я не хочу создавать программу как отладочную сборку с "-g". Или, по крайней мере, он не должен содержать никакой другой отладочной информации, которая не требуется для создания трассировки стека для чтения человеком. Потому что это будет релиз сборки программа.
Итак, у меня есть два вопроса:
- как создать дамп ядра в сборке "release" программы?
- всегда. Без ручного выполнения"
ulimit -c unlimited
"
5 ответов
обычным решением является сборка с помощью-g и удаление отладочной информации перед выпуском файла. Ищите команду 'strip'. Вы сохраняете файл с отладочной информацией и использовать ее для отладки дампов, которые вы получаете от клиентов.
Если вы хотите напечатать читаемый человеком backtrace на компьютере пользователей, вам нужно будет распространять двоичные файлы с (некоторой) отладочной информацией. Найдите функцию backtrace () в glibc.
обратите внимание, что будут созданы основные дампы (если ulimit устанавливается соответствующим образом), даже если ваш двоичный файл не содержит отладочной информации.
лучший способ обеспечить создание дампа ядра, вероятно, выполнить двоичный файл из скрипта, который устанавливает ulimit перед запуском двоичного файла.
- Что касается основного предела, вы можете сделать это самостоятельно в C, позвонив
setrlimit
. - в системе GNU (glibc) или BSD вы можете получить backtrace, вызвав
backtrace
и соответствующие системные вызовы. Затем вам нужно будет перевести адреса функций в имена функций, запустивaddr2line
(или дублировать его функциональность). - просто не использовать
-g
, вы все равно можете получить backtrace (за исключением того, что встроенные функции не будут казаться.)
вы можете попробовать google-coredumper:
Аккуратный инструмент для создания GDB читаемых coredumps из многопоточных приложений - во время работы программы. Библиотека coredumper может быть скомпилирована в приложения для создания основных дампов запущенной программы без завершения.
- нет такой вещи, как версия "release" и версия "debug" в Linux. Вы просто создаете программу с отладочной информацией при использовании "- g". Вы можете удалить эту информацию.
Обновлено
На самом деле я думаю, что должен сказать об одном возможном различии между версиями debug и release, которое я не упомянул в своем сообщении. Версии выпуска могут быть построены с помощью определения NDEBUG, чтобы избавиться от всех assert()
в программе. Отлаживать версии, наоборот, должны быть построены без определения NDEBUG как assert()
помогает в поиске багов.
однако если вы не используете assert()
разницы не будет никакой.
пользователь может установить ulimit-c unlimited в своем профиле.
Backtrace программы, скомпилированной с некоторой оптимизацией, часто не дает номера строки, который полезен.
вы можете создать версию с отладкой информацию и положите в свой архив. Затем разденьте его и доставьте разделенные двоичные файлы своим клиентам. Если клиент дает вам основной файл, просто используйте версию с отладочной информацией и основной файл от клиента.
How to create a core dump in the "release" build of a program?
это не ваша ответственность, это ответственность ОС.
вы вряд ли получите достойный stacktrace в человеческой форме, если код является режимом выпуска/высоко оптимизированной версией. Используйте переключатель-g или вообще забудьте о выполнении stacktrace...вы не можете иметь оба!! Что возвращает нас к этому моменту-похоже, вы ожидаете, что код рухнет даже в производственной среде???
Почему бы вам не исправить код и убедиться, что он работает первый...код воняет .... нюхать соплю
Edit: хорошо, я, возможно, столкнулся с немного суровым в моем комментарии выше, я не собирался быть суровым там...для удобства читателей я включил ссылку на другой вопрос, размещенный здесь, и в этом ответ я дал, использует сигналы для создания трассировки стека и перенаправления в файл. Это поможет в вопросе OP и поможет ему в устранении неполадок...