Удаленный посмертный анализ coredump без наличия точных отладочных символов для общих системных библиотек

StackOverflow https://stackoverflow.com/questions/4329986

Вопрос

Как вы обычно решаете эту проблему?Представьте, что поток завершает работу внутри кода libc (который является системной общей библиотекой) на Computer1, а затем генерирует coredump.Но Компьютер2, на котором будет проанализирован этот coredump, может иметь другую версию libc.

Итак:

  1. Насколько важно иметь одну и ту же общую библиотеку на удаленном компьютере?Будет ли gdb корректно восстанавливать stacktrace, не имея точно такой же версии libc на Conputer2?

  2. Насколько важно иметь правильные символы отладки для libc?Будет ли gdb корректно восстанавливать stacktrace без наличия точно таких же символов отладки на Компьютере2?

  3. И каков "правильный" способ избежать этой проблемы несоответствия символов отладки для общих системных библиотек?Мне кажется, что нет единого решения, которое решало бы эту проблему элегантным способом?Может быть, кто-нибудь может поделиться своим опытом?

Это было полезно?

Решение

  1. Это зависит от обстоятельств.На некоторых процессорах, таких как x86_64, правильный разматывать дескрипторы необходимы для того, чтобы GDB правильно размотала стек.На такой машине анализ coredump с несоответствующим libc, скорее всего, приведет к полному мусору.

  2. Вам не нужны символы отладки для libc, чтобы получить трассировку стека.Вы не получите номера файлов и строк без символов отладки, но вы должны получить правильные имена функций (за исключением случаев, когда произошла вставка).

  3. Предпосылка вашего вопроса неверна - символы отладки не имеют к этому никакого отношения."Правильный" способ проанализировать coredump на C2, когда этот coredump был создан на C1, - это иметь копию библиотек C1 (например, в /tmp/C1/lib/...) и направьте GDB использовать эту копию вместо установленного C2 libc с

    (gdb) set solib-absolute-prefix /tmp/C1

команда.

Примечание:приведенная выше настройка должен вступит в силу до того, как вы загрузите ядро в GDB.Это:

gdb exe core
(gdb) set solib-absolute-prefix /tmp/C1

не будет работать (ядро считывается до вступления настройки в силу).

Вот правильный путь:

gdb exe
(gdb) set solib-absolute-prefix /tmp/C1
(gdb) core core

(Я пытался найти ссылку на это в Интернете, но не нашел).

Что такое дескрипторы размотки?

Дескрипторы размотки требуются, когда код компилируется без указателей на фреймы (по умолчанию для x86_64 в оптимизированном режиме).Такой код выполняет нет сохраните регистр %rbp, и поэтому GDB необходимо указать, как "отступить" от текущего фрейма к вызывающему фрейму (этот процесс также известен как разматывание стека).

Почему C1's libc.so не включен в ядро?

Основной файл обычно содержит только содержимое доступных для записи сегментов адресного пространства программы.Сегменты, доступные только для чтения (где находятся исполняемый код и дескрипторы unwind), обычно не нужны - вы можете просто прочитать их непосредственно с libc.so на диске.

За исключением того, что это не работает, когда вы анализируете ядро C1 на C2!

Некоторые (но не все) операционные системы позволяют настроить "полный дамп ядра", когда ОС также будет сбрасывать сопоставления, доступные только для чтения, именно для того, чтобы вы могли анализировать ядро на любом компьютере.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top