Я «решил» эту проблему двумя способами:
Я установил обработчик сигнала для 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" (который должен дать мне глобальные переменные)).