Минимальный дамп ядра (трассировка стека + только текущий кадр) - PullRequest
7 голосов
/ 12 января 2012

Могу ли я настроить, что входит в дамп ядра в Linux? Я хочу получить что-то вроде мини-дампов Windows (минимальная информация о кадре стека при сбое приложения). Я знаю, что вы можете установить максимальный размер для файлов ядра, используя ulimit, но это не позволяет мне контролировать то, что происходит внутри ядра (то есть нет никакой гарантии, что, если я установлю ограничение в 64 КБ, оно сбросит последние страницы в стопке, например).

Кроме того, я хотел бы установить это программным способом (из кода), если это возможно. Я посмотрел на файл /proc/PID/coredump_filter, упомянутый man core, но он кажется слишком грубым для моих целей.

Для обеспечения небольшого контекста: мне нужны крошечные файлы ядра по нескольким причинам: мне нужно собирать их по сети для многочисленных (тысяч) клиентов; Более того, это встроенные устройства с небольшими SD-картами и GPRS-модемы для сетевого подключения. Так что о чем-то выше ~ 200 КБ не может быть и речи.

РЕДАКТИРОВАТЬ: я работаю на встроенном устройстве под управлением Linux 2.6.24. Процессор PowerPC. К сожалению, в настоящее время powerpc-linux не поддерживается в breakpad, поэтому google breakpad не поддерживается

1 Ответ

6 голосов
/ 12 апреля 2013

Я «решил» эту проблему двумя способами:

Я установил обработчик сигнала для SIGSEGV и использовал backtrace / backtrace_symbols для распечатки трассировки стека.Я скомпилировал свой код с помощью -rdynamic, поэтому даже после удаления отладочной информации я по-прежнему получаю обратную трассировку со значимыми именами (при сохранении достаточно компактного исполняемого файла).
Я удалил отладочную информацию и поместил ее в отдельный файл, который ябудет хранить где-нибудь в безопасности, используя strip;оттуда я буду использовать add22line с информацией, сохраненной с обратной трассировки (адреса), чтобы понять, где произошла проблема.Таким образом, я должен хранить только несколько байтов. В качестве альтернативы я обнаружил, что могу использовать / proc / self / coredump_filter, чтобы не выгружать память (устанавливая ее содержимое в «0»): только информация о потоке и процедуре, регистры, stacktrace и т. д. сохраняются в ядре.См. Больше в этом ответе

Я все еще теряю информацию, которая может быть ценной (содержимое глобальной и локальной переменной, параметры ..).Я мог бы легко выяснить, какую страницу (ы) выгружать, но, к сожалению, нет способа указать «dump-these-pages» для обычных дампов ядра (если вы не хотите пойти и исправить функцию maydump() в ядре).

На данный момент я вполне доволен двумя решениями (это лучше, чем ничего ..) Мои следующие шаги будут:

  • посмотрим, насколько трудно будетпортировать Breakpad на powerpc-linux: уже есть powerpc-darwin и i386-linux, так что ... насколько это может быть сложно?:)
  • попробуйте использовать google-coredumper , чтобы создать дамп только нескольких страниц вокруг текущего ESP (который должен дать мне локальные параметры и параметры) и вокруг "& some_global" (который должен дать мне глобальные переменные)).
...