Эльфы, гномы и осьминоги: разбираем ELF и DWARF для трассировки Сeph
На тестовой программе всё выглядит почти неприлично просто: одна команда bpftrace, и вызов функции hello вместе с её аргументом уже на экране. А теперь попробуем проделать похожее с Ceph — например, измерить, сколько времени операция проводит в очереди OSD.
И тут начинаются дебри. Исполняемый файл ceph-osd с отладочной информацией весит 600 МБ, а без неё — всего 200 МБ. На практике обычно используют обрезанные бинарники. И даже если нужную функцию удалось найти по имени, до её аргументов и полей внутри C++-структур ещё предстоит добраться.
Без путешествия по адресам, регистрам и смещениям уже не обойтись.